2009-07-06 89 views
33

Sau hơn một thập kỷ mã hóa C/C++, tôi đã nhận thấy mô hình sau đây - những người lập trình rất giỏi có xu hướng có kiến ​​thức chi tiết về nội bộ của trình biên dịch.Trình biên dịch C/C++ hoạt động như thế nào?

Tôi là một lập trình viên hợp lý, và tôi có một bộ sưu tập đặc biệt là "mê tín dị đoan" của trình biên dịch, vì vậy tôi muốn khởi động lại kiến ​​thức của mình và bắt đầu từ những điều cơ bản.

Có ai có thể giới thiệu liên kết đến các tài nguyên trực tuyến hoặc sách yêu thích không? Tôi đặc biệt quan tâm đến biên dịch C/C++, tối ưu hóa, GCC và LLVM.

+4

Hãy xem tại đây để biết các tài nguyên: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

Trả lời

28

Bắt đầu với cuốn sách rồng .... (căng thẳng thêm về tối ưu hóa mã và sinh mã)

Go vào ghi một trình biên dịch đồ chơi cho một ngôn ngữ lập trình giáo dục như khử caffein hoặc mát .., bạn có thể sử dụng máy phát điện phân tích cú pháp (lex và yacc) cho giao diện người dùng của bạn (để làm cho cuộc sống dễ dàng hơn và tập trung vào nhiều thứ khác) ....

Sau đó đọc sách nội bộ gcc cùng với mã nguồn gcc duyệt.

+2

Cảm ơn, trình tự đẹp. Tôi lấy cuốn sách rồng là: http://en.wikipedia.org/wiki/index.html?curid=188976 – Justicle

+2

Vâng, đó là cuốn sách rồng. Tôi đọc ấn bản thứ nhất. Nó có một con rồng đơn giản hơn nhiều ... – RBerteig

+2

Gah. Mọi người tiếp tục đề xuất điều này. Không phải tôi. Bắt đầu với một giới thiệu giản dị --- nói "Hãy xây dựng một trình biên dịch" --- sau đó nhìn vào một tài liệu tham khảo khoa học máy tính với tất cả các môn toán và lý thuyết. – dmckee

10
+0

Tôi đã thử qua sổ tay nội bộ GCC, có vẻ như không hữu ích cho việc "Học tập "cách trình biên dịch hoạt động. Nó không phải là một tài liệu giảng dạy nó giả định rằng bạn đã có một kiến ​​thức về chủ đề này. – NoMoreZealots

2

Tùy thuộc vào những gì bạn chính xác muốn biết, bạn nên xem ống & mẫu bộ lọc, vì theo tôi biết điều này (hoặc một cái gì đó tương tự) được sử dụng trong nhiều trình biên dịch trong những năm qua.

Khi kiến ​​thức biên dịch của tôi là không quá lỗi thời nó hoạt động như thế này:

Parse sourcecode vào biểu tượng

Dọn dẹp đại diện tượng trưng, ​​làm một số bình thường

Tối ưu hóa của cây biểu tượng dựa trên một số quy tắc

viết mã thực thi dựa trên cây tượng trưng

Tất nhiên phụ thuộc vv cũng phải được giải quyết.

Và tất nhiên, hãy xem mã nguồn gcc hoặc javac có thể giúp hiểu rõ hơn.

1

Cũng có thể có giá trị để nhận và đọc mã nguồn cho trình biên dịch. Tôi nghi ngờ rằng GCC là lựa chọn đầu tiên tốt nhất, vì nó được gánh nặng với khả năng tương thích hoàn toàn với hơn 20 năm phát triển của ngôn ngữ. Nhưng tôi cũng chắc chắn rằng việc đọc nguồn của nó, được hướng dẫn bởi một trong các tài liệu tham khảo nội bộ, sẽ mang tính giáo dục.

Tôi cân nhắc nghiêm túc xem xét nguồn tới ngôn ngữ kịch bản được biên dịch nội bộ sang mã byte cho máy ảo. Một số ngôn ngữ phù hợp với mô tả đó, nhưng tôi sẽ bắt đầu với Lua. Ngôn ngữ là nhỏ, và VM là cuốn tiểu thuyết. Các source code cũng nhỏ và các bit tôi đã nhìn đã rất rõ ràng mặc dù nhẹ nhận xét.

11

Văn bản trình biên dịch là tốt, nhưng chúng hơi nặng để tự học. Jack Crenshaw có một "cuốn sách" là một loạt các bài báo bạn có thể tải xuống và đọc cuộc gọi "Cho phép xây dựng một trình biên dịch." Nó tuân theo phương pháp "Tìm hiểu bằng cách làm" rất tuyệt vời nếu bạn không nhận được bất cứ điều gì ngoài việc tham gia các lớp học chính thức về chủ đề này, hoặc nó đã được WAY quá nhiều năm kể từ khi nhận nó (đó là trường hợp của tôi). Nó giữ bàn tay của bạn và dẫn bạn thông qua viết một trình biên dịch thay vì smacking bạn xung quanh với Lambda Calculus và các vấn đề lý thuyết sâu sắc mà chỉ có học viện quan tâm. Đó là một cách hay để khuấy động những tế bào não mà chỉ có một ký ức mờ nhạt khi viết một cái gì đó trên Vax (YEAH, đúng VAX!) Nhiều mặt trăng trước đây ở trường. Nó được viết rất hợp lý và dễ dàng để chỉ ngồi xuống và đọc, không giống như hầu hết các cuốn sách văn bản đòi hỏi một vài bình cà phê chỉ để vượt qua chương đầu tiên. Một khi bạn có một cơ sở cho sự hiểu biết thì văn bản truyền thống hơn như cuốn sách Dragon là tài liệu tham khảo tuyệt vời để mở rộng trên sự hiểu biết của bạn. (Và cá nhân tôi thích các phiên bản Dead Tree, tôi đã in ra Jack's, nó dễ đọc hơn ở một vị trí thoải mái hơn là trên một chiếc laptop. Và độc giả của Ebook quá đắt so với những thứ không thực sự cảm thấy như bạn đang đọc Cuốn sách thực sự nào.)

Những gì có thể gọi là "nhược điểm" là nó được viết bằng Pascal, nhưng tôi nghĩ điều đó khiến tôi nghĩ về nó nhiều hơn nếu ai đó đã cho tôi một chương trình C bắt đầu. Appart từ đó nó được viết với 68000 trong tâm trí, mà chỉ được sử dụng trong các hệ thống nhúng vào thời điểm này. Một lần nữa đối với tôi đây không phải là một vấn đề, tôi biết 68000 asm và 68000 asm dễ đọc hơn một số asm khác.

4

Theo ghi nhận của Pete Eddy, hướng dẫn của Jack Crenshaw rất tuyệt vời cho người mới. Nhưng nếu bạn muốn xem làm thế nào để một sản, sản xuất C   trình biên dịch làm việc — một trong đó là thiết kế bởi các kỹ sư rực rỡ thay vì tạo ra bằng cách ném mã ở trên tường cho đến khi một cái gì đó bị mắc kẹt — có được cho mình một bản sao của Fraser và Hanson của A Retargetable C Compiler: Design and Implementation , chứa mã nguồn cho trình biên dịch lcc rất sạch sẽ. Giải thích về thiết kế và thực hiện được trộn lẫn với mã. Đây không phải là cuốn sách đầu tiên dành cho người mới bắt đầu, nhưng nó sẽ hoàn trả cho việc học cẩn thận và bạn có thể nhận được một bản sao đã sử dụng cho   $ 35.

Để có khoảng thời gian dài hơn về số lcc, hãy xem Compile C Faster on Linux.

Trang web lcc cũng có liên kết đến một số sách giáo khoa hay. Tuy nhiên, tôi không biết văn bản giới thiệu mà tôi thực sự thích.

P.S. Xin lỗi bạn đã bị gạt tại Uni.

+0

Cảm ơn bạn đã tip - Tôi sẽ kiểm tra lcc out – Justicle

+0

Kỹ sư Brillant? Jack Crenshaw thiết kế các bộ phận của tàu con thoi không gian, và các máy tính gia đình là một HOBBY của mình. Không tranh chấp trí tuệ của những người đã viết lcc, nhưng bạn không cần phải xuất sắc để thiết kế một trình biên dịch. Nó thực sự không phải là khó. – NoMoreZealots

+1

Tài liệu tham khảo không phải là Crenshaw mà là gcc. RMS là nhiều thứ, nhưng kỹ sư xuất sắc không phải là một trong số họ. Sau đó, thêm 1000 con khỉ và khuấy đều ... –

0

có một cái nhìn vào Kaleidoscope. Bạn có thể viết trình biên dịch của riêng bạn chỉ trong vài ngày với LLVM.

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