Đ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?
Trả lời
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à:
- Xây dựng phiên bản mới của GCC với trình biên dịch C hiện
- 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
- (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.
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
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. –
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
- 1. Làm thế nào để khởi động máy chủ xách tay ipython lúc khởi động như daemon
- 2. Phương thức khởi tạo tĩnh hoạt động như thế nào?
- 3. PyCrypto - Vector khởi tạo hoạt động như thế nào?
- 4. Hàng đợi 'fx' trong tự động khởi động jquery như thế nào?
- 5. Trình tải khởi động của Raspberry Pi hoạt động như thế nào?
- 6. DirectX - VertexBuffer hoạt động như thế nào?
- 7. Haskell: TVar hoạt động như thế nào?
- 8. C# Events hoạt động như thế nào?
- 9. Tiêu đề() hoạt động như thế nào?
- 10. Tôi nên khởi tạo tăng :: mảng như thế nào?
- 11. onNavigationItemSelected in ActionBar đang được gọi khi khởi động như thế nào có thể tránh nó?
- 12. Tôi nên sử dụng thành phần glyphicons của trình khởi động Twitter như thế nào?
- 13. Trình nạp lớp khởi động Java được tải như thế nào?
- 14. Twitter Lưới khởi động không hoạt động như mong đợi
- 15. Tôi nên tạo một vectơ khởi tạo như thế nào?
- 16. Giá trị $ {user.home} được khởi tạo như thế nào?
- 17. Spring HandlerInterceptors được khởi tạo như thế nào?
- 18. Hạt nhân CUDA được khởi chạy như thế nào?
- 19. Làm thế nào để đảm bảo đơn vị khởi động khi khởi động hệ thống?
- 20. __iter__ hoạt động như thế nào?
- 21. [UIAlertView show] hoạt động như thế nào?
- 22. Traceroute hoạt động như thế nào?
- 23. ArrayAccess hoạt động như thế nào?
- 24. jQuerys $ .each() hoạt động như thế nào?
- 25. DisplacementMapFilter hoạt động như thế nào?
- 26. MenuItem.SHOW_AS_ACTION_IF_ROOM hoạt động như thế nào?
- 27. GetContentResolver() hoạt động như thế nào?
- 28. P6SPY hoạt động như thế nào?
- 29. Trò chuyện hoạt động như thế nào?
- 30. objc_setAssociatedObject hoạt động như thế nào?
Mỗi bản sửa đổi cuối cùng có thể được biên dịch bởi chính nó. :) –
[Đ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
@parkovski Liên kết có bị chết không? – Nubcake