Biểu đồ chữ thập


9

Tôi đang nghiên cứu Bootstrapping từ Trình biên dịch sách Red Dragon và thấy sơ đồ T cho trình biên dịch chéo khá khó hiểu. Tôi không thể hiểu ý nghĩa của "Chạy trình biên dịch1 thông qua trình biên dịch2". Bất cứ ai có thể cung cấp một số giải thích tốt hơn, tương tự hoặc một ví dụ để liên quan đến một số trình biên dịch thế giới thực?

Một số ký hiệu đầu tiên. Bởi tôi là một trình biên dịch cho ngôn ngữ L viết bằng ngôn ngữ S sản xuất ngôn ngữ đầu ra / code máy N . Đây là một tấm bia mộ hoặc T-sơ đồ .LSN= = nhập mô tả hình ảnh ở đâyLSN

Biên dịch một trình biên dịch

  1. Giả sử chúng ta có trình biên dịch chéo cho một ngôn ngữ mới L trong ngôn ngữ triển khai S tạo mã cho máy N.

    LSN= =
    Sơ đồ T cho LSN

  2. Giả sử chúng ta cũng có một trình biên dịch S hiện có đang chạy trên máy M thực thi mã cho máy M:

    SMM= =
    Sơ đồ T cho SMM

  3. Chạy LSN thông qua SMM để sản xuất LMN

Trình biên dịch xây dựng

LMN= =LSN+SMM
Sơ đồ T cho LMN = LSN + SMM


Tôi đã thêm một số sơ đồ T, điều này thực sự sẽ giúp dễ hiểu những gì đang diễn ra. Hy vọng ai đó có thể tốt một cách tốt hơn để hiển thị chúng.
Dave Clarke

Câu trả lời:


11

Các sơ đồ T (mà bạn đã bỏ qua từ phiên bản gốc của câu hỏi của bạn) rất quan trọng để hiểu loại câu hỏi này. Hãy nhìn vào sơ đồ T cuối cùng.

nhập mô tả hình ảnh ở đây

T đầu tiên mô tả một trình biên dịch từ L đến N được viết bằng S.

T thứ hai mô tả một trình biên dịch từ S đến M được viết bằng M (hoặc chạy trên M). Đây sẽ là trình biên dịch trình biên dịch của bạn .

Áp dụng T thứ hai cho T đầu tiên biên dịch T đầu tiên để nó chạy trên máy M. Kết quả là một trình biên dịch từ L đến N chạy trên máy M.

Thực tế là T thứ hai cũng chạy trên máy M cho thấy bạn đang chạy trình biên dịch trình biên dịch trên máy mà bạn sẽ chạy trình biên dịch, thay vì phải sử dụng trình biên dịch chéo (sẽ là trường hợp nếu M dưới cùng khác ).


5

Điều đó có nghĩa là chúng tôi biên dịch LSN với SMM, nghĩa là chạy mã nguồn của LSN thông qua SMM.

Khi SMM biên dịch một số mã nguồn, nó tạo ra một tệp thực thi cho máy M, vì vậy khi chúng tôi biên dịch LSN với SMM, chúng tôi nhận được LMN - một tệp thực thi, biên dịch các tệp nguồn L trên máy M để tạo ra các tệp thực thi cho máy N.

Có lẽ sẽ dễ dàng hơn để hiểu điều này với một sự tương tự. Supppse chúng tôi có một trình biên dịch C ccđược viết bằng Fortran, tạo mã ARM. Giả sử chúng ta cũng có trình biên dịch Fortran fctrên máy tính x64. Nếu chúng tôi biên dịch ccmã nguồn với fcchúng tôi sẽ có một chương trình chạy trên x64, biên dịch các chương trình C, nhưng tạo ra các tệp thực thi cho ARM.


0

Để làm cho nó đơn giản ....

Lưu ý: Ghi nhớ Trình biên dịch chỉ có thể chạy trên ngôn ngữ cấp thấp.

Trong Sơ đồ 1, trình biên dịch được viết bằng HLL (High Level Langg) để sắp xếp để chạy trên máy, langg của trình biên dịch phải ở trong LLL.

Vì vậy, trong Sơ đồ 2, langg triển khai của trình biên dịch được chạy trên trình biên dịch tự cư trú sao cho mã đích có thể chạy trên máy của chính nó.

Cuối cùng, kết hợp cả hai trình biên dịch chạy trên máy với langg - M

đầu vào langg - L

đầu ra Langg - N

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.