2012-02-24 30 views
174

Điều này đã làm tôi thất vọng một thời gian. Làm thế nào để gcc/g ++ tự biên dịch? Tôi đoán rằng mọi sửa đổi sẽ được biên dịch với bản sửa đổi được xây dựng trước đó. Điều này có đúng không? Và nếu nó là, nó có nghĩa là phiên bản g ++/gcc lâu đời nhất được viết trong hội đồng?Khởi động gcc/g ++ như thế nào?

+13

Mỗi bản sửa đổi cuối cùng có thể được biên dịch bởi chính nó. :) –

+4

[Điều này] (http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html) là thú vị để đọc nếu bạn muốn xem làm thế nào các trình biên dịch đầu tiên đến. – parkovski

+1

@parkovski Liên kết có bị chết không? – Nubcake

Trả lời

167

Phiên bản cũ nhất của GCC được biên dịch bằng trình biên dịch C khác, vì có các trình biên dịch khác khi được viết. Trình biên dịch C đầu tiên bao giờ (khoảng năm 1973, IIRC) được thực hiện hoặc trong lắp ráp PDP-11, hoặc bằng ngôn ngữ lập trình B trước đó, nhưng trong bất kỳ trường hợp nào trình biên dịch B được viết trong assembly. Tương tự, trình biên dịch C++ đầu tiên (CPre/Cfront, 1979-1983) có lẽ được triển khai lần đầu tiên trong C, sau đó được viết lại trong C++.

Khi bạn biên dịch GCC hoặc bất kỳ trình biên dịch tự lưu trữ khác, trình tự đầy đủ của tòa nhà là:

  1. Xây dựng phiên bản mới của GCC với trình biên dịch C hiện
  2. tái xây dựng phiên bản mới của GCC với người bạn vừa xây dựng
  3. (tùy chọn) lặp lại bước 2 cho mục đích xác minh.

Quy trình này được gọi là bootstrapping. Nó kiểm tra khả năng biên dịch của trình biên dịch và đảm bảo rằng trình biên dịch kết quả được xây dựng với tất cả các tối ưu hóa mà nó tự thực hiện.

EDIT: Drew Dormann, trong phần nhận xét, trỏ tới tài khoản của Bjarne Stroustrup là earliest implementation of C++. Nó được thực hiện trong C++ nhưng được dịch bởi những gì Stroustrup gọi là "preprocessor" từ C++ thành C; không phải là một trình biên dịch đầy đủ theo định nghĩa của mình, nhưng vẫn C++ được khởi động trong C.

+1

Không phải bước 2 thường được lặp lại một vài lần? Tôi tin rằng 'clang' làm điều đó. – bitmask

+0

Tôi không hiểu tại sao, ngoại trừ thử nghiệm. Giả sử trình biên dịch ban đầu thực hiện ngôn ngữ một cách chính xác, nó xây dựng một trình soạn thảo chính xác mặc dù có lẽ là suboptimal, trong khi bước 2 sẽ thực hiện tất cả các tối ưu hóa mà trình biên dịch mới có. Các nhị phân cuối cùng không nên thay đổi sau bước 2. –

+19

Phiên bản 3 bước của quá trình xây dựng bootstrap thực sự là để xác minh: bản thân trình biên dịch được sử dụng làm trường hợp thử nghiệm riêng của nó. GCC được biên dịch với [other] sẽ tạo ra các kết quả tương tự (các tệp nhị phân giống nhau, các macro chiết khấu như '__DATE__' và' __TIME__' thay đổi ngay cả giữa các lời gọi của trình biên dịch * cùng * như GCC được biên dịch với [GCC được biên dịch với [other]] - nếu không, đó là một lỗi, và xây dựng bootstrap 3 giai đoạn được thiết kế để nắm bắt điều đó. – pmdj

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