2009-12-18 3 views
14

나는 Ruby에서 다음 프로젝트로 작은 인터프리터를 작성하기로 결정했습니다. 성공을 위해 필요한 지식/기술은 무엇입니까?
아직 해석 할 언어를 결정하지는 않았지만 장난감 언어가 아닌 뭔가를 찾고 있는데 통역사를 작성하기가 상대적으로 쉽습니다. 미리 감사드립니다. 통역관 작성 방법은 무엇입니까?

+0

huh? 언어를 결정하지 않으면 어떻게 알 수 있습니까? 라이브러리를 사용하더라도 해석하기가 아주 간단 할 수도 있습니다 ... –

+0

나는 Lisp에서 Ruby 인터프리터를 쓰는 것이 훨씬 쉽다고 생각합니다. – Svante

+0

Svante, 나는 그렇게 확신하지 않습니다. –

답변

29

당신은 배워야 할 것입니다 적어도 :

  • 어휘 분석 데이터의 프로그램 구조를 나타내는 구문 분석
  • (그룹화 구조로 함께 토큰)
  • 추상 구문 트리 ((토큰에 문자를 그룹화) 구조)
  • 데이터 표현 (언어에 변수가 있다고 가정)
  • 프로그램을 실행하는 평가 루프

일부 주제에 대한 훌륭한 소개는 소개 문구 Structure and Interpretation of Computer Programs에서 찾을 수 있습니다. 이 책에서 사용 된 언어는 첫 번째 인터프리터 구현에 이상적이며 강력하고 잘 지정된 언어 인 Scheme입니다. 추천.

+0

위대한 답변을 주셔서 감사합니다. 단지 궁금해서, 간단한 통역사를 완성하는데 얼마나 걸릴 것이라고 생각하십니까? – bennybdbc

+2

그 질문에 대한 답은 많은 요소들에 달려 있는데, 가장 중요한 것은 (a) 구현하는 사람의 경험 수준, (b) 해석 ​​할 언어의 선택. 또한 아마도 (c) 구현 언어의 선택. 총체적인 대략적인 추측으로, 기술을 배우는 중급 프로그래머에게는 2 주간의 헌신적 인 연구가 필요할 수 있습니다. –

1

너무 열심히하지 않습니다. 여기에 LISP interpreter in ruby이고 소스가 너무 작아서 복사/붙여 넣기를해야합니다. LISP를 지금 배울 건가요? hehe.

5

은 아직 해석하는 언어에 결정하지 않은,하지만 난 장난감 언어가 아닙니다 뭔가를 찾고 있어요,하지만에 대한 통역을 쓸 상대적으로 쉬울 것이다. 미리 감사드립니다.

Scheme 또는 Clojure와 같은 Lisp의 방언을 사용해보십시오. (이제 Clojure와 Ruby를 통합 한 Clojure-in-Ruby가 Clojure와 Java에서 함께 사용됩니다.)

Lisp을 사용하면 Lisp의 구문이 훨씬 더 가깝기 때문에 구문의 특이성을 고집하지 않아도됩니다. 추상 구문 트리

+1

Clorure는 스쿠비 두 (Scooby Doo)와 같은 언어로 들립니다. – FMc

+0

완료되었습니다 http://www.springerlink.com/content/q3n77q7172831288/ 및 http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –

2

This SICP chapter은 Lisp (메타 문자 평가 기)에서 Lisp 인터프리터를 작성하는 방법을 보여줍니다. 제 의견으로는 이것이 가장 좋은 곳입니다. 그런 다음 Lisp in Small Pieces으로 이동하여 Lisp 용 고급 인터프리터와 컴파일러를 작성하는 방법을 배울 수 있습니다. Lisp과 같은 언어를 구현하면 (Lisp 자체에서) 어휘 분석기, 구문 분석기, AST, 데이터/프로그램 표현 및 REPL을 무료로 얻을 수 있다는 장점이 있습니다. 당신은 당신의 훌륭한 언어를 작동시키는 데 집중할 수 있습니다!

2

을 체크 아웃 할 수 있습니다 위해 나무 위에 프로젝트 느릅 나무가 도움이 될 수있다. 구문이 매우 간단하고 언어가 조작하는 데이터 구조가 코드가 작성된 구조와 동일하므로 LISP를 구현하는 것이 가장 쉽습니다. 따라서 최소한의 구현 만하면되며 나머지는 그 자체.

그러나 구문 분석에 대해 배우려는 경우 추상 구문 트리 등으로보다 복잡한 언어를 사용하고자 할 수 있습니다.

Java (사실상 이틀이 지난) Java 구현을 확인하려면 mylisp.googlecode.com을 확인하십시오. 나는 여전히 그것에 대해 연구 중이다. 그러나 기존의 것들을 작동시키는 데 얼마나 짧은 시간이 걸렸는 지 믿을 수 없다.

1

당신이 당신 자신, 간단한 언어를 구성하고 단지 그것을 시도, 재미를 위해이 일을하는 경우. 내 추천은 정말 간단한 클래식 BASIC (비주얼 베이직이나 객체 지향적 인 것)이 아닌 것입니다. 줄 번호, GOTO, INPUT 및 PRINT를 사용하면됩니다. 당신은 기본을 다룰 수 있고, 어떻게 일을하는지 더 잘 이해할 수 있습니다.

지식이 필요하십니까?

  • 토큰 화
  • 파싱 ('말'로 그것을 분할 효율적으로,보다 효율적으로 읽을 수있는 무언가로 문자의 거대한 덩어리를 회전) (토큰을 통해 가고 그것에서 데이터 구조 구축)
  • 해석을 (데이터 구조를 반복하고 각 명령을 실행)

그리고 마지막으로 변수를 유지할 방법이 필요합니다. 보통은 "스택"을 구현할 것입니다. 하나의 거대한 데이터 블록은 마지막에 영역을 표시 할 수 있습니다.

1

그것은 리스프에 구현되지 ,하지만 (I 48 시간 후 마무리 근처에 어디하지 않았지만, YMMV) 나는 하스켈 함께 시작하는 동안 나는 매우 유용한 문서로 Write Yourself A Scheme in 48 Hours을 발견했다. 또한 통역사에 대한 많은 통찰력을 제공합니다.