2010-09-28 37 views
26

thể trùng lặp:
Learning to write a compilerLàm cách nào để tạo ngôn ngữ lập trình của riêng bạn?

Tôi nhìn quanh cố gắng để tìm hiểu thêm về sự phát triển ngôn ngữ lập trình, nhưng không thể tìm thấy một toàn bộ rất nhiều trên mạng. Tôi đã tìm thấy một số video hướng dẫn, nhưng không nhiều cho hướng dẫn văn bản, Câu hỏi thường gặp, lời khuyên, v.v. Tôi thực sự tò mò về cách xây dựng ngôn ngữ lập trình của riêng mình. Nó đưa tôi đến SO để hỏi:

Bạn có thể làm thế nào để tạo ngôn ngữ lập trình của riêng mình?

Tôi muốn xây dựng một ngôn ngữ rất cơ bản. Tôi không có kế hoạch có một ngôn ngữ rất tốt, tôi cũng không nghĩ rằng nó sẽ được sử dụng bởi bất cứ ai. Tôi chỉ muốn tạo ngôn ngữ của riêng mình để tìm hiểu thêm về hệ điều hành, lập trình và trở nên tốt hơn ở mọi thứ.

Bắt đầu từ đâu? Xây dựng cú pháp? Xây dựng trình biên dịch? Kỹ năng nào là cần thiết? Rất nhiều lắp ráp và hiểu biết về hệ điều hành? Ngôn ngữ nào là hầu hết các trình biên dịch và ngôn ngữ được xây dựng? Tôi giả sử C.

+0

Tôi không chắc bạn sẽ học rất nhiều về hệ điều hành bằng cách viết một trình biên dịch ... –

+0

Cảm ơn tôi đã không nhìn thấy câu hỏi khác, nó đã không bật lên trong Google hoặc trên SO khi tôi tìm kiếm. Rất nhiều câu trả lời hay! –

+0

Tôi đã xây dựng một ngôn ngữ lập trình mà không cần lắp ráp hoặc nhị phân. http://github.com/struixLang – sbrm1

Trả lời

29

Tôi muốn nói rằng trước khi bạn bắt đầu, bạn có thể muốn xem qua số Dragon Book và/hoặc Programming Language Pragmatics. Điều đó sẽ giúp bạn trong lý thuyết ngôn ngữ lập trình. Các cuốn sách bao gồm biên soạn, và giải thích, và sẽ cho phép bạn xây dựng tất cả các công cụ cần thiết để tạo ra một ngôn ngữ lập trình cơ bản.

Tôi không biết bao nhiêu ngôn ngữ lắp ráp bạn biết, nhưng trừ khi bạn khá thoải mái với một số phương ngữ lập trình ngôn ngữ lắp ráp tôi khuyên bạn nên cố gắng viết một trình biên dịch biên dịch xuống mã lắp ráp khá một chút thách thức. Bạn đã đề cập trước đó rằng bạn quen thuộc với cả C và C++, vì vậy có lẽ bạn có thể viết một trình biên dịch để biên dịch xuống C hoặc C++ và sau đó sử dụng gcc/g ++ hoặc bất kỳ trình biên dịch C/C++ nào khác để chuyển đổi mã thành một tệp thực thi nguyên gốc. Đây là ngôn ngữ lập trình Vala (nó chuyển đổi cú pháp Vala thành mã C sử dụng thư viện GObject).

Đối với những gì bạn có thể sử dụng để viết trình biên dịch, bạn có nhiều tùy chọn. Bạn có thể viết nó bằng tay trong C hoặc C++, hoặc để đơn giản hóa phát triển, bạn có thể sử dụng ngôn ngữ cấp cao hơn để bạn có thể tập trung vào việc viết trình biên dịch nhiều hơn phân bổ bộ nhớ và những thứ cần thiết để làm việc với chuỗi in C.

Bạn chỉ cần tạo các ngữ pháp và có FlexBison tạo trình phân tích cú pháp và từ vựng. Điều này thực sự hữu ích vì nó cho phép bạn làm phát triển lặp lại để nhanh chóng làm việc để có được một trình biên dịch làm việc.

Một tùy chọn khác mà bạn có là sử dụng ANTLR để tạo trình phân tích cú pháp của bạn, lợi thế của việc này là bạn nhận được rất nhiều ngôn ngữ đích mà ANTLR có thể biên dịch. Tôi đã không bao giờ được sử dụng này nhưng tôi đã nghe rất nhiều về nó. Ngoài ra, nếu bạn muốn có nền tảng tốt hơn trên các mô hình được sử dụng thường xuyên trong việc xây dựng trình biên dịch/quét/phân tích ngôn ngữ lập trình, bạn sẽ nhận được một cuốn sách về Mô hình tính toán. Tôi muốn giới thiệu Introduction to the Theory of Computation.

Bạn cũng có vẻ quan tâm đến việc đạt được sự hiểu biết về các hệ điều hành. Điều này tôi sẽ nói là một cái gì đó là riêng biệt từ thiết kế ngôn ngữ lập trình, và cần được theo đuổi riêng biệt. Cuốn sách Principles of Modern Operating Systems là một nơi khởi đầu khá tốt để học về điều đó. Bạn có thể bắt đầu với các dự án nhỏ như tạo vỏ hoặc viết chương trình mô phỏng lệnh ls và sau đó chuyển sang nhiều thứ cấp thấp hơn, tùy thuộc vào cách bạn thực hiện cuộc gọi hệ thống trong C.

Tôi hy vọng rằng giúp bạn.

EDIT: Tôi đã học được rất nhiều kể từ khi tôi viết câu trả lời này. Tôi đã lấy số online course on programming languages mà Đại học Brown đã cung cấp khi tôi nhìn thấy câu trả lời này nổi bật ở đó. Các giáo sư rất đúng chỉ ra rằng câu trả lời này nói rất nhiều về phân tích cú pháp nhưng là ánh sáng trên chỉ là về tất cả mọi thứ khác. Tôi thực sự khuyên bạn nên xem các video và bài tập của khóa học nếu bạn muốn có ý tưởng tốt hơn về cách tạo ngôn ngữ lập trình.

+1

Cảm ơn, bài đăng thực sự sâu sắc! Tôi chắc chắn sẽ tìm kiếm mọi thứ, bài đăng tuyệt vời! –

+3

Cảm ơn bạn đã đánh dấu câu trả lời đúng này. Vào lúc tôi đã gõ mọi thứ, câu trả lời của người khác đã được đánh dấu đúng. Đó là câu trả lời đầu tiên tôi đăng trên trang web này đã được chấp nhận. –

+0

(Vì ai đó đã chỉ ra nó cuối cùng ...) câu trả lời này đã đạt được một số mức độ (in?) Famy tại https://www.youtube.com/watch?v=3N__tvmZrzc – agam

7

Nó hoàn toàn phụ thuộc vào ngôn ngữ lập trình của bạn sẽ như thế nào.

  • Bạn có chắc chắn muốn biên dịch không? Cũng có các ngôn ngữ thông dịch ... hoặc bạn có thể thực hiện biên dịch vào thời gian thực hiện

  • Bạn muốn nền tảng đích là gì? Một số tùy chọn: (? Mà kiến ​​trúc và hệ điều hành)

    • đang Native
    • JVM
    • Regular NET
    • NET sử dụng Dynamic Language Runtime (như IronRuby/IronPython)
    • Parrot

Cá nhân tôi sẽ mạnh mẽ xem xét nhắm mục tiêu JVM hoặc .NET, chỉ vì sau đó bạn nhận được rất nhiều "an toàn" miễn phí, cũng như một tập hợp lớn các thư viện ngôn ngữ của bạn có thể sử dụng. (Rõ ràng với mã nguồn gốc có rất nhiều thư viện quá, nhưng tôi nghi ngờ rằng nhận được khả năng tương tác giữa chúng phải có thể phức tạp hơn.)

Tôi thấy không có lý do tại sao bạn muốn đặc biệt là muốn viết một trình biên dịch (hoặc khác một phần của hệ thống) trong C, đặc biệt là nếu nó chỉ dành cho mục đích giáo dục (vì vậy bạn không cần một trình biên dịch 100 triệu dòng/giây). Ngôn ngữ nào cá nhân bạn làm việc hiệu quả nhất?

+1

Tôi có thể mã bằng C và C++. Tôi thích C, mặc dù. Tôi chủ yếu muốn ở mức rất thấp, tìm hiểu cách trình biên dịch hoạt động, thực thi được thực hiện, mã được nạp vào bộ nhớ và được thực thi. Cuối cùng tôi muốn tạo ra hệ điều hành nhỏ bé của riêng mình với các chương trình người dùng/hệ thống nhỏ của riêng tôi. Tôi không có ý định làm bất cứ điều gì trên quy mô lớn, nhưng rất, rất tối thiểu. Tôi sẽ làm việc chủ yếu trong Linux, và muốn ngôn ngữ được sử dụng trên hầu hết các hệ thống * nix. –

6

Hãy xem ANTLR. Nó là một trình biên dịch trình biên dịch tuyệt vời những thứ bạn sử dụng để xây dựng một trình phân tích cú pháp cho một ngôn ngữ.

Xây dựng ngôn ngữ về cơ bản là định nghĩa ngữ pháp và thêm quy tắc sản xuất cho ngữ pháp này. Làm điều đó bằng tay không phải là tầm thường, nhưng trình biên dịch-trình biên dịch tốt sẽ giúp bạn rất nhiều.

Bạn cũng có thể muốn xem "Sách Rồng" cổ điển (một cuốn sách về các trình biên dịch có tính năng một hiệp sĩ giết một con rồng trên trang đầu). (Google nó).

Xây dựng các ngôn ngữ cụ thể của miền là một kỹ năng hữu ích để làm chủ. Các ngôn ngữ cụ thể của miền thường không phải là ngôn ngữ lập trình đầy đủ tính năng, nhưng các quy tắc kinh doanh thông thường được xây dựng bằng một tùy chỉnh ngôn ngữ được tạo riêng cho dự án. Hãy nhìn vào chủ đề đó.

+0

Cảm ơn tôi đã tìm thấy cuốn sách và ANTLR trông rất thú vị và tiết kiệm thời gian. –

+0

Nếu bạn muốn đi sâu vào các trình phân tích cú pháp và/hoặc ANTLR, tôi có thể giới thiệu sách của Terence Parr. Ông khá giỏi trong việc đưa ra chủ đề khó phân tích cú pháp bằng văn bản có thể hiểu được. – Holstebroe

3

Có nhiều hướng dẫn trực tuyến khác nhau như Write Yourself a Scheme in 48 hrs.

Một nơi để bắt đầu tho 'có thể là với "ngôn ngữ cụ thể của miền được nhúng" (EDSL). Đây là ngôn ngữ thực sự chạy trong môi trường của một ngôn ngữ khác, nhưng bạn đã tạo từ khóa, toán tử, v.v. đặc biệt phù hợp với chủ đề (tên miền) mà bạn muốn làm việc.

+0

Liên kết đầu tiên bị hỏng. – Hemang

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