Học viết trình biên dịch [đã đóng]


699

Ngôn ngữ ưa thích : C / C ++, Java và Ruby.

Tôi đang tìm kiếm một số sách / hướng dẫn hữu ích về cách viết trình biên dịch của riêng bạn chỉ đơn giản cho mục đích giáo dục. Tôi quen thuộc nhất với C / C ++, Java và Ruby, vì vậy tôi thích các tài nguyên liên quan đến một trong ba, nhưng bất kỳ tài nguyên tốt nào cũng được chấp nhận.


ANTLR tất cả các cách. Tất cả các tài nguyên được đề xuất dưới đây trông giống như một sự quá mức đối với tôi. ANTLR luôn là người bạn thiết kế trình biên dịch tốt nhất. A
A_Var

Nếu trọng tâm chính của bạn là tìm hiểu cách tổng hợp các ý tưởng hoạt động nói chung - bạn có thể kiểm tra và viết tắt SICP cho Giải thích cấu trúc chương trình máy tính dựa trên Đề án (Danh sách) nhưng dạy các nguyên tắc chung. giảm nhẹ.mit.edu / sicp . Tôi đã được giới thiệu cuốn sách này bởi một cựu chiến binh làm việc cho một công ty và thực hiện các công việc biên soạn và giải thích để kiếm sống!
Nishant

Một phích cắm không biết xấu hổ: câu trả lời của tôi cho một câu hỏi tương tự .
9000

Tôi đã viết một bài viết về việc tạo một trình biên dịch trên blog của mình: Orangejuiceliberationfront.com/how-to-write-a-compiler Nó tập trung vào những điều rất cơ bản và thực sự bắt đầu. Có rất nhiều bài viết liên quan đến trình biên dịch / codegen / trình phân tích cú pháp / ngôn ngữ trên đó.
uliwitness

Câu trả lời:


1084

Danh sách lớn các tài nguyên:

Huyền thoại:

  • Liên kết tới tệp PDF
  • $ Liên kết đến một cuốn sách in

22
Tôi đã đọc loạt Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , nó thực sự rất hay và là một điểm khởi đầu tốt.
TheVillageIdiot

5
Tôi nghĩ một điều đáng nói là khóa học biên dịch của Coursera. Nó có các video hay và hướng dẫn việc tạo một java như ngôn ngữ / trình biên dịch đơn giản. Liên kết trình biên dịch Coursera
QuantumKarl

1
Tôi muốn giữ câu trả lời này được đăng thành nguyên bản nhất có thể vì vậy tôi đã quyết định đăng tài liệu tham khảo này tại đây: guidespoint.com/compiler_design/index.htmlm Điều tôi thích về trang web này là nó không liên quan đến việc thực sự viết bất kỳ mã nào để tạo một trình biên dịch, nhưng nó chia trình biên dịch thành các phần của nó: các pha và các giai đoạn. Nó mô tả cách tiếp cận logic và thiết kế thuật toán mà không có bất kỳ mô hình ngôn ngữ cụ thể nào vì nó thể hiện các ký hiệu của một ngôn ngữ và bảng chữ cái tùy ý. Đây là một bài đọc nhanh, nhưng cung cấp cho bạn các khái niệm về những gì cần thiết cho mỗi phần.
Francis Cugler

70

Đây là một câu hỏi khá mơ hồ, tôi nghĩ vậy; chỉ vì độ sâu của chủ đề liên quan. Tuy nhiên, một trình biên dịch có thể được phân tách thành hai phần riêng biệt; một nửa trên và một dưới cùng. Nửa trên thường lấy ngôn ngữ nguồn và chuyển đổi nó thành biểu diễn trung gian và nửa dưới đảm nhiệm việc tạo mã cụ thể cho nền tảng.

Tuy nhiên, một ý tưởng cho một cách dễ dàng để tiếp cận chủ đề này (ít nhất là ý tưởng chúng tôi đã sử dụng trong lớp trình biên dịch của tôi) là xây dựng trình biên dịch theo hai phần được mô tả ở trên. Cụ thể, bạn sẽ có được một ý tưởng tốt về toàn bộ quá trình chỉ bằng cách xây dựng nửa trên.

Chỉ cần thực hiện nửa trên cho phép bạn có được kinh nghiệm viết trình phân tích từ vựng và trình phân tích cú pháp và đi đến việc tạo một số "mã" (đại diện trung gian mà tôi đã đề cập). Vì vậy, nó sẽ đưa chương trình nguồn của bạn và chuyển đổi nó sang một đại diện khác và thực hiện một số tối ưu hóa (nếu bạn muốn), đó là trái tim của trình biên dịch. Nửa dưới sau đó sẽ lấy biểu diễn trung gian đó và tạo các byte cần thiết để chạy chương trình trên một kiến ​​trúc cụ thể. Ví dụ, nửa dưới sẽ lấy biểu diễn trung gian của bạn và tạo tệp thực thi PE.

Một số cuốn sách về chủ đề này mà tôi thấy đặc biệt hữu ích là Nguyên tắc và Kỹ thuật của Trình biên dịch (hoặc Sách Rồng, do con rồng dễ thương trên trang bìa). Nó có một số lý thuyết tuyệt vời và chắc chắn bao gồm các ngữ pháp không ngữ cảnh theo cách thực sự dễ tiếp cận. Ngoài ra, để xây dựng trình phân tích từ vựng và trình phân tích cú pháp, có thể bạn sẽ sử dụng các công cụ * nix lex và yacc. Và thật thú vị, cuốn sách có tên " lex and yacc " đã chọn nơi Sách Rồng để lại cho phần này.


55

Tôi nghĩ Modern Compiler Thực hiện trong ML là trình biên dịch viết văn bản giới thiệu tốt nhất. Cũng có phiên bản Javaphiên bản C , một trong hai phiên bản có thể dễ truy cập hơn dựa trên nền tảng ngôn ngữ của bạn. Cuốn sách chứa rất nhiều tài liệu cơ bản hữu ích (quét và phân tích cú pháp, phân tích ngữ nghĩa, hồ sơ kích hoạt, lựa chọn hướng dẫn, tạo mã gốc RISC và x86) và các chủ đề "nâng cao" khác nhau (biên dịch OO và ngôn ngữ chức năng, đa hình, thu gom rác, tối ưu hóa và biểu mẫu gán tĩnh đơn) vào không gian tương đối ít (~ 500 trang).

Tôi thích triển khai Trình biên dịch hiện đại cho sách Rồng vì triển khai Trình biên dịch hiện đại ít khảo sát về lĩnh vực này - thay vào đó nó có độ bao phủ thực sự vững chắc của tất cả các chủ đề bạn sẽ cần để viết một trình biên dịch nghiêm túc, đàng hoàng. Sau khi bạn hoàn thành cuốn sách này, bạn sẽ sẵn sàng giải quyết các tài liệu nghiên cứu trực tiếp để có thêm chiều sâu nếu bạn cần.

Tôi phải thú nhận rằng tôi có một điểm yếu nghiêm trọng đối với Xây dựng Trình biên dịch của Niklaus Wirth . có sẵn trực tuyến dưới dạng PDF. Tôi thấy thẩm mỹ lập trình của Wirth đơn giản là đẹp, tuy nhiên một số người thấy phong cách của anh ta quá tối thiểu (ví dụ Wirth thích các trình phân tích cú pháp gốc đệ quy, nhưng hầu hết các khóa CS tập trung vào các công cụ tạo trình phân tích cú pháp; Thiết kế ngôn ngữ của Wirth khá bảo thủ. về những ý tưởng cơ bản của Wirth, vì vậy dù bạn có thích phong cách của anh ấy hay không, tôi khuyên bạn nên đọc cuốn sách này.


Trình biên dịch xây dựng PDF ethoberon.ethz.ch/WirthPubl/CBE ALL.pdf
matepal297

Tôi thực sự khuyên bạn nên chống lại phiên bản C của "Triển khai trình biên dịch hiện đại", nó bị tê liệt bởi các chi tiết cấp thấp do C. Nó hoàn toàn làm hỏng cuốn sách. Java 1st không quá tốt vì thiết kế OO của nó kém, Java 2nd ed không còn nói về ngôn ngữ Tiger. Vì vậy, tôi thực sự khuyên bạn nên ML: không cần phải thông thạo ML để hiểu nó. ML chắc chắn rất phù hợp cho công việc.
akim

44

Tôi đồng tình với tài liệu tham khảo Sách Rồng; IMO, nó là hướng dẫn dứt khoát để xây dựng trình biên dịch. Hãy sẵn sàng cho một số lý thuyết khó khăn, mặc dù.

Nếu bạn muốn một cuốn sách nhẹ hơn về lý thuyết, Game Scripting Mastery có thể là một cuốn sách tốt hơn cho bạn. Nếu bạn là một người mới hoàn toàn về lý thuyết trình biên dịch, nó cung cấp một giới thiệu nhẹ nhàng hơn. Nó không bao gồm các phương pháp phân tích thực tế hơn (chọn phương pháp đệ quy không dự đoán mà không thảo luận về phân tích LL hoặc LR), và như tôi nhớ lại, nó thậm chí không thảo luận về bất kỳ lý thuyết tối ưu hóa nào. Thêm vào đó, thay vì biên dịch thành mã máy, nó biên dịch thành mã byte được cho là chạy trên máy ảo mà bạn cũng viết.

Đây vẫn là một cuốn sách đáng đọc, đặc biệt nếu bạn có thể mua nó với giá rẻ trên Amazon. Nếu bạn chỉ muốn giới thiệu dễ dàng vào trình biên dịch, Game Scripting Mastery không phải là một cách tồi. Nếu bạn muốn đi lên phía trước, thì bạn nên giải quyết không thua gì Sách Rồng.


1
Game Scripting Mastery là một tài nguyên học tập tuyệt vời bởi vì khi bạn hoàn thành, bạn sẽ có một trò chơi phiêu lưu 2D có thể chơi được, có thể chơi được. Điều này làm cho mọi bài tập tập trung vào một mục đích cụ thể, và giữ cho người đọc có động lực.
Dour High Arch

1
Dragon hơi tập trung vào phân tích cú pháp dựa trên ngữ pháp. Nếu bạn không cố phân tích thứ gì đó không thể như C ++ hoặc bằng cách sử dụng trình tạo trình phân tích cú pháp, nhưng có thể sử dụng ví dụ ngữ pháp LL thủ công, bạn có thể muốn tìm ra thứ gì đó xử lý các trường biên dịch tỷ lệ cao hơn ngoài biến đổi ngữ pháp và chứng minh
Marco van de Voort

27

"Hãy xây dựng trình biên dịch" thật tuyệt vời, nhưng nó hơi lỗi thời. (Tôi không nói rằng nó làm cho nó thậm chí ít hơn một chút hợp lệ.)

Hoặc kiểm tra SLANG . Điều này tương tự như "Hãy xây dựng trình biên dịch" nhưng là một tài nguyên tốt hơn nhiều đặc biệt là cho người mới bắt đầu. Điều này đi kèm với một hướng dẫn pdf trong đó có một cách tiếp cận 7 bước để dạy cho bạn một trình biên dịch. Thêm liên kết quora vì nó có các liên kết đến tất cả các cổng khác nhau của SLANG, trong C ++, Java và JS, cũng là các trình thông dịch bằng python và java, ban đầu được viết bằng C # và nền tảng .NET.


5
Tôi đồng ý rằng loạt bài này là một chút lỗi thời, mặc dù nó vẫn hữu ích. Tuy nhiên, điều hấp dẫn nhất của tôi với nó là thực tế là nó cố gắng chuyển thẳng sang ngôn ngữ lắp ráp thay vì xây dựng bất kỳ loại cây phân tích nào, có nghĩa là (trái với những gì được nêu trong bài viết đầu tiên) rằng nó không hữu ích cho việc viết thông dịch viên.
a_m0d

23

Nếu bạn đang muốn sử dụng các công cụ mạnh mẽ, cấp cao hơn là tự mình xây dựng mọi thứ , thì việc xem qua các dự án và bài đọc cho khóa học này là một lựa chọn khá tốt. Đây là một khóa học ngôn ngữ của tác giả của công cụ phân tích cú pháp Java ANTLR. Bạn có thể lấy cuốn sách cho khóa học dưới dạng PDF từ các lập trình viên thực dụng .

Khóa học đi qua các công cụ biên dịch tiêu chuẩn mà bạn thấy ở nơi khác: phân tích cú pháp, kiểm tra kiểu và loại, đa hình, bảng biểu tượng và tạo mã. Khá nhiều thứ duy nhất không được bảo hiểm là tối ưu hóa. Các dự án cuối cùng là một chương trình biên dịch một tập hợp con của C . Vì bạn sử dụng các công cụ như ANTLR và LLVM, nên việc viết toàn bộ trình biên dịch trong một ngày là khả thi (tôi có bằng chứng tồn tại về điều này, mặc dù tôi có nghĩa là ~ 24 giờ). Nó nặng về kỹ thuật thực tế sử dụng các công cụ hiện đại, nhẹ hơn một chút về lý thuyết.

LLVM, đơn giản là, tuyệt vời. Nhiều tình huống trong đó bạn thường có thể biên dịch để lắp ráp, thay vào đó, bạn nên biên dịch thành Đại diện trung gian của LLVM . Mức cao hơn, nền tảng chéo và LLVM khá tốt trong việc tạo ra lắp ráp tối ưu hóa từ nó.


Liên kết đầu tiên đã chết.
Lynn

20

Nếu bạn có ít thời gian, tôi khuyên bạn nên sử dụng "Trình biên dịch xây dựng" của Niklaus Wirth (Addison-Wesley. 1996) , một cuốn sách nhỏ mà bạn có thể đọc trong một ngày, nhưng nó giải thích những điều cơ bản (bao gồm cách thực hiện từ vựng, trình phân tích cú pháp đệ quy, và các máy ảo dựa trên ngăn xếp của riêng bạn). Sau đó, nếu bạn muốn lặn sâu, không có cách nào khác xung quanh cuốn sách Rồng như những người bình luận khác đề xuất.


Nếu bạn không có nhiều thời gian, đừng viết trình biên dịch.
Ingo

17

Bạn có thể muốn xem xét Lex / Yacc (hoặc Flex / Bison, bất cứ điều gì bạn muốn gọi cho họ). Flex là một công cụ phân tích từ vựng, sẽ phân tích và xác định các thành phần ngữ nghĩa ("mã thông báo") của ngôn ngữ của bạn và Bison sẽ được sử dụng để xác định điều gì xảy ra khi mỗi mã thông báo được phân tích cú pháp. Điều này có thể, nhưng chắc chắn không giới hạn, in ra mã C, cho trình biên dịch sẽ biên dịch thành C hoặc tự động chạy các hướng dẫn.

Câu hỏi thường gặp này sẽ giúp bạn và hướng dẫn này có vẻ khá hữu ích.


17

Nói chung, không có năm phút hướng dẫn cho trình biên dịch, bởi vì đó là một chủ đề phức tạp và viết một trình biên dịch có thể mất nhiều tháng. Bạn sẽ phải làm tìm kiếm của riêng bạn.

Python và Ruby thường được giải thích. Có lẽ bạn muốn bắt đầu với một thông dịch viên là tốt. Nó thường dễ dàng hơn.

Bước đầu tiên là viết một mô tả ngôn ngữ chính thức, ngữ pháp của ngôn ngữ lập trình của bạn. Sau đó, bạn phải chuyển đổi mã nguồn mà bạn muốn biên dịch hoặc giải thích theo ngữ pháp thành một cây cú pháp trừu tượng, một dạng nội bộ của mã nguồn mà máy tính hiểu và có thể hoạt động. Bước này thường được gọi là phân tích cú pháp và phần mềm phân tích mã nguồn được gọi là trình phân tích cú pháp. Thông thường trình phân tích cú pháp được tạo bởi trình tạo trình phân tích cú pháp để chuyển đổi một ngữ pháp chính thức thành mã máy oder nguồn. Để giải thích tốt, phi toán học về phân tích cú pháp, tôi khuyên bạn nên sử dụng Kỹ thuật phân tích cú pháp - Hướng dẫn thực hành. Wikipedia có một so sánh các trình tạo phân tích cú pháp mà từ đó bạn có thể chọn một trình tạo phù hợp với mình. Tùy thuộc vào trình tạo trình phân tích cú pháp mà bạn đã chọn,

Viết một trình phân tích cú pháp cho ngôn ngữ của bạn có thể thực sự khó khăn, nhưng điều này phụ thuộc vào ngữ pháp của bạn. Vì vậy, tôi đề nghị giữ cho ngữ pháp của bạn đơn giản (không giống như C ++); một ví dụ điển hình cho việc này là LISP.

Trong bước thứ hai, cây cú pháp trừu tượng được chuyển đổi từ cấu trúc cây thành biểu diễn trung gian tuyến tính. Như một ví dụ điển hình cho mã byte của Lua này thường được trích dẫn. Nhưng đại diện trung gian thực sự phụ thuộc vào ngôn ngữ của bạn.

Nếu bạn đang xây dựng một trình thông dịch, bạn chỉ cần giải thích biểu diễn trung gian. Bạn cũng có thể biên dịch nó kịp thời. Tôi khuyên dùng LLVM và libjit để biên dịch đúng lúc. Để làm cho ngôn ngữ có thể sử dụng được, bạn cũng sẽ phải bao gồm một số chức năng đầu vào và đầu ra và có lẽ là một thư viện tiêu chuẩn nhỏ.

Nếu bạn định biên dịch ngôn ngữ, nó sẽ phức tạp hơn. Bạn sẽ phải viết các phụ trợ cho các kiến ​​trúc máy tính khác nhau và tạo mã máy từ biểu diễn trung gian trong các phụ trợ đó. Tôi đề nghị LLVM cho nhiệm vụ này.

Có một vài cuốn sách về chủ đề này, nhưng tôi có thể giới thiệu không có cuốn nào để sử dụng chung. Hầu hết trong số họ là quá hàn lâm hoặc quá thực tế. Không có "Dạy cho bạn trình biên dịch viết trong 21 ngày" và do đó, bạn sẽ phải mua một vài cuốn sách để hiểu rõ về toàn bộ chủ đề này. Nếu bạn tìm kiếm trên Internet, bạn sẽ bắt gặp một số sách trực tuyến và ghi chú bài giảng. Có thể có một thư viện đại học gần bạn, nơi bạn có thể mượn sách trên trình biên dịch.

Tôi cũng đề xuất một kiến ​​thức nền tảng tốt về khoa học máy tính lý thuyết và lý thuyết đồ thị, nếu bạn sẽ làm cho dự án của bạn nghiêm túc. Một văn bằng về khoa học máy tính cũng sẽ hữu ích.


++ Bạn nói đúng rằng thật tốt khi biết tất cả những điều đó, và nó có thể là một công việc lớn, nhưng tôi cũng đã học được từ một số chuyên gia về cách không làm cho mọi thứ trở nên lớn. Thật tốt khi biết mọi thứ, và tốt hơn nữa là biết khi nào không nên sử dụng chúng, đó là phần lớn thời gian.
Mike Dunlavey


11

Một cuốn sách chưa được đề xuất nhưng rất quan trọng là "Trình liên kết và bộ tải" của John Levine. Nếu bạn không sử dụng trình biên dịch bên ngoài, bạn sẽ cần một cách để xuất tệp đối tượng có thể được liên kết vào chương trình cuối cùng của bạn. Ngay cả khi bạn đang sử dụng trình biên dịch bên ngoài, có thể bạn sẽ cần hiểu các di dời và cách toàn bộ quá trình tải chương trình hoạt động để tạo ra một công cụ làm việc. Cuốn sách này thu thập rất nhiều truyền thuyết ngẫu nhiên xung quanh quá trình này cho các hệ thống khác nhau, bao gồm Win32 và Linux.


10

Cuốn sách rồng chắc chắn là cuốn sách "trình biên dịch xây dựng", nhưng nếu ngôn ngữ của bạn không phức tạp như thế hệ ngôn ngữ hiện tại, bạn có thể muốn xem mẫu Phiên dịch từ Mẫu thiết kế .

Ví dụ trong cuốn sách thiết kế một ngôn ngữ giống như biểu thức thông thường và được suy nghĩ thấu đáo, nhưng như họ nói trong cuốn sách, thật tốt khi suy nghĩ về quy trình nhưng thực sự chỉ hiệu quả với các ngôn ngữ nhỏ. Tuy nhiên, việc viết Trình thông dịch cho một ngôn ngữ nhỏ với mẫu này nhanh hơn nhiều so với việc phải tìm hiểu về tất cả các loại trình phân tích cú pháp khác nhau, yacc và lex, et cetera ...


10

Nếu bạn sẵn sàng sử dụng LLVM, hãy xem điều này: http://llvm.org/docs/tutorial/ . Nó dạy cho bạn cách viết một trình biên dịch từ đầu bằng cách sử dụng khung công tác của LLVM và không cho rằng bạn có bất kỳ kiến ​​thức nào về chủ đề này.

Hướng dẫn đề nghị bạn viết trình phân tích cú pháp và lexer của riêng bạn, v.v., nhưng tôi khuyên bạn nên xem xét về bison và flex sau khi bạn có ý tưởng. Họ làm cho cuộc sống dễ dàng hơn nhiều.


Nhưng tài liệu để thiết lập nó cho Visual Studio được viết rất tệ, cộng với không có ví dụ nào
SpicyWeenie

10

Tôi thấy cuốn sách Dragon quá khó để đọc với quá nhiều sự tập trung vào lý thuyết ngôn ngữ không thực sự cần thiết để viết một trình biên dịch trong thực tế.

Tôi sẽ thêm cuốn sách Oberon chứa toàn bộ nguồn của trình biên dịch Oberon đơn giản và nhanh chóng đáng kinh ngạc Project Oberon .

Văn bản thay thế


10

Tôi nhớ đã hỏi câu hỏi này khoảng bảy năm trước khi tôi còn khá mới với lập trình.

Tôi đã rất cẩn thận khi tôi hỏi và thật ngạc nhiên là tôi đã không nhận được nhiều lời chỉ trích như bạn đang đến đây. Tuy nhiên, họ đã chỉ cho tôi theo hướng của " Sách rồng ", theo ý kiến ​​của tôi, một cuốn sách thực sự tuyệt vời giải thích mọi thứ bạn cần biết để viết một trình biên dịch (tất nhiên bạn sẽ phải thành thạo một hoặc hai ngôn ngữ. ngôn ngữ bạn biết, merrier.).

Và vâng, nhiều người nói rằng đọc cuốn sách đó thật điên rồ và bạn sẽ không học được gì từ nó, nhưng tôi hoàn toàn không đồng ý với điều đó.

Nhiều người cũng nói rằng trình biên dịch viết là ngu ngốc và vô nghĩa. Vâng, có một số lý do tại sao phát triển trình biên dịch là hữu ích:

  • Bởi vì nó vui
  • Thật là giáo dục, khi học cách viết trình biên dịch, bạn sẽ học được rất nhiều về khoa học máy tính và các kỹ thuật khác hữu ích khi viết các ứng dụng khác.
  • Nếu không ai viết trình biên dịch, các ngôn ngữ hiện tại sẽ không tốt hơn.

Tôi đã không viết trình biên dịch của riêng mình ngay lập tức, nhưng sau khi hỏi tôi đã biết bắt đầu từ đâu. Và bây giờ, sau khi học nhiều ngôn ngữ khác nhau và đọc Sách Rồng, viết không phải là vấn đề quá lớn. (Tôi cũng đang học atm kỹ thuật máy tính, nhưng hầu hết những gì tôi biết về lập trình là tự học.)

Tóm lại, The Dragon Book là một "hướng dẫn" tuyệt vời. Nhưng dành một chút thời gian để thành thạo một hoặc hai ngôn ngữ trước khi thử viết một trình biên dịch. Đừng mong đợi trở thành một bậc thầy về trình biên dịch trong vòng một thập kỷ tới.

Cuốn sách cũng tốt nếu bạn muốn tìm hiểu cách viết trình phân tích cú pháp / trình thông dịch.


9

"... Hãy xây dựng trình biên dịch ..."

Tôi muốn thứ hai http://compilers.iecc.com/crenshaw/ bởi @sasb . Quên mua thêm sách cho thời điểm này.

Tại sao? Công cụ & ngôn ngữ.

Ngôn ngữ cần có là Pascal và nếu tôi nhớ chính xác thì dựa trên Turbo-Pascal. Nó chỉ xảy ra nếu bạn truy cập http://www.freepascal.org/ và tải xuống trình biên dịch Pascal tất cả các ví dụ hoạt động trực tiếp từ trang ~ http://www.freepascal.org/doad.var Điều tuyệt vời về Miễn phí Pascal là bạn có thể sử dụng nó gần như bất kỳ bộ xử lý hoặc HĐH nào bạn có thể quan tâm.

Một khi bạn đã nắm vững những bài học sau đó cố gắng nâng cao hơn " Rồng Book " ~ http://en.wikipedia.org/wiki/Dragon_book


9

Tôi đang xem xét cùng một khái niệm và tìm thấy bài viết đầy hứa hẹn này của Joel Pobar,

Tạo Trình biên dịch ngôn ngữ cho .NET Framework - không chắc nơi này đã đi đâu

Tạo Trình biên dịch ngôn ngữ cho .NET Framework - bản sao pdf của tài liệu gốc

ông thảo luận về một khái niệm cấp cao về trình biên dịch và tiến hành phát minh ngôn ngữ riêng của mình cho khung .Net. Mặc dù nó nhắm đến .Net Framework, nhiều khái niệm sẽ có thể được sao chép. Điều này bao gồm:

  1. Định nghĩa Langauge
  2. Máy quét
  3. Trình phân tích cú pháp (bit im chủ yếu quan tâm)
  4. Nhắm mục tiêu .Net Framework
  5. Trình tạo mã

Có những chủ đề khác, nhưng bạn có được chỉ.

Nó nhắm đến những người bắt đầu, được viết bằng C # (không hoàn toàn là Java)

HTH

xương


"Không hoàn toàn Java" nghĩa là gì?
Hejazzman

haha, xin lỗi, ý tôi là nó được viết cho .Net, về nguyên tắc tương tự như java. Cả hai đều là JIT trong phong cách. :)
dbones

8

Một cách dễ dàng để tạo trình biên dịch là sử dụng bison và flex (hoặc tương tự), xây dựng cây (AST) và tạo mã trong C. Với việc tạo mã C là bước quan trọng nhất. Bằng cách tạo mã C, ngôn ngữ của bạn sẽ tự động hoạt động trên tất cả các nền tảng có trình biên dịch C.

Tạo mã C dễ như tạo HTML (chỉ cần sử dụng in hoặc tương đương), điều này dễ dàng hơn nhiều so với viết trình phân tích cú pháp C hoặc trình phân tích cú pháp HTML.


8

Từ các câu hỏi tổng hợp của Comp.compilers :

"Lập trình máy tính cá nhân" của Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Cuốn sách có tiêu đề không may này giải thích việc thiết kế và tạo ra môi trường lập trình một người dùng cho micros, sử dụng ngôn ngữ giống như Pascal có tên Edison. Tác giả trình bày tất cả các mã nguồn và giải thích cho việc thực hiện từng bước của trình biên dịch Edison và hệ điều hành hỗ trợ đơn giản, tất cả được viết bằng chính Edison (ngoại trừ một hạt nhân hỗ trợ nhỏ được viết bằng trình biên dịch tượng trưng cho PDP 11/23; nguồn hoàn chỉnh cũng có thể được đặt hàng cho PC của IBM).

Điều thú vị nhất của cuốn sách này là: 1) khả năng trình bày cách tạo ra một trình biên dịch và hệ điều hành hoàn chỉnh, khép kín, tự duy trì, hữu ích và 2) thảo luận thú vị về các vấn đề thiết kế và đặc tả ngôn ngữ và giao dịch tắt trong Chương 2.

"Brinch Hansen trên trình biên dịch Pascal" của Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Một cuốn sách nặng về lý thuyết nặng về lý thuyết khác đây là cuốn sách hướng dẫn cách viết mã. Tác giả trình bày về thiết kế, triển khai và mã nguồn hoàn chỉnh cho trình biên dịch và trình thông dịch mã p cho Pascal- (Pascal "trừ"), một tập hợp con Pascal với các kiểu boolean và số nguyên (nhưng không có ký tự, kiểu thực, kiểu con hoặc kiểu liệt kê) , định nghĩa không đổi và biến và các kiểu mảng và bản ghi (nhưng không đóng gói, biến thể, đặt, con trỏ, không tên, đổi tên hoặc loại tệp), biểu thức, câu lệnh gán, định nghĩa thủ tục lồng nhau với các tham số giá trị và biến, nếu câu lệnh, trong khi câu lệnh, và các khối bắt đầu (nhưng không có định nghĩa hàm, tham số thủ tục, câu lệnh goto và nhãn, câu lệnh tình huống, câu lệnh lặp lại, cho câu lệnh và với câu lệnh).

Trình biên dịch và trình thông dịch được viết bằng Pascal * (Pascal "star"), một tập hợp con Pascal được mở rộng với một số tính năng kiểu Edison để tạo các hệ thống phát triển phần mềm. Một trình biên dịch Pascal * cho PC của IBM được bán bởi tác giả, nhưng thật dễ dàng để chuyển trình biên dịch Pascal của cuốn sách sang bất kỳ nền tảng Pascal thuận tiện nào.

Cuốn sách này làm cho việc thiết kế và thực hiện một trình biên dịch trông dễ dàng. Tôi đặc biệt thích cách tác giả quan tâm đến chất lượng, độ tin cậy và thử nghiệm. Trình biên dịch và trình thông dịch có thể dễ dàng được sử dụng làm cơ sở cho một dự án ngôn ngữ hoặc trình biên dịch có liên quan nhiều hơn, đặc biệt là nếu bạn được nhấn để nhanh chóng có được một cái gì đó và chạy.


8

Bạn nên kiểm tra " ichbins " của Darius Bacon , một trình biên dịch cho một phương ngữ Lisp nhỏ, nhắm mục tiêu C, chỉ trong hơn 6 trang mã. Ưu điểm của nó so với hầu hết các trình biên dịch đồ chơi là ngôn ngữ đã hoàn thành đủ để trình biên dịch được viết trong đó. (Tarball cũng bao gồm một trình thông dịch để khởi động mọi thứ.)

Có nhiều thứ hơn về những gì tôi thấy hữu ích khi học viết trình biên dịch trên trang web Ur-Scheme của mình.


8
  1. Đây là một chủ đề rộng lớn. Đừng đánh giá thấp điểm này. Và đừng đánh giá thấp quan điểm của tôi để không đánh giá thấp nó.
  2. Tôi nghe rằng Sách Rồng là một nơi (?) Để bắt đầu, cùng với việc tìm kiếm. :) Tìm kiếm tốt hơn, cuối cùng nó sẽ là cuộc sống của bạn.
  3. Xây dựng ngôn ngữ lập trình của riêng bạn hoàn toàn là một bài tập tốt! Nhưng biết rằng cuối cùng nó sẽ không bao giờ được sử dụng cho bất kỳ mục đích thực tế nào. Ngoại lệ cho điều này là rất ít và rất xa giữa.

4
Nếu bạn chưa đọc cuốn sách Rồng. Xin đừng giới thiệu nó. Trong thực tế, bạn đã bao giờ thực hiện một trình biên dịch?

Vâng, như tên của nó, Sách Rồng là một con quái vật. Tuy nhiên, rất sâu sắc, nhưng một nguồn tài nguyên rất tốt. Tôi sẽ không giới thiệu nó cho người mới bắt đầu, mặc dù ...
Zachary Murray

2
@Neil: Bạn chưa google tôi, phải không? cười lớn. blog.280z28.org Nhưng không, tôi chưa đọc cuốn sách đó.
Sam Harwell

Hiện tại tôi đang đọc nó (cuốn sách rồng), và cả Lex / Yacc, tôi thấy cuốn sách này khá hay. Cá nhân.
Simeon Pilgrim

1
Để công bằng, tôi đã mở đầu nó bằng "Tôi nghe ...". :) # 1 và # 3 là những điểm tôi cảm thấy cực kỳ quan trọng để biết đi vào nhưng không được đề cập thường xuyên.
Sam Harwell

8

Trình biên dịch LCC ( wikipedia ) ( trang chủ dự án ) ( github.com/drh/lcc ) của Fraser và Hanson được mô tả trong cuốn sách "Trình biên dịch C Retargetable C: Thiết kế và triển khai". Nó khá dễ đọc và giải thích toàn bộ trình biên dịch, cho đến việc tạo mã.


Đây có vẻ như là một nguồn tài nguyên cực kỳ tốt cảm ơn.
gideon

7

Python đi kèm với một trình biên dịch python được viết bằng Python. Bạn có thể thấy mã nguồn và nó bao gồm tất cả các giai đoạn, từ phân tích cú pháp, cây cú pháp trừu tượng, mã phát ra, v.v. Hack nó.


7

Xin lỗi, đây là tiếng Tây Ban Nha, nhưng đây là thư mục của khóa học có tên "Compiladores e Intérpretes" (Trình biên dịch và Phiên dịch) ở Argentina.

Khóa học là từ lý thuyết ngôn ngữ chính thức đến xây dựng trình biên dịch, và đây là những chủ đề bạn cần xây dựng, ít nhất, một trình biên dịch đơn giản:

  • Trình biên dịch Thiết kế trong C.
    Allen I. Holub

    Prentice-Hall. 1990.

  • Đồng hành. Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Biên tập Paraninfo. 1988.

  • Trình biên dịch xây dựng.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enqueque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • Nghệ thuật thiết kế trình biên dịch. Lý thuyết và thực hành.
    Thomas Pittman, James Peters.

    Prentice-Hội trường. 1992.

  • Xây dựng trình biên dịch hướng đối tượng.
    Jim Holmes.
    Hội trường Prentice, Vách đá Englewood, NJ 1995

  • Đồng hành. Khái niệm cơ bản.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995.

  • Giới thiệu về Lý thuyết, Ngôn ngữ và Tính toán của Automata.

    John E. Hopcroft. Jeffref D. Ullman.
    Addison-Wesley. 1979.

  • Giới thiệu về ngôn ngữ chính thức.
    Gyorgy E. Révész.

    Đồi Mc Graw. 1983.

  • Kỹ thuật phân tích cú pháp. Hướng dẫn thực hành.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Một trình biên dịch-Trình biên dịch khác.
    Stephen C. Johnson
    Báo cáo kỹ thuật khoa học máy tính số 32, 1975. Phòng thí nghiệm Bell. Đồi Murray, New
    Jersey.

  • Lex: Một máy phát điện phân tích từ điển.
    TÔI Lesk, E. Schmidt. Báo cáo khoa học kỹ thuật máy tính số 39, 1975. Phòng thí nghiệm Bell. Đồi Murray, New Jersey.

  • lex & yacc.
    John R. Levine, Tony Mason, Doug Brown.
    O'Reilly & Cộng sự. 1995.

  • Các yếu tố của lý thuyết tính toán.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Hội trường Prentice. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.


6

Không phải là một cuốn sách, mà là một bài viết kỹ thuật và trải nghiệm học tập cực kỳ thú vị nếu bạn muốn biết thêm về trình biên dịch (và siêu máy tính) ... Trang web này hướng dẫn bạn xây dựng một hệ thống trình biên dịch hoàn toàn khép kín có thể tự biên dịch và các ngôn ngữ khác:

Hướng dẫn: Metacompilers Phần 1

Tất cả đều dựa trên một bài viết kỹ thuật nhỏ 10 trang tuyệt vời:

Val Schorre META II: Ngôn ngữ viết trình biên dịch hướng cú pháp

từ trung thực đến thượng đế năm 1964. Tôi đã học được cách xây dựng trình biên dịch từ thời điểm này vào năm 1970. Có một khoảnh khắc kinh ngạc khi cuối cùng bạn tìm hiểu làm thế nào trình biên dịch có thể tự tái tạo ....

Tôi biết tác giả trang web từ thời đại học của tôi, nhưng tôi không có gì để làm với trang web.


Như những người khác nói, là đối số LỚN, tôi nghĩ rằng sushi một nhiệm vụ là công việc cuối cùng cho cử nhân, nó đòi hỏi phải biết RẤT NHIỀU khái niệm về toán học, khoa học máy tính, v.v.
ingconti

Nếu bạn không biết những chủ đề này, bạn thực sự không nên cố gắng xây dựng một trình biên dịch nghiêm túc. Tuy nhiên, nếu bạn có 2-3 năm học đại học về giáo dục khoa học máy tính (lập trình, cấu trúc dữ liệu, ngôn ngữ lắp ráp), bài báo MetaII sẽ phù hợp với bạn.
Ira Baxter

5

Tôi cũng thích hướng dẫn của Crenshaw , bởi vì nó làm cho nó hoàn toàn rõ ràng rằng trình biên dịch chỉ là một chương trình khác đọc một số đầu vào và viết một số ra.

Đọc nó.

Làm việc nếu bạn muốn, nhưng sau đó xem một tài liệu tham khảo khác về cách trình biên dịch lớn hơn và đầy đủ hơn thực sự được viết.

Và đọc On Trusting Trust , để có được manh mối về những điều không thể tin được có thể được thực hiện trong miền này.


5

Nếu bạn quan tâm đến việc viết một trình biên dịch cho một ngôn ngữ chức năng (chứ không phải là một quy trình thủ tục) thì " Thực hiện các ngôn ngữ chức năng: một hướng dẫn " của Simon Peyton-Jones và David Lester là một hướng dẫn tuyệt vời.

Các khái niệm cơ bản về cách thức hoạt động của đánh giá chức năng được hướng dẫn bởi các ví dụ trong một ngôn ngữ chức năng đơn giản nhưng mạnh mẽ được gọi là "Lõi". Ngoài ra, mỗi phần của trình biên dịch ngôn ngữ Core được giải thích bằng các ví dụ mã trong Miranda (một ngôn ngữ chức năng thuần túy rất giống với Haskell).

Một số loại trình biên dịch khác nhau được mô tả nhưng ngay cả khi bạn chỉ tuân theo cái gọi là trình biên dịch mẫu cho Core, bạn sẽ có một sự hiểu biết tuyệt vời về những gì làm cho lập trình chức năng được đánh dấu.


5

Bạn có thể sử dụng BCEL bởi Quỹ phần mềm Apache. Với công cụ này, bạn có thể tạo mã giống như trình biên dịch mã, nhưng đó là Java với API BCEL. Bạn có thể tìm hiểu cách bạn có thể tạo mã ngôn ngữ trung gian (trong trường hợp này là mã byte).

Ví dụ đơn giản

  1. Tạo một lớp Java với chức năng này:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Bây giờ hãy chạy BCELifier với lớp này

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Bạn có thể xem kết quả trên bàn điều khiển cho cả lớp (cách xây dựng mã byte MyClass.java). Mã cho chức năng này là:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

Có rất nhiều câu trả lời hay ở đây, vì vậy tôi nghĩ tôi chỉ cần thêm một câu nữa vào danh sách:

Tôi đã nhận được một cuốn sách tên là Project Oberon hơn một thập kỷ trước, trong đó có một số văn bản được viết rất tốt trên trình biên dịch. Cuốn sách thực sự nổi bật theo nghĩa là nguồn và giải thích rất dễ đọc và dễ đọc. Toàn bộ văn bản (phiên bản 2005) đã được cung cấp dưới dạng pdf, vì vậy bạn có thể tải xuống ngay bây giờ. Trình biên dịch được thảo luận trong chương 12:

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknarou

(Điều trị không rộng rãi như cuốn sách của ông về trình biên dịch)

Tôi đã đọc một vài cuốn sách về trình biên dịch, và tôi có thể thứ hai cuốn sách rồng, thời gian dành cho cuốn sách này rất đáng giá.


4

Không bao gồm trong danh sách cho đến nay là cuốn sách này:

Khái niệm cơ bản về thiết kế trình biên dịch (Torben Mogensen) (từ khoa Khoa học máy tính, Đại học Copenhagen)

Tôi cũng thích tìm hiểu về trình biên dịch và dự định tham gia vào ngành đó trong vài năm tới. Cuốn sách này là cuốn sách lý thuyết lý tưởng để bắt đầu học trình biên dịch theo như tôi có thể thấy. MIỄN PHÍ sao chép và sao chép, viết sạch sẽ và cẩn thận và cung cấp cho bạn bằng tiếng Anh đơn giản mà không cần bất kỳ mã nào nhưng vẫn trình bày các cơ chế bằng cách hướng dẫn và sơ đồ, v.v ... Đáng để xem.


Đã thêm nó vào danh sách cảm ơn :)
Anton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.