Tháng 7032011
“Quả trứng và con gà” là một vấn đề tranh cãi chẳng bao giờ có đáp án. Người ta cũng thường mượn tên này để chỉ các vấn đề có dạng tương tự. Trong khoa học máy tính có một vấn đề dạng này rất nổi tiếng và nói chung nó không được nhiều bạn qu
Vậy tại sao xây dựng Trình biên dịch là vấn đề Quả trứng và con gà? Vấn đề là thế này: bạn viết phần mềm bằng ngôn ngữ lập trình, sau đó dùng compiler để dịch thành mã máy. Vấn đề là compiler cũng là một phần mềm, vậy cái gì (phần mềm nào) được dùng để biên dịch ra compiler?
Câu trả lời liên quan tới một thuật ngữ : bootstrapping hoặc cũng thường được gọi là seft-hosting. Quá trình có thể được mô tả như sau :
- Viết một compiler A rất nhỏ để có thể biên dịch được các lệnh cơ bản của ngôn ngữ đích T (target language). Minimum compiler này được viết bằng mã máy nên không cần biên dịch
- Dùng tập lệnh cơ bản của T để viết một version lớn hơn của A, gọi là A1. Dùng A để biên dịch A1
- Quá trình này có thể được lặp lại vài lần: viết A2 và dùng A1 compile A2, viết A3 và dùng A2 compile A3… tới khi có được một compiler (tổng quát hơn là một software) theo mong muốn.
Một phương pháp khác là bắt đầu với một Interpreter.
Thông thường thì trình biên dịch của ngôn ngữ T sẽ được viết bởi T: compiler cho C được viết bằng C, compiler của Java được viết bằng Java, interpreter của Basic được viết bằng Basic… hoặc nếu không viết bằng T thì sẽ được viết bằng C (C là ngôn ngữ phổ biến nhất trong viết OS và compiler)
Nói chung, chỉ compiler đầu tiên mới cần phải trải qua quá trình khó khăn như trên, còn lại trình biên dịch N cho ngôn ngữ T bất kì có thể được viết như sau:
- Có một compiler N1 dùng để biên dịch code của ngôn ngữ T1
- Viết N bằng ngôn ngữ T1
- Dùng N1 để biên dịch ra N
Nguồn: bugcheck
0 nhận xét