Trình biên dịch gcc C có được viết bằng chính C không?


87

Trình biên dịch gcc C có được viết bằng chính C không? Hay nó được viết trong Assembly? Nếu trình biên dịch được viết bằng C, thì trình biên dịch dùng để biên dịch mã trình biên dịch là gì?


12
Vâng, nó là (chủ yếu). Tất nhiên, người ta cần một trình biên dịch C để biên dịch C, như với hầu hết các trình biên dịch, có một loạt các giai đoạn "boot-strap". Ý tưởng chung được đề cập tại Cài đặt GCC: Xây dựngCài đặt GCC - LFS .

2
Các máy trạm thương hiệu khác nhau trong những năm 1980 và đầu những năm 90 có môi trường giống như unix của riêng chúng với trình biên dịch c, các công cụ, v.v. tất cả đều khác nhau một chút. Với nguồn GCC, bạn có thể thực hiện biên dịch ban đầu của gcc trên một trong những nền tảng này, sau đó biên dịch gcc với chính nó một vài lần để ít nhiều kiểm tra một điểm cố định.
Paul

Câu trả lời:


98

Lịch sử cụ thể của gcc được cung cấp tại GCC Wiki . Điểm tổng quát hơn là các trình biên dịch thường được biên dịch ban đầu với một số trình biên dịch khác cho đến khi chúng đủ mạnh để tự biên dịch. Ngoài ra, có thể viết một trình biên dịch cơ bản có thể xử lý một tập hợp con các tính năng của bạn trong trình hợp dịch và xây dựng từ đó. Nhưng một lần nữa, điều này hầu như không bao giờ cần thiết nữa. Có rất nhiều trình biên dịch có sẵn, với nhiều ngôn ngữ khác nhau. Ngay cả khi Stephen Johnson đang viết pcc (một trong những trình biên dịch C đầu tiên), đã có những trình biên dịch cho B, cùng với nhiều ngôn ngữ khác. gcc có một số trình biên dịch để lựa chọn để xây dựng nó ban đầu và RMS cho biết anh ta đang sử dụng trình biên dịch Pastel ít nhất trong quá trình phát triển ban đầu của mình.

Hãy nhớ rằng không có yêu cầu rằng trình biên dịch C phải được viết bằng C. Bạn có thể viết nó bằng Perl nếu bạn muốn. Không có yêu cầu rằng một trình biên dịch cho một nền tảng nhất định phải được viết ban đầu trên nền tảng đó (các hệ thống nhúng hầu như luôn được biên dịch trên một số hệ thống khác). Vì vậy, có nhiều cách để giúp bạn khởi động.

Câu hỏi này có một số điều tinh tế thú vị liên quan đến trường hợp đầu tiên của việc khởi động trình biên dịch. Nếu bạn rất thông minh, bạn có thể sử dụng chiếc bootstrap đó để làm một điều gì đó phi thường, tuyệt vời và đáng sợ .


Woah, bài báo thứ hai mà bạn liên kết đến thật là thông minh.
Ponkadoodle,

1
Cảm ơn vì liên kết bootstrapping tuyệt vời. Tôi đã giả định rằng trình biên dịch luôn viết bằng ngôn ngữ đơn giản hơn tất cả các cách trở lại mã máy cho loại lý do này. (Ví dụ: điều gì sẽ xảy ra nếu bạn nhận ra rằng tệp nhị phân cho trình biên dịch của bạn có lỗi? Điều này tất nhiên cung cấp một ví dụ mạnh mẽ hơn nhiều.) Vậy những lợi thế của việc viết trình biên dịch bằng ngôn ngữ riêng của nó là gì? Những người cực kỳ hoang tưởng có lo lắng về điều này và xây dựng trình biên dịch của họ mà không có bootstrapping "tự" không?
RoG

4
Một số nhóm ngôn ngữ coi việc có thể tự biên dịch là một vinh dự. Go gần đây đã tạo ra một cú hích lớn theo hướng này. Mặt khác, Swift đáng chú ý là hiện tại không có kế hoạch viết lại trình biên dịch của họ bằng Swift. Tuy nhiên, lưu ý rằng GCC luôn được viết bằng C. Nó chỉ được biên dịch với các trình biên dịch khác. Nhưng nếu tất cả các trình biên dịch C được viết bằng BCPL, thì điều đó sẽ không khắc phục được bất cứ điều gì liên quan đến chứng hoang tưởng. Nó chỉ đưa vấn đề lùi lại một bước. (Bạn sẽ nhận được những lợi ích tương tự hoang tưởng bằng cách chỉ cần biên dịch GCC w / kêu vang.)
Rob Napier

Lưu ý rằng gcc có chính sách rằng gcc phiên bản chính X luôn có thể được biên dịch với phiên bản chính gcc X-1, vì vậy mọi tính năng mới được thêm vào trình biên dịch trong X chỉ có thể được sử dụng trong chính nguồn gcc từ X + 1. Ví dụ: bạn sẽ có thể biên dịch bất kỳ phiên bản gcc 9 nào, bất kể số phiên bản nhỏ là gì, với bất kỳ gcc 8 nào, một lần nữa cho dù phiên bản nhỏ là gì.
Baruch

51

Ban đầu nó được viết bằng một số ngôn ngữ lắp ráp sau đó nó bắt đầu tự làm thức ăn cho chó.


2
Tôi chưa thấy bất kỳ tham chiếu nào đến RMS sử dụng trình hợp dịch cho bootstrap gốc. Nguồn của bạn cho điều đó là gì? Anh ấy có một số trình biên dịch khác để khởi động, vì vậy có vẻ như rất nhiều việc.
Rob Napier

17
Tôi mặc dù thuật ngữ này là bootstrap.
Martin York

7
hahaha Tôi đã đọc cái này vài tuần trước và nghĩ rằng bạn đã mất trí với biểu cảm đó, không nhận ra nó là tiêu chuẩn. Tốt Hiển thị thưa ông! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

Mặc dù đây rõ ràng chỉ là một chỉ số rất sơ sài, nhưng tôi thấy danh sách nhanh này trên gcc-5.1.0-src/gcc/danh bạ rất thú vị. Thư mục này chứa các nguồn chính của chính GCC (ngoại trừ các thư viện thời gian chạy).

Dưới đây là số lượng tệp hàng đầu (hơn 100) được nhóm theo phần mở rộng được thống trị bởi các tệp C và C ++.

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

Xin lưu ý rằng ngày nay GCCđề cập đến Bộ sưu tập trình biên dịch GNU, không chỉ là Trình biên dịch GNU C.

6.3 Thư mục con gcc

Thư mục gcc chứa nhiều tệp là một phần của nguồn C của GCC, các tệp khác được sử dụng như một phần của quá trình cấu hình và xây dựng, và các thư mục con bao gồm tài liệu và testsuite.

Tham khảo: https://gcc.gnu.org/onlineocs/gccint/gcc-Directory.html

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.