2011-09-23 26 views
7

Tôi đang đọc sách Structure and Interpretation of Computer Programs và tôi muốn mã hóa một thông dịch viên chương trình dần dần.Tôi muốn thực hiện một thông dịch viên chương trình để nghiên cứu SICP

Bạn có biết việc triển khai sơ đồ dễ đọc nhất (và ngắn) không? Tôi sẽ làm cho một JavaScript trong C.

+1

Sau khi đọc SICP, có vẻ như tôi muốn viết thêm thông dịch viên của bạn trong Đề án (hoặc một số phương ngữ Lisp khác - Tôi thích Clojure) và thực hiện một số bài tập. trong C. – mwd

+2

Bạn sẽ tham gia SICP bao xa? Bạn sẽ viết một trình thông dịch Scheme (thực sự nhiều hơn một) và một trình biên dịch trong quá trình đọc chương 4 và 5. Nếu bạn hoàn thành cuốn sách, bạn sẽ tìm thấy những gì bạn tìm kiếm: trình thông dịch metacircular (Scheme in Scheme) ngắn. – spacemanaki

Trả lời

7

SICP bản thân đã nhiều phần chi tiết làm thế nào để xây dựng một thông dịch viên meta-tròn, nhưng tôi sẽ đề nghị bạn hãy xem hai cuốn sách sau đây cho nguồn lực tốt hơn về dịch viên Đề án: Programming Languages: Application and InterpretationEssentials of Programming Languages. Cả hai đều dễ đọc và dần dần hướng dẫn bạn thông qua việc xây dựng thông dịch viên.

4

Sách của Christian Queinnec Lisp In Small Pieces là tuyệt vời. Hiện đại hơn là EoPL. Bao gồm cả Lisp và Scheme, và đi vào chi tiết về những thứ gory cấp thấp mà hầu hết các sách đều bỏ qua.

+0

Nó cũng không phù hợp với người mới bắt đầu. – leppie

1

Tôi khuyên bạn nên đọc luận án của Kent Dybvig "Three Implementation Models for Scheme". Không phải toàn bộ luận án, nhưng phần đầu tiên (lên đến chương 3), nơi ông thảo luận về Mô hình dựa trên Heap là rất thích hợp cho việc thực hiện ngây thơ của Đề án.

Tài nguyên tuyệt vời khác (nếu tôi hiểu chính xác và bạn muốn triển khai nó trong C) là Nils Holm's "Scheme 9 from Empty Space". Liên kết này là trang của Nils và có liên kết ở dưới cùng với miền cũ, miền công cộng, ấn bản của cuốn sách và phiên bản mới hơn, dễ đọc hơn, thương mại. Đọc cả hai và yêu thương chúng.

3

Tôi muốn giới thiệu loạt blog của Scheme from scratch mà từng bước xây dựng một thông dịch viên chương trình trong C.

0

tôi có thể cung cấp cho bạn một cái nhìn tổng quan về thông dịch viên của tôi làm việc như thế nào, có lẽ nó có thể cung cấp cho bạn một ý tưởng về những điều nói chung. Mặc dù câu trả lời là khá muộn, tôi hy vọng điều này có thể giúp người khác, những người đã đến chủ đề này và muốn có một ý tưởng chung.

  1. Đối với mỗi dòng của lược đồ được nhập, một đối tượng Lệnh được tạo. Nếu lệnh là một phần thì mức tổ của nó được lưu trữ (số dấu ngoặc vuông còn lại để hoàn thành biểu thức). Nếu lệnh hoàn thành một đối tượng biểu thức được tạo ra và các bộ đánh giá được kích hoạt trên đối tượng này.
  2. Có 4 loại lớp học đánh giá xác định, mỗi xuất phát từ Evaluator lớp cơ sở

a) Define_Evaluator: cho xác định báo cáo

b) Funcall_Evaluator: để xử lý hàm do người dùng định nghĩa khác

c) Read_Evaluator: để đọc biểu thức và chuyển đổi nó thành đối tượng lược đồ

d) Print_Evaluator: in đối tượng tùy thuộc vào loại đối tượng.

e) Eval_Evaluator: thực hiện quá trình xử lý thực tế của biểu thức.

3 .-> Đầu tiên mỗi biểu thức được đọc bằng Trình đánh giá đã đọc sẽ tạo đối tượng lược đồ trong biểu thức. Biểu thức lồng nhau được tính toán đệ quy cho đến khi biểu thức hoàn tất.

-> Tiếp theo, Eval_Evaluator được kích hoạt để xử lý đối tượng biểu thức lược đồ được tạo trong bước đầu tiên. điều này xảy ra như vậy

a) nếu biểu thức được đánh giá là biểu tượng. Trả về giá trị của nó. Do đó, biến số blk sẽ trả về đối tượng cho khối đó.

b) nếu biểu thức được đánh giá là danh sách. In danh sách.

c) nếu biểu thức được đánh giá là hàm. Tìm định nghĩa của hàm sẽ trả về đánh giá bằng cách sử dụng Funcall_Evaluator.

-> Cuối cùng bộ đánh giá in được kích hoạt để in kết quả, bản in này sẽ phụ thuộc vào loại biểu thức đầu ra.

Disclaimer: Đây là cách thông dịch viên của tôi làm việc, doesnt phải như vậy.

0

Tôi đã ở trên một nhiệm vụ tương tự nhưng vài năm sau đó, khuyến nghị: chương trình

Tôi vẫn đang tìm kiếm các bài đăng trên blog tốt về cách tạo máy ảo/lược đồ, có thể được kết hợp với JIT (quan trọng cho bất kỳ triển khai JS cạnh tranh nào :).

Các vấn đề liên quan