Biên dịch một ngôn ngữ lập trình với chính nó


10

Tôi là một sinh viên khoa học máy tính. Tôi muốn tạo ngôn ngữ lập trình của riêng mình (Một ngôn ngữ cơ bản với một vài hướng dẫn).

Tôi biết làm thế nào để làm một phân tích cú pháp, tôi đã làm nó trong Perl. Trong một bài viết, tôi đã đọc một cái gì đó về trình biên dịch, một trình biên dịch được thực hiện trong chính nó.

Ví dụ, trình biên dịch C được viết bằng C. Làm thế nào có thể? Tôi có thể tạo ngôn ngữ của riêng mình nhưng tôi không biết làm thế nào tôi có thể thực hiện ngôn ngữ đó? Bất kỳ ý tưởng?

Đó thực sự là một câu hỏi hay và tôi có thể viết một blog dự án.


Mọi người đã giải thích làm thế nào để bootstrap nhưng tại sao bạn cần phải? Không có lý do gì bạn không thể biên dịch ngôn ngữ của mình bằng trình biên dịch được viết bằng C, Perl hoặc bất cứ thứ gì khác. Chắc chắn, sẽ rất tuyệt nếu có một trình biên dịch cho ngôn ngữ của bạn được viết bằng chính nó nhưng đó sẽ là rất nhiều công việc - bạn phải viết ít nhất hai trình biên dịch để có được trình biên dịch đó (một trong C / Perl / bất cứ điều gì, một trong ngôn ngữ của bạn).
David Richerby

Hmm .. Tôi nghĩ rằng tôi sẽ viết trình biên dịch đầu tiên của mình bằng C và viết một seconde bằng ngôn ngữ của tôi. Thật thú vị khi tạo ra một ngôn ngữ lập trình nhỏ, chúng ta có thể học được rất nhiều về khoa học máy tính
BaptisteL

Câu trả lời:


13

Bí quyết là bootstrapping . Trước tiên, bạn viết một trình biên dịch cho ngôn ngữ của bạn (hoặc một tập hợp con của nó) bằng một số ngôn ngữ khác. Sau đó, bạn viết một trình biên dịch cho ngôn ngữ của bạn (hoặc một tập hợp con lớn của ngôn ngữ bạn có thể xử lý) bằng ngôn ngữ của bạn. Bạn sử dụng trình biên dịch cũ để biên dịch trình biên dịch mới, và sau đó trình biên dịch mới có thể tự biên dịch.


Vì vậy, tôi có thể tạo trình biên dịch đầu tiên bằng C và lần sau tôi sẽ biên dịch trình biên dịch v2 với v1? Nhưng có một vấn đề, làm sao tôi biết trình biên dịch không có vấn đề gì? Tôi cần chuyển đổi mã nguồn của mình sang trình biên dịch chương trình? Hay trong những điều khác?
BaptisteL

2
Làm thế nào tôi có thể biết trình biên dịch không có bất kỳ vấn đề? Tổng quát hơn, bạn đã viết một chương trình; Làm thế nào để bạn biết nó không có lỗi? Bạn không. Bạn viết một số bài kiểm tra và hy vọng điều tốt nhất. Tôi có cần chuyển đổi mã nguồn của mình để lắp ráp không? Chắc chắn không phải. Bạn có thể tin tưởng vào trình biên dịch C. Bạn đang làm điều tương tự, nhưng với lắp ráp được thay thế bằng C (hoặc bất kỳ ngôn ngữ nào khác bạn chọn).
Yuval Filmus

Được rồi tôi phải tin tưởng vào các kỹ năng của mình ^^ Tôi muốn yêu cầu quá trình làm trình biên dịch. Tôi thực sự không hiểu trình biên dịch làm gì, phân tích cú pháp và từ vựng ổn nhưng tiếp theo ??
BaptisteL

Sau đó, bạn tạo mã. Nếu bạn không muốn tìm hiểu chi tiết về việc tạo mã máy, bạn luôn có thể tạo mã bằng một số ngôn ngữ khác, nói mã C và sử dụng trình biên dịch bên ngoài để biên dịch mã đó thành mã máy. (Hoặc bạn có thể sử dụng ngôn ngữ được thông dịch và chạy trình thông dịch.)
Yuval Filmus

Hummm Không, tôi đã làm điều đó như thế: Ngôn ngữ của tôi khi nhập -> Mã máy. Tôi không muốn chuyển đổi ngôn ngữ của mình sang ngôn ngữ khác (tương tự cho lần biên dịch đầu tiên) Có thể không?
BaptisteL

2

Một trình biên dịch có thể biên dịch các nguồn của chính nó được gọi là trình biên dịch tự lưu trữ . Trình biên dịch ban đầu được viết bằng ngôn ngữ khác. Ví dụ, trình biên dịch C đầu tiên có lẽ được viết bằng trình biên dịch chương trình. Toàn bộ thủ thuật trong việc sử dụng trình biên dịch cấp thấp hơn trước đây được gọi là bootstrapping.

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.