2014-12-21 16 views
5

Mã nguồn trong mã nguồn GCC thực sự xây dựng hội đồng cho các kiến ​​trúc khác nhau ở đâu?Ở đâu trong mã nguồn GCC nó biên dịch sang các ngôn ngữ lắp ráp khác nhau?

Tự hỏi có bao nhiêu ngôn ngữ lắp ráp khác nhau mà nó biên dịch và cách nó thực sự thực hiện điều này (bằng cách xem mã nguồn).

Có trong repo gcc ở đâu đó hoặc trong repo khác không? Tôi đã bắt đầu đào bới nhưng không tìm thấy gì cả.

https://github.com/gcc-mirror/gcc

Ví dụ, đây là một số mã tạo lắp ráp trong V8:

https://github.com/v8/v8-git-mirror/tree/master/src/x64

Có bất cứ điều gì tương đương cho GCC?

Tôi tự hỏi vì đó là một bí ẩn làm thế nào GCC làm điều này, và nó sẽ là một cách tuyệt vời để tìm hiểu làm thế nào trình biên dịch thực sự được thực hiện xuống đến mức lắp ráp.

+0

'gcc' là rất mạnh mẽ, nhưng đồng thời nó là vô cùng phức tạp và không thân thiện. Tôi khuyên bạn nên tiếp cận việc học khu vực này từ phía LLVM. Nó đẹp, sạch sẽ và gọn gàng, với mỗi bước độc đáo được phân lập để dễ hiểu hơn nhiều. Tôi muốn đề nghị để bắt đầu bằng cách đọc này: http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm –

Trả lời

11

Tập tin .md (mô tả máy) của nguồn GCC chứa nội dung để tạo cụm. GCC chứa một số trình tạo mã C/C++ chuyên biệt (và một số trong số chúng dịch các tập tin .md thành mã lắp ráp).

GCC là một chương trình rất phức tạp. documentation of GCC MELT chứa một số liên kết và trang trình bày thú vị, đáng chú ý nhất là Ấn Độ GCC Resource Center

Hầu hết các tối ưu hóa trong GCC xảy ra ở phần giữa (phần lớn độc lập với ngôn ngữ nguồn hoặc hệ thống đích). biểu diễn Gimple.

Repo GCC là SVN repository.

Xem thêm this answer, đặc biệt là các hình ảnh bên trong.

4

Mã nguồn thực tế cho GCC có thể truy cập hầu hết từ đây:

https://gcc.gnu.org/svn.html

Phần mềm này có thể truy cập thông qua SVN (lật đổ), một hệ thống kiểm soát mã nguồn. Điều này sẽ được cài đặt trên nhiều phiên bản của Linux/UNIX, nhưng nếu không phải trên nền tảng của bạn, bạn có thể cài đặt các bộ svn và sau đó lấy nguồn bằng cách sử dụng lệnh sau:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir 

GCC rất phức tạp và sẽ mất kinh nghiệm đáng kể để hiểu bản chất của cách ứng dụng thực sự biên dịch sang các kiến ​​trúc khác nhau.

Tóm lại, GCC có ba thành phần chính - xử lý front-end, middle và back-end. Bộ xử lý front-end có thành phần của phân tích ngôn ngữ để hiểu cú pháp của các ngôn ngữ (như C, C++, Objective-C, v.v.). Front-end deconstructs code thành một cấu trúc di động sau đó được truyền tới back-end để biên dịch tới môi trường đích.

Phần giữa thực hiện phân tích và tối ưu hóa mã, cố gắng ưu tiên mã để tạo ra sản lượng tốt nhất có thể vào cuối toàn bộ quá trình. Về mặt kỹ thuật, tối ưu hóa có thể xảy ra ở bất kỳ phần nào của quá trình khi các mẫu được phát hiện trong quá trình phân tích.

Bộ xử lý phía sau biên dịch mã thành định dạng đầu ra kiểu cây (không phải là mã thực thi cuối cùng). Dựa trên những gì đầu ra dự kiến ​​được thiết kế để được, các "pseudo-code" được tối ưu hóa cho việc sử dụng thanh ghi, kích thước bit, endian-ness, và như vậy. Mã cuối cùng sau đó được tạo ra trong giai đoạn lắp ráp, mà chuyển đổi mã back-end thành các lệnh thực thi máy. Điều quan trọng cần lưu ý là trình biên dịch có nhiều tùy chọn để xử lý các định dạng đầu ra để bạn có thể tạo đầu ra cho nhiều lớp kiến ​​trúc, thường là ra khỏi hộp. Đối với cross-biên dịch và biên dịch mục tiêu lựa chọn, hãy thử kiểm tra liên kết này:

https://gcc.gnu.org/install/configure.html

+3

Bạn quên phần trung gian của GCC, đó là lớn hơn front-end và back-end kết hợp! –

+1

Có nhiều địa điểm nơi bạn có thể xem toàn bộ quy trình - trang [Wiki] (http://en.wikipedia.org/wiki/GNU_Compiler_Collection) là một khởi đầu tốt. Phần giữa không trực tiếp giải quyết câu hỏi, nhưng tôi đã thêm nó vào câu trả lời bất kể. – rebelyell

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