Tôi thấy mình gắn liền với một dự án để tích hợp một thông dịch viên vào một ứng dụng hiện có. Ngôn ngữ được hiểu là một dẫn xuất của Lisp, với các nội trang ứng dụng cụ thể. Cá nhân 'chương trình' sẽ được chạy theo lô theo phong cách trong ứng dụng.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++
Tôi ngạc nhiên rằng trong những năm qua tôi đã viết một vài trình biên dịch và một số trình dịch/trình phân tích ngôn ngữ dữ liệu, nhưng trước đây tôi chưa bao giờ viết một thông dịch viên. Các mẫu thử nghiệm là khá xa cùng, thực hiện như là một walker cây cú pháp, trong C + +. Tôi có thể có thể ảnh hưởng đến kiến trúc ngoài nguyên mẫu, nhưng không ảnh hưởng đến ngôn ngữ thực hiện (C++). Vì vậy, những hạn chế:
- thi sẽ nằm trong C++
- phân tích cú pháp có thể sẽ bị xử lý với một yacc/bò rừng bizon ngữ pháp (bây giờ)
- gợi ý của toàn hệ sinh thái VM/Interpreter như NekoVM và LLVM có lẽ không thực tế cho dự án này. Khép kín là tốt hơn, ngay cả khi điều này nghe có vẻ như NIH.
Điều tôi thực sự tìm kiếm là đọc tài liệu về nguyên tắc cơ bản của việc triển khai phiên dịch. Tôi đã thực hiện một số lượt duyệt SO và một trang web khác được gọi là Lambda the Ultimate, mặc dù chúng được định hướng nhiều hơn về lý thuyết ngôn ngữ lập trình.
Một số mẩu tin tôi đã thu thập được cho đến nay:
Lisp in Small Pieces, Christian Queinnec. Người đề xuất nó nói rằng nó "đi từ trình thông dịch tầm thường đến các kỹ thuật nâng cao và kết thúc trình bày các trình biên dịch bytecode và" Scheme to C '. "
NekoVM. Như tôi đã đề cập ở trên, tôi nghi ngờ rằng chúng tôi sẽ được phép kết hợp toàn bộ khung công tác VM để hỗ trợ dự án này.
Structure and Interpretation of Computer Programs. Ban đầu tôi đề nghị rằng điều này có thể là quá mức cần thiết, nhưng đã làm việc thông qua một đoạn khỏe mạnh, tôi đồng ý với @JBF. Rất thông tin và mở rộng tâm trí.
On Lisp bởi Paul Graham. Tôi đã đọc điều này, và trong khi nó là một giới thiệu thông tin về các nguyên tắc Lisp, thì không đủ để bắt đầu xây dựng một thông dịch viên.
Parrot Implementation. Điều này có vẻ như một niềm vui đọc. Không chắc chắn nó sẽ cung cấp cho tôi với các nguyên tắc cơ bản.
Scheme from Scratch. Peter Michaux đang tấn công các cách triển khai khác nhau của Scheme, từ một trình thông dịch Scheme nhanh chóng và bẩn được viết bằng C (để sử dụng như một bootstrap trong các dự án sau này) để biên dịch mã Scheme. Rất thú vị cho đến nay.
Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages, được đề xuất trong chuỗi nhận xét cho Books On Creating Interpreted Languages. Cuốn sách chứa hai chương dành cho việc thực hành phiên dịch, vì vậy tôi sẽ thêm nó vào hàng đợi đọc của mình.
- New (và chưa Cũ, ví dụ: 1979): Writing Interactive Compilers and Interpreters bởi P. J. Brown. Điều này là không còn in ấn nữa, nhưng thú vị trong việc cung cấp một phác thảo về các nhiệm vụ khác nhau liên quan đến việc thực hiện một thông dịch viên cơ bản.Tôi đã nhìn thấy đánh giá hỗn hợp cho điều này nhưng vì nó là giá rẻ (tôi có nó theo thứ tự được sử dụng cho khoảng $ 3,50) Tôi sẽ cung cấp cho nó một spin.
Vậy còn cách nào? Có một cuốn sách tốt mà phải mất neophyte bằng tay và cho thấy làm thế nào để xây dựng một thông dịch viên trong C/C + + cho một ngôn ngữ giống như Lisp? Bạn có sở thích cho người đi bộ cú pháp-cây hoặc thông dịch viên bytecode không?
Để trả lời @JBF:
nguyên mẫu hiện nay là một thông dịch viên, và nó có ý nghĩa với tôi như chúng ta chấp nhận một đường dẫn đến một tập tin mã độc đoán và thực hiện nó trong môi trường ứng dụng của chúng tôi. Các nội trang được sử dụng để ảnh hưởng đến biểu diễn dữ liệu trong bộ nhớ của chúng tôi.
không được làm chậm quá mức. Cây đi bộ hiện tại có vẻ chấp nhận được.
Ngôn ngữ là dựa trên trên Lisp, nhưng không phải là Lisp, vì vậy không yêu cầu tuân thủ tiêu chuẩn.
- Như đã đề cập ở trên, có khả năng chúng tôi sẽ không được phép thêm dự án VM/thông dịch viên bên ngoài đầy đủ để giải quyết vấn đề này.
Với các áp phích khác, tôi cũng sẽ kiểm tra các trích dẫn của bạn. Cảm ơn tất cả!
Đã thêm cho đầy đủ. Câu hỏi về Canonical http://stackoverflow.com/questions/1669/learning-to-write-a-compiler. Có tiêu đề của một trong đó nói "trình biên dịch" nhưng những điều cơ bản là như nhau cho phiên dịch. – dmckee