2012-01-12 31 views
6

Gần đây tôi đã rất quan tâm đến các trình biên dịch và cách chúng hoạt động. Vì gcc có sẵn nguồn, tôi đã nghĩ nó sẽ là tài liệu tốt nhất để nghiên cứu.Học tập gcc internals

Điều đầu tiên tôi nhận ra là sẽ vô ích khi nghiên cứu gcc nếu tôi không hiểu cơ bản về các nguyên tắc thiết kế trình biên dịch đơn giản. Tôi đã từ từ đọc cuốn sách "Dragon Book", từ những gì tôi đã thấy, là cuốn sách thực tế về việc triển khai trình biên dịch.

Không có gì ít, việc đọc sách đó chỉ làm tăng thêm mong muốn tìm hiểu về các trình biên dịch như gcc.

Ngoài ra, tôi thấy nó thích hợp để nói rằng tôi có một sự hiểu biết trung gian của c/c + + (aka, tôi không cố gắng để nghiên cứu gcc mà không biết c). Tôi hy vọng rằng nghiên cứu gcc cũng sẽ giúp tôi cải thiện điều đó.

Tôi đã tải xuống bản dựng mới nhất mà tôi có thể tìm thấy; tuy nhiên, tôi bị lạc khi đọc mã nguồn.

Điều tôi đang tìm kiếm là các đề xuất về cách tiếp tục. Có một dự án tương tự, mà không phải là quá lớn, tôi có thể sử dụng như một bước đệm để gcc? Có một mô-đun cụ thể của gcc mà một trong những đề nghị học tập đầu tiên? Có bất kỳ cuốn sách nào đi vào triển khai của gcc hay không, thay vì nó sử dụng? Có lẽ tôi nên ngừng rên rỉ và chỉ tiếp tục đọc nguồn cho đến khi nó nhấp?

Bất kỳ và tất cả phản hồi sẽ được đánh giá rất nhiều.

EDIT: Nếu bạn nghĩ rằng tôi nên nghiên cứu một trình biên dịch/thông dịch viên khác, tôi sẽ đánh giá rất cao các đề xuất về những đề xuất nào.

+3

Bạn nên đọc cuốn sách rồng sau đó viết trình biên dịch của riêng bạn. Nó giúp rất nhiều. –

+2

Tôi nghe nói GCC là một nỗi đau để hack. Có thể LLVM sẽ là một giải pháp thay thế? – Blender

+0

1. Bạn nên hiểu ngôn ngữ hoàn toàn ở cấp độ chuyên gia 2. Viết trình biên dịch của riêng bạn cho một ngôn ngữ nhỏ đầu tiên 3. GCC là một mớ hỗn độn. Có nhiều lựa chọn thay thế tốt hơn – Pubby

Trả lời

6

Nếu bạn muốn xem xét một trình biên dịch rất nhỏ, tôi muốn giới thiệu sốcủa Fabrice Bellard.

Cũng đáng nói đến, Fabrice Bellard đã thắng cuộc thi mã c bị bẻ khóa với số Obfuscated Tiny C Compiler của mình. Có một phiên bản deobfuscated là tốt, và nó phù hợp trong một single c file.

Đây sẽ là điều tuyệt vời nếu bạn muốn thứ gì đó nhỏ và dễ quản lý để học hỏi.

+0

'8c' từ plan9 cũng khá dễ đọc. – Dave

5

Tôi chắc chắn sẽ xem xét clang/LLVM. Tôi nghĩ rằng cơ sở mã là rất dễ đọc. Một lựa chọn rất khả thi mà bạn có là sử dụng LLVM như một đầu cuối và viết lexer và phân tích cú pháp đơn giản của riêng bạn.

+2

Tôi đồng ý, LLVM tốt hơn nhiều cho việc học/hack hơn gcc. Ở trường tốt nghiệp, khóa học trình biên dịch đã sử dụng LLVM cho các dự án. – TJD

+1

Tuyên bố từ chối trách nhiệm: Tôi hơi thiên vị. Dự án trình biên dịch của tôi đang sử dụng LLVM: http://ellcc.org :-) –

0

Tôi nghĩ đọc sách "ruby dưới kính hiển vi" là tốt và thực hành với phát triển lõi hồng ngọc, trước khi đọc mã của gcc. Nhưng bạn cần kiến ​​thức về lập trình ruby. Đó là về ruby ​​internels.

Như tôi biết cuốn sách hay nhất về gcc là "hướng dẫn dứt khoát để gcc" https://www.amazon.com/Definitive-Guide-GCC-Guides-Paperback/dp/1590595858. Mặc dù nó là một chút cũ, tôi nghĩ rằng bạn nên đọc này.

0

Đam mê về các trình biên dịch cũng vậy, tôi đã học được rất nhiều từ cuốn sách của Niklaus Wirth Algorithms + Data Structures = Programs. Một trong những chương cuối cùng mô tả các ngôn ngữ Pascal-0, và các chương trước cho thấy cách phân tích cú pháp và biên dịch một ngôn ngữ rất tối giản. Pascal-0, PL/0 là các trình biên dịch hai bước, chúng tạo ra p-code, đó là 'mã máy' cho một máy ảo tối giản (không giống Java).

This page describes a PL/0 virtual machine instruction set và cuối cùng, liên kết tới trình biên dịch PL/0 và thông tin thú vị khác.

Niklaus Wirth has always had a knack để viết mã có thể đọc và được cấu trúc tốt.Đây là định nghĩa ngôn ngữ và nhiều liên kết thú vị khác.

Ưu điểm của việc nghiên cứu và sử dụng Pascal, là ngôn ngữ rất có cấu trúc và không phải là sự tiến hóa từ Assembler (như C). Nó làm cho việc biên dịch dễ dàng hơn nhiều. Nó thậm chí không cần thiết để thực hiện nhiều lần ...