Chuyển đổi một trình thông dịch sang một trình biên dịch?


8

Trước hết, tôi biết đây là một câu hỏi được hỏi bởi NHIỀU lập trình viên khác trước tôi. Nhưng tôi không thể tìm thấy bất kỳ tài nguyên có thể sử dụng có thể giúp tôi.

Chà, tôi đang tạo một ngôn ngữ lập trình gọi là "Light", cú pháp có thể so sánh với python nhưng nó có một khái niệm hướng đối tượng nghiêm ngặt.

Tôi đã thực hiện một trình thông dịch (bằng C ++) cho ngôn ngữ này, vấn đề của tôi là làm thế nào để biến ngôn ngữ này thành một tệp thực thi. (Hoặc đơn giản: làm cách nào để tạo trình biên dịch?)

Cảm ơn đã quan tâm

PS: Tôi đã tìm thấy một số liên kết đến một hướng dẫn rất cũ nhưng nó có trong Pascal ...

EDIT: Vâng, tốt. Bây giờ tôi đã tìm thấy một hướng dẫn phù hợp cho C ++. Về dự án: Đã có một số thay đổi. Bây giờ ngôn ngữ được gọi là "Q." (kju Dot).


trước tiên hãy học ngôn ngữ đích, sau đó xem cách bạn dịch các khối mã cơ bản từ ngôn ngữ của bạn sang ngôn ngữ khác
ratchet freak

1
Bạn có "chỉ" đang cố gắng viết một trình biên dịch (với kiến ​​thức nền tảng từ việc triển khai trình thông dịch trước đó cho cùng một ngôn ngữ) hay bạn thực sự đang cố gắng biến trình thông dịch của mình thành trình biên dịch?

4
Một phép chiếu Futamura?
Dan D.

1
Điều đó không quan trọng - chỉ cần chuyên gia phiên dịch của bạn dựa vào một mã nguồn cụ thể để có phiên bản được biên dịch.
SK-logic

Câu hỏi là về kỹ thuật được gọi là "trình biên dịch truy tìm"
Dmitry Ponyatov

Câu trả lời:


12

Một vài bước đầu tiên của từ vựng / phân tích cú pháp (và phân tích, tùy thuộc vào cách cấu trúc đó) có thể giống nhau. Nhưng bạn sẽ cần phải chuyển đổi biểu diễn của mình thành biểu diễn tạo mã. Thông thường LLVM được sử dụng cho những người có sở thích vì nó gần như là thư viện tạo mã miễn phí duy nhất từ ​​xa xung quanh.


Đây chính xác là những gì tôi sẽ viết, nhưng bạn đã nhận nó trước. Có +1.
Mason Wheeler

3
Sai lầm. Đơn giản chỉ cần phát C (hoặc C ++, hoặc bất cứ thứ gì khác) là phổ biến hơn nhiều cho các dự án trình biên dịch sở thích. LLVM phức tạp hơn nhiều. Và JVM hoặc .NET không tệ hơn LLVM cho mục đích này.
SK-logic

Những trình biên dịch này không tạo ra các tệp thực thi, mà OP muốn. Đối với .NET / JVM, nó thực sự phụ thuộc vào ngữ nghĩa của ngôn ngữ của anh ấy.
DeadMG

1
@DeadMG, ghcchẳng hạn, hoàn toàn có khả năng tạo ra các tệp thực thi thông qua C. Cũng như hàng trăm trình biên dịch dựa trên C khác. Có tôn giáo của bạn cấm bạn sử dụng popen(...)trong một trình biên dịch? Sau đó, bạn phải vứt bỏ gccchính nó. Đối với .NET, không giống như JVM, nó có khả năng phục vụ cho khá nhiều ngữ nghĩa, do các tính năng không an toàn của nó.
SK-logic

Tôi đã sử dụng LLVM (với các ràng buộc python) và nó hoạt động như một bùa mê. :)
LaVolpe

4

Nếu tất cả những gì bạn thực sự muốn là một tệp thực thi, bạn có thể nối đoạn script vào cuối trình thông dịch thực thi và để nó chạy nó.

Xem: /programming/5795446/appending-data-to-an-exe

Thay phiên, bạn có thể yêu cầu trình thông dịch tải mã từ một tệp trong cùng thư mục với trình thông dịch và nhận phần lớn kết quả giống nhau, chỉ với nhiều tệp.

Một trình biên dịch thực sự sẽ chuyển đổi mã sang một số ngôn ngữ khác và sử dụng trình biên dịch cho ngôn ngữ đó. Nhưng nếu bạn chỉ muốn phân phối các tệp thực thi, thì không cần phải làm điều đó.


Chà, tôi biết cách đóng gói này :) đã sử dụng nó cho Python (trước khi tôi nghe nói về py2exe). Đối với tôi đây là gian lận và vấn đề khác là hiệu suất. Ngôn ngữ của tôi như thế nào bây giờ là mức độ thấp NHƯNG nghiêm khắc.
LaVolpe

nó không làm cho trình biên dịch chắc chắn, chỉ nhúng trình thông dịch
Dmitry Ponyatov

1
@DmitryPonyatov, bạn cảm thấy cần phải bình luận gần bảy năm sau để nói những gì tôi đã nói trong câu trả lời của tôi?
Winston Ewert

3

Bạn cũng có thể muốn xem xét sử dụng System.Reflection.Emit từ thời gian chạy .NET để tạo tệp thực thi .NET. Điều này sẽ cung cấp cho bạn quyền truy cập vào một môi trường hướng đối tượng hiện có, đã giải quyết một số vấn đề cho bạn và exe kết quả có thể độc lập với nền tảng. Thời gian chạy sẽ biên dịch mã trung gian trong .exe thành mã máy khi cần, do đó hiệu suất phải tương đương với những gì bạn nhận được từ việc biên dịch trực tiếp sang mã gốc.


Có lẽ là một ý tưởng hay, nhưng tôi đã thiết kế ngôn ngữ của mình ở mức độ thấp ở một số điểm;) Bây giờ tôi đang cố gắng tìm hiểu về Tài liệu Opelodes của Intels.
LaVolpe

0

Bạn đang hỏi về kỹ thuật được gọi là "trình biên dịch theo dõi": trình thông dịch thu thập thông tin về thực thi mã và tăng dần xây dựng mã cấp thấp bằng cách sử dụng dữ liệu được thu thập.

https://en.wikipedia.org/wiki/Tracing_just-in-time_compilation

https://stefan-marr.de/ con/oopsla-marr-ducasse-meta-tracing-vs-partial-evalu/

Sự khác biệt so với JIT cổ điển là thực tế là dữ liệu theo dõi được thu thập và mã được biên dịch được bảo toàn khỏi mọi lần chạy chương trình, giúp bạn không chỉ thực thi mã máy mà còn tối ưu hóa dữ liệu thực (hoặc đào tạo). Vượt qua đầu tiên là một tập hợp các bài kiểm tra, phải vượt qua tất cả các nhánh chương trình, để tạo mã cho mọi phần trong chương trình của bạn. Các chương trình tiếp theo là chương trình chạy trên dữ liệu thực (sử dụng sản xuất), thu thập và áp dụng tối ưu hóa (những thứ như thứ tự chi nhánh cho các trường hợp được sử dụng thường xuyên nhất).

Phương pháp này phức tạp hơn nhiều để thực hiện so với sơ đồ xây dựng trình biên dịch cổ điển, vì vậy nó không được sử dụng thường xuyên và rất phức tạp để tìm một bộ hướng dẫn tốt về cách thực hiện trình biên dịch tương tự.

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.