2009-07-30 38 views
5

Trong nỗ lực liên tục của tôi để làm dịu cơn khát bất ngờ của tôi để có thêm kiến ​​thức lập trình, tôi đã đưa ra ý tưởng cố gắng viết một ngôn ngữ lập trình đơn giản (ít nhất là bây giờ) biên dịch thành bytecode. Vấn đề là tôi không biết điều đầu tiên về thiết kế ngôn ngữ. Có ai có lời khuyên nào về phương pháp xây dựng trình phân tích cú pháp và các tính năng cơ bản mà mọi ngôn ngữ nên có không? Bạn sẽ giới thiệu bài đọc nào cho thiết kế ngôn ngữ? Tôi nên chụp ở mức độ cao như thế nào? Là nó không thực tế để hy vọng sẽ có thể bao gồm một tính năng để cho phép một inline bytecode trong một cách tương tự như gcc cho phép lắp ráp nội tuyến? Thấy tôi chủ yếu là mã trong C và Java mà sẽ tốt hơn cho trình biên dịch bằng văn bản?Phương pháp thiết kế ngôn ngữ lập trình đơn giản

+0

Ngắt http://stackoverflow.com/questions/479013/requirements-for-compiler-design/479048 trong số nhiều người khác. Ngoài ra, bạn đang đặt quá nhiều câu hỏi - mỗi lần một câu hỏi là một quy tắc tốt. –

+1

Và http://stackoverflow.com/questions/1669/learning-to-write-a-compiler này là câu trả lời cuối cùng của SO về lĩnh vực chủ đề. –

+0

ok Tôi xin lỗi vì tôi không thấy nó trùng lặp nên nó chỉ bị đóng là trùng lặp hoặc tôi có nên xóa câu hỏi không? –

Trả lời

3

Có rất nhiều cách ...

Bạn có thể xem các ngôn ngữ xếp chồng và Forth. Nó không phải là rất hữu ích khi nói đến thiết kế các ngôn ngữ khác, nhưng nó là cái gì đó có thể được thực hiện rất nhanh chóng.

Bạn có thể xem các ngôn ngữ chức năng. Hầu hết chúng dựa trên một vài khái niệm đơn giản và có phân tích cú pháp đơn giản. Và, tuy nhiên, chúng rất mạnh mẽ.

Và, sau đó là các ngôn ngữ truyền thống. Họ là những người khó nhất. Bạn sẽ cần phải tìm hiểu về phân tích từ vựng, phân tích cú pháp, ngữ pháp LALR, LL ngữ pháp, EBNF và các ngôn ngữ thông thường chỉ để vượt qua quá trình phân tích cú pháp.

Nhắm mục tiêu một bytecode không chỉ là ý tưởng hay - làm khác đi là điên rồ, và chủ yếu là vô dụng, trong một bài tập học tập.

Tự làm ơn, tìm sách và hướng dẫn về trình biên dịch.

Hoặc là C hoặc Java sẽ thực hiện. Java có thể có một lợi thế, như hướng đối tượng là một kết hợp tốt cho loại nhiệm vụ này. Đề nghị cá nhân của tôi là Scala. Đó là một ngôn ngữ tốt để làm loại điều này, và nó sẽ dạy cho bạn những điều thú vị về thiết kế ngôn ngữ trên đường đi.

+0

* "Nhắm mục tiêu một bytecode không đơn giản là ý tưởng hay" * Ngược lại để nhắm mục tiêu một máy thực (ví dụx86), viết một thông dịch viên, hay cái gì khác? Về vấn đề này, viết một trình biên dịch có mục tiêu ngay cả một máy ảo "lý tưởng" (trái ngược với một CPU mà bạn phải lo lắng về việc cấp phát đăng ký và cộng sự) có xu hướng khó khăn hơn nhiều so với việc viết một trình thông dịch? Tôi tưởng tượng người ta có thể làm cho việc biên dịch khá dễ dàng bằng cách biên dịch thành một cây thay vì một chuỗi byte phẳng, nhưng tôi chưa bao giờ thực hiện nó trước đây, và tôi muốn biết người khác phải nói gì về nó. –

+0

@Joey Như trái ngược với việc nhắm mục tiêu đến một cỗ máy thực sự. Ngay cả các trình biên dịch tạo ra mã máy thường tạo ra một đầu ra bytecode trung gian (mặc dù các trình biên dịch cao cấp có thể tránh làm như vậy để đạt được tối đa trong tốc độ biên dịch và tối ưu hóa có sẵn). Viết một thông dịch viên là dễ dàng hơn, thực sự, đặc biệt là nếu bạn chọn để viết một ngôn ngữ năng động. Đối với việc biên dịch thành một cây, một cây là _output_ của phân tích cú pháp, vì vậy nó chắc chắn là dễ dàng hơn - mặc dù không thực sự là tất cả. –

+0

Rất tiếc, tôi bị nhầm lẫn bởi câu của bạn (trông giống như bạn đã nói nhắm mục tiêu bytecode là điên rồ và vô dụng, nhưng bạn nói ngược lại). Ngoài ra, tôi đã nói nhiều hơn dọc theo các dòng của một cây điều chỉnh để thực hiện, khác biệt với đầu ra của trình phân tích cú pháp cơ bản (mặc dù trong các thiết lập đơn giản, chúng có thể có cấu trúc tương tự). –

1

Bạn có thể muốn đọc a book on compilers trước tiên.

Đối thực sự hiểu được điều gì đang xảy ra, bạn có thể sẽ muốn viết mã của bạn trong C.

Java sẽ không phải là một lựa chọn không tồi nếu bạn muốn viết một ngôn ngữ giải thích, chẳng hạn như Jython. Nhưng kể từ khi có vẻ như bạn muốn biên dịch xuống mã máy, nó có thể được dễ dàng hơn trong C.

1

tôi khuyên bạn nên đọc những cuốn sách sau đây:

ANTLR

Language Design Patterns

này sẽ cung cấp cho bạn các công cụ và kỹ thuật để tạo trình phân tích cú pháp, từ vựng và trình biên dịch cho các ngôn ngữ tùy chỉnh.

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