2009-12-18 30 views
14

Tôi đã quyết định viết một thông dịch viên nhỏ làm dự án tiếp theo của mình, trong Ruby. Tôi cần những kiến ​​thức/kỹ năng gì để thành công?
Tôi chưa quyết định ngôn ngữ để giải thích, nhưng tôi đang tìm thứ gì đó không phải là ngôn ngữ đồ chơi, nhưng sẽ tương đối dễ viết một thông dịch viên. Cảm ơn trước.Làm thế nào để viết một thông dịch viên?

+0

huh? Nếu không quyết định ngôn ngữ, làm thế nào bạn có thể biết? Một số có thể rất đơn giản để giải thích, thậm chí sử dụng thư viện ... –

+0

Tôi nghĩ rằng việc viết một trình thông dịch Ruby trong Lisp dễ dàng hơn nhiều so với ngược lại. – Svante

+0

Svante, tôi không chắc lắm về điều đó. –

Trả lời

29

Bạn sẽ phải học ít nhất:

  • phân tích từ vựng (nhóm ký tự vào tokens)
  • phân tích cú pháp (nhóm mã thông báo lại với nhau thành cấu trúc)
  • cây cú pháp trừu tượng (đại diện cho cấu trúc chương trình trong một dữ liệu cấu trúc)
  • trình bày dữ liệu (giả sử ngôn ngữ của bạn sẽ có biến)
  • vòng đánh giá "chạy" chương trình của bạn

Giới thiệu tuyệt vời về một số chủ đề này có thể được tìm thấy trong văn bản giới thiệu Structure and Interpretation of Computer Programs. Ngôn ngữ được sử dụng trong cuốn sách đó là Scheme, một ngôn ngữ mạnh mẽ, được xác định rõ, lý tưởng cho việc thực hiện phiên dịch đầu tiên của bạn. Rat khuyen khich.

+0

Cảm ơn câu trả lời tuyệt vời. Chỉ cần tò mò, bạn nghĩ nó sẽ mất bao lâu để hoàn thành một thông dịch viên làm việc đơn giản? – bennybdbc

+2

Câu trả lời cho câu hỏi đó phụ thuộc vào nhiều yếu tố, quan trọng nhất là: (a) cấp độ kinh nghiệm của người thực hiện việc thực hiện, và (b) lựa chọn ngôn ngữ để diễn giải. Cũng có lẽ (c) lựa chọn ngôn ngữ thực hiện. Như một dự đoán thô, cho một lập trình viên trung gian học các kỹ thuật, tôi có thể nói một vài tuần làm việc chuyên dụng. –

1

Nó không quá khó. đây là một số LISP interpreter in ruby và nguồn quá nhỏ bạn phải sao chép/dán nó. nhưng bạn sẽ học LISP ngay bây giờ? hehe.

5

tôi đã không quyết định chọn ngôn ngữ để giải thích, nhưng tôi đang tìm kiếm cái gì đó không phải là một ngôn ngữ đồ chơi, nhưng sẽ là tương đối dễ dàng để viết một thông dịch viên cho. Cảm ơn trước.

Hãy thử một số phương ngữ của Lisp như Đề án hoặc Clojure. (Bây giờ có một ý tưởng: Clojure-in-Ruby, mà tích hợp với Ruby cũng như Clojure làm với Java.)

Với Lisp, không cần phải bận tâm với idiosyncracies cú pháp, như cú pháp của Lisp là gần gũi hơn với cây cú pháp trừu tượng.

+1

Clorure âm thanh như một ngôn ngữ Scooby Doo sẽ đào. – FMc

+0

Nó đã được thực hiện http://www.springerlink.com/content/q3n77q7172831288/ và http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –

2

This SICP chapter cho biết cách viết một trình thông dịch Lisp trong Lisp (một bộ đánh giá metacircular). Theo tôi, đây là nơi tốt nhất để bắt đầu. Sau đó, bạn có thể chuyển sang Lisp in Small Pieces để tìm hiểu cách viết trình thông dịch và trình biên dịch nâng cao cho Lisp. Lợi thế của việc thực hiện một ngôn ngữ như Lisp (trong bản thân Lisp!) Là bạn có được trình phân tích từ vựng, trình phân tích cú pháp, AST, đại diện dữ liệu/chương trình và REPL miễn phí. Bạn có thể tập trung vào nhiệm vụ làm cho ngôn ngữ tuyệt vời của bạn hoạt động!

2

Tôi đã có một ý tưởng tương tự một vài ngày trước đây. LISP là dễ nhất để thực hiện bởi vì cú pháp rất đơn giản, và các cấu trúc dữ liệu mà ngôn ngữ thao tác là các cấu trúc giống như mã được viết. Do đó bạn chỉ cần thực hiện tối thiểu và có thể xác định phần còn lại về mặt chinh no.

Tuy nhiên, nếu bạn đang cố gắng tìm hiểu về phân tích cú pháp, bạn có thể muốn làm một ngôn ngữ phức tạp hơn với Abstract Syntax Trees, v.v.

Nếu bạn muốn kiểm tra triển khai thực hiện Java của tôi (theo nghĩa đen hai ngày), hãy xem mylisp.googlecode.com. Tôi vẫn đang làm việc trên nó, nhưng nó là đáng kinh ngạc như thế nào một thời gian ngắn nó đã để có được những thứ hiện đang làm việc.

1

Nếu bạn chỉ làm điều này cho vui, tạo nên, ngôn ngữ đơn giản của riêng bạn và chỉ cần thử nó. Đề xuất của tôi sẽ giống như BASIC cổ điển thực sự đơn giản (không có nội dung cơ bản hoặc đối tượng trực quan). Với số dòng, GOTO, INPUT và PRINT và đó là nó. Bạn có thể làm những điều cơ bản, và bạn sẽ hiểu rõ hơn về cách mọi thứ hoạt động.

Kiến thức bạn cần?

  • tokenizing (quay mà thật khổng lồ các nhân vật vào một cái gì đó một cách hiệu quả dễ đọc hơn, hiệu quả tách nó ra thành 'từ')
  • Parsing (đi qua các thẻ và xây dựng một cấu trúc dữ liệu từ nó)
  • Giải thích (lặp qua cấu trúc dữ liệu và thực thi từng lệnh)

Và điều cuối cùng bạn cũng cần có cách để giữ các biến xung quanh. Thông thường, bạn chỉ cần triển khai "ngăn xếp", một khối dữ liệu khổng lồ, nơi bạn có thể đánh dấu một khu vực ở cuối.

1

Nó không thực hiện trong Lisp, nhưng tôi thấy Write Yourself A Scheme in 48 Hours là một tài liệu rất hữu ích trong khi tôi đã bắt đầu với Haskell (mặc dù tôi đã không nhận được bất cứ nơi nào gần kết thúc nó sau 48 giờ; YMMV). Nó cũng cung cấp cho bạn rất nhiều cái nhìn sâu sắc vào phiên dịch nói chung.

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