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?
Trả lời
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.
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
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. –
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.
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.
Clorure âm thanh như một ngôn ngữ Scooby Doo sẽ đào. – FMc
Nó đã được thực hiện http://www.springerlink.com/content/q3n77q7172831288/ và http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –
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!
Có Tree dự án đầu Mà có thể hữu ích cho bạn http://treetop.rubyforge.org/
Bạn có thể kiểm của Ruby Dự thảo Thông số kỹ thuật http://ruby-std.netlab.jp/
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.
Tôi có thể giới thiệu sách này. Nó bàn về mô hình viết phân tích cú pháp và thông dịch viên và nhiều hơn nữa:
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.
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.
- 1. Làm thế nào để gọi một thông dịch viên elisp tương tác trong Emacs?
- 2. Làm thế nào để nhúng một thông dịch viên Python trên một trang web
- 3. Làm thế nào để nhúng một thông dịch viên lisp phổ biến vào một ứng dụng gui
- 4. JIT vs Thông dịch viên
- 5. Ngôn ngữ lập trình thực sự nào dễ viết các thông dịch viên?
- 6. Chương trình/trình biên dịch/thông dịch viên thực sự hoạt động như thế nào?
- 7. Vapourise Predef.any2stringadd trong thông dịch viên
- 8. Thông dịch viên Brainfuck ở Nimrod
- 9. Làm thế nào để viết một thông số cho một trang web
- 10. Làm cách nào để cập nhật thông dịch viên Ruby với RVM?
- 11. Làm thế nào để chuyển đổi/dịch thông tin?
- 12. Thông dịch viên Erlang: Vi chế độ
- 13. Có thông dịch viên cho C không?
- 14. Làm thế nào để viết một ứng dụng WinForms lớn?
- 15. Cách viết mã Scala 2.9 sẽ cho phép rơi vào thông dịch viên
- 16. Thông dịch viên dựa trên Prolog
- 17. Thông dịch viên PostScript mã nguồn mở
- 18. Thông dịch viên Lua trên Iphone
- 19. Có một thông dịch viên cải tiến cho OCaml không?
- 20. làm thế nào để viết trở Haskell
- 21. đặt ipython làm thông dịch viên cho pydev
- 22. Bạn muốn tìm thông dịch viên ruby nào?
- 23. Làm thế nào để viết một X86_64 _assembler_?
- 24. Làm thế nào để đổi tên một viên đá quý?
- 25. Tài liệu tham khảo Cần thiết để thực hiện một thông dịch viên trong C/C++
- 26. Trong Python thông dịch viên, trở lại mà không cần ""
- 27. Môi trường, IDE hoặc thông dịch viên nào để đưa vào thực tiễn Đề án?
- 28. Làm thế nào để lưu con trỏ vào thành viên trong thời gian biên dịch?
- 29. Làm thế nào để viết vòng lặp trong một Makefile?
- 30. Node.js - làm thế nào để viết một mảng nộp
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 ... –
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
Svante, tôi không chắc lắm về điều đó. –