2012-03-19 25 views
16

Tôi hiểu cấu trúc của trình biên dịch liên quan đến front-end và back-end. Tuy nhiên, tôi không chắc tại sao trình biên dịch thường được chia thành front-end và back-end. Tôi chắc chắn có nhiều lý do bạn có thể cho tôi một vài? bởi vì, hầu hết các sách/trang web đều cho bạn biết chúng là gì nhưng không cho bạn biết tại sao!Trình biên dịch - đầu cuối phía trước cuối

Cảm ơn bạn.

Trả lời

7

Nếu bạn đang nói về fron-end là trình phân tích cú pháp mã hóa mã nguồn và back-end là bit tạo mã thực thi dựa trên mã được mã hóa, thì một lý do rất tốt là: tính di động.

Tách trình phân tích cú pháp khỏi việc tạo mã thực thi giúp việc chuyển một trình biên dịch từ một cấu trúc bộ vi xử lý trở nên dễ dàng hơn nhiều.

48

Giao dịch đầu cuối với chính ngôn ngữ đó: quét, phân tích cú pháp, phân tích cú pháp cây. Phần cuối giao dịch với hệ thống đích: các định dạng mã đối tượng, chính mã máy, ... Hai thứ không có nhiều thứ để làm với nhau, và đối với một trình biên dịch di động, nó rất mong muốn sử dụng front-end với nhiều backend, một cho mỗi mục tiêu.

Bạn có thể thực hiện thêm, vì gcc thực hiện và có giao diện phía trước/phụ trợ độc lập với ngôn ngữ, vì vậy bạn có thể sử dụng giao diện người dùng ngôn ngữ khác với cùng một chương trình phụ trợ. Trong những ngày cũ này được gọi là vấn đề MxN: bạn không muốn phải viết trình biên dịch MxN, nơi bạn có các ngôn ngữ M và N hệ thống đích. Ý tưởng là chỉ phải viết trình biên dịch M + N.

+0

Bạn có thể vui lòng cho tôi biết trình biên dịch M + N như thế nào? Tôi nghĩ rằng chúng tôi có M kết thúc trước để chuyển đổi sang máy phát mã ICG và N để chuyển đổi sang mã máy mục tiêu. Bạn có đang xem xét từng giao diện người dùng và phần cuối của trình biên dịch không? – Zephyr

+0

@ Zephyr, Nếu không có sự kết hợp FE/BE, chúng tôi sẽ cần nhiều hoán vị không cần thiết/khó sử dụng. –

+0

@Zephyr Có, một kết thúc trước/kết thúc kết thúc trở lại là một trình biên dịch. Chắc chắn điều này là hiển nhiên? – EJP

4

Vì bạn muốn sử dụng một số loại mã giả hoặc bảng/cấu trúc dữ liệu nội bộ. Ví dụ, nếu bạn có một số dòng mã:

a = b + c; 

Bạn sẽ muốn đi đó và phá vỡ nó thành một

load b 
load c 
add b + c 
store a 

làm ví dụ, nhiều giải pháp. Ngôn ngữ nội bộ có lẽ tốt hơn là đi thẳng đến hội đồng cho một mục tiêu cụ thể vì một vài lý do. Ngôn ngữ nội bộ là hy vọng một cái gì đó có thể được tối ưu hóa nếu bạn có một trình tối ưu hóa, và là chung chung, đủ để được sử dụng trên nhiều mục tiêu nếu bạn có một mong muốn nhắm mục tiêu bộ vi xử lý khác nhau.

Tôi không biết đủ về nó nhưng tôi nghĩ bạn cũng có các trình phân tích cú pháp được sử dụng phổ biến bison/flex, đun sôi bạn thành một số mã trung gian/tập lệnh và sau đó bạn viết một phụ trợ cho điều đó.

Bạn cũng được hưởng lợi, ví dụ bạn có thể có C và C++ và giao diện người dùng ngôn ngữ khác mà không ảnh hưởng đến chương trình phụ trợ.

Bạn cũng được lợi từ việc bẻ khóa trình biên dịch thành các khối mô-đun logic, bạn có thể phát triển và kiểm tra giao diện người dùng độc lập từ đầu sau. Ví dụ: llvm, cho phép xuất và nhập ngôn ngữ trung gian, bạn có thể thực sự muốn viết mã bằng ngôn ngữ trung gian và có lợi ích của nhiều mục tiêu trên chương trình phụ trợ.

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