2009-10-12 38 views
6

Tôi có một kinh nghiệm về các cụm từ trình biên dịch và tôi quan tâm đến Ngôn ngữ lập trình & Trường trình biên dịch và tôi hy vọng ai đó cho tôi một số giải thích về cách tiếp cận tốt để viết trình biên dịch mới từ đầu cho ngôn ngữ lập trình mới là gì? (Ý tôi là STEPS).Cách tiếp cận tốt để xây dựng trình biên dịch mới là gì?

Trả lời

9

Bước đầu tiên là đọc Dragon Book.

Nó cung cấp một giới thiệu tốt cho toàn bộ lĩnh vực xây dựng trình biên dịch, nhưng cũng đi vào đủ chi tiết để thực sự xây dựng của riêng bạn.

Đối với các bước sau, tôi đề xuất theo các chương của sách. Nó không được viết như một hướng dẫn, nhưng vẫn cung cấp nhiều lời khuyên thiết thực, mà làm cho nó trở thành một trung tâm lý tưởng cho các ý tưởng và nghiên cứu của riêng bạn.

+2

Xin các bạn, bạn nên * thực sự * dừng trích dẫn cuốn sách rồng ... Đó là một trong những cuốn sách biên dịch tồi tệ nhất trên mạng. Bạn có thể trích dẫn của Appel, Cooper, vv Nhưng * xin vui lòng * không phải là Dragon Book. – tonfa

+1

"Trình biên dịch hiện đại" (Appel) được viết rất nặng và "Kỹ thuật biên dịch" (Cooper) không phù hợp cho người mới bắt đầu. –

+0

Nó không thể tệ hơn cuốn Dragon Dragon phức tạp. Cá nhân tôi đã không tìm thấy cuốn sách Tiger Book được viết sai, mặc dù tôi chưa bao giờ đọc nó từ bìa để trang trải, tôi đã tìm thấy nó có rất nhiều hiểu biết rất tốt. – tonfa

3

Tôi sẽ xem xét tích hợp ngôn ngữ/giao diện người dùng của bạn với khung trình biên dịch GNU.

Bằng cách đó, bạn chỉ (CHỈ!) Cần phải viết trình phân tích cú pháp và trình dịch sang định dạng đối tượng di động của gcc. Bạn nhận được trình tối ưu hóa, tạo mã đối tượng cho con chip của sự lựa chọn, liên kết vv miễn phí.

Một giải pháp thay thế khác là nhắm mục tiêu một JVM Java, máy ảo được tài liệu hóa tốt và tập lệnh JVM có giá trị cao hơn nhiều so với mã máy x86.

+1

Phụ thuộc vào những gì bạn muốn làm. Nếu bạn thực sự muốn biết mọi thứ hoạt động như thế nào từ đầu, GCC là một cách rất khó hiểu. –

5

Vui lòng không sử dụng Sách Rồng, cũ và hầu hết đã lỗi thời (và sử dụng tên kỳ lạ cho hầu hết các nội dung).

Đối với sách, tôi khuyên bạn nên sử dụng Sổ tay hổ của Apple hoặc Trình biên dịch kỹ thuật của Cooper. Tôi muốn khuyên bạn sử dụng một khuôn khổ như llvm vì vậy bạn không cần phải tái thực hiện một loạt các công cụ cho hệ mã vv

Dưới đây là hướng dẫn để xây dựng ngôn ngữ của bạn với llvm: http://llvm.org/docs/tutorial/

2

Tôi quản lý để viết một trình biên dịch mà không có bất kỳ cuốn sách cụ thể (mặc dù tôi đã đọc một số sách biên dịch trong quá khứ, chỉ cần không có trong bất kỳ chi tiết thực tế).

Điều đầu tiên bạn nên làm là chơi với bất kỳ công cụ "trình biên dịch biên dịch" nào (flex, bison, antlr, javacc) và làm cho ngữ pháp của bạn hoạt động. Grammars chủ yếu là đơn giản, nhưng luôn luôn có bit nitty mà có được trong cách và làm cho một đống đổ nát của tất cả mọi thứ. Đặc biệt những thứ như biểu thức, quyền ưu tiên, v.v.

Một số ngôn ngữ đơn giản cũ hơn đơn giản hơn vì một lý do. Nó làm cho các trình phân tích cú pháp "Chỉ làm việc". Hãy xem xét một biến thể Pascal có thể được xử lý chỉ thông qua đệ quy phong nha.

Tôi đề cập đến điều này vì không có ngữ pháp của bạn, bạn không có ngôn ngữ. Nếu bạn không thể phân tích cú pháp và lex nó đúng cách, bạn sẽ nhận được hư không rất nhanh. Và xem một tá dòng mã mẫu trong ngôn ngữ mới của bạn được chuyển sang một loạt các mã thông báo và các nút cú pháp thực sự thực sự tuyệt vời. Trong một "wow, nó thực sự hoạt động" loại cách. Nó gần như là một "nó tất cả các công trình" hoặc "không ai trong số nó hoạt động" loại điều, đặc biệt là lúc đầu. Một khi nó thực sự hoạt động, bạn cảm thấy như bạn có thể thực sự kéo nó đi.

Và ở một mức độ nào đó là sự thật, bởi vì khi bạn hoàn thành phần đó, bạn phải có thời gian chạy cơ bản. Khi bạn nhận được "a = 1 + 1" được biên soạn, phần lớn công việc mới nằm phía sau bạn và bây giờ bạn chỉ cần triển khai phần còn lại của toán tử.Về cơ bản nó trở thành một bài tập quản lý các bảng tra cứu và các tham chiếu, và có một số ý tưởng bạn đang ở bất kỳ thời điểm nào trong tiến trình.

Bạn có thể tự mình sử dụng cú pháp hoàn toàn mới, thời gian chạy sáng tạo, v.v. Nhưng nếu bạn có thời gian, tốt nhất bạn nên làm một ngôn ngữ đã được thực hiện, chỉ để hiểu và thực hiện tất cả các bước và suy nghĩ về việc bạn có đang viết ngôn ngữ bạn thực sự muốn hay không, cách bạn sẽ làm những gì bạn đang làm với ngôn ngữ hiện tại khác.

Có rất nhiều cơ chế để viết trình biên dịch và chỉ thực hiện quy trình thành công một lần sẽ giúp bạn tự tin hơn nhiều khi bạn muốn quay lại và làm lại bằng ngôn ngữ mới của riêng bạn.

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