Ngày nay, bạn cần một trình biên dịch C thực sự để trở thành một trình biên dịch tối ưu hóa , đáng chú ý vì C không còn là ngôn ngữ gần với phần cứng, bởi vì các bộ xử lý hiện tại rất phức tạp ( không theo thứ tự , đường ống , siêu thanh , với bộ đệm & TLB phức tạp , do đó cần lập lịch hướng dẫn , v.v ...). Bộ xử lý x86 ngày nay không giống như bộ xử lý i386 của thế kỷ trước, ngay cả khi cả hai đều có thể chạy cùng một mã máy. Xem C không phải là ngôn ngữ cấp thấp (Máy tính của bạn không phải là bài viết nhanh PDP-11) của David Chisnall.
Rất ít người đang sử dụng các trình biên dịch C không tối ưu hóa ngây thơ như tinycc hoặc nwcc , vì chúng tạo ra mã chậm hơn nhiều lần so với các trình biên dịch tối ưu hóa có thể cung cấp.
Mã hóa một trình biên dịch tối ưu hóa là khó khăn. Lưu ý rằng cả GCC và Clang đều tối ưu hóa một số biểu diễn mã "trung lập ngôn ngữ nguồn" (Gimple cho GCC, LLVM cho Clang). Sự phức tạp của một trình biên dịch C tốt không nằm trong giai đoạn phân tích cú pháp!
Cụ thể, việc tạo một trình biên dịch C ++ không khó hơn nhiều so với tạo một trình biên dịch C: phân tích C ++ và chuyển đổi nó thành một số biểu diễn mã nội bộ rất phức tạp (vì đặc tả C ++ rất phức tạp), nhưng được hiểu rõ, nhưng các phần tối ưu hóa thậm chí còn nhiều hơn phức tạp (bên trong GCC: tối ưu hóa trung cấp, trung lập ngôn ngữ nguồn và bộ xử lý đích, tạo thành phần lớn trình biên dịch, phần còn lại được cân bằng giữa các giao diện người dùng cho một số ngôn ngữ và back-end cho một số bộ xử lý). Do đó, hầu hết các trình biên dịch C tối ưu hóa cũng có thể biên dịch một số ngôn ngữ khác, như C ++, Fortran, D, ... Các phần cụ thể C ++ của GCC chiếm khoảng 20% trình biên dịch ...
Ngoài ra, C (hoặc C ++) được sử dụng rộng rãi đến mức mọi người mong đợi mã của họ có thể biên dịch được ngay cả khi nó không tuân theo chính xác các tiêu chuẩn chính thức, không xác định chính xác đủ ngữ nghĩa của ngôn ngữ (vì vậy mỗi trình biên dịch có thể có cách hiểu riêng của nó). Cũng xem xét trình biên dịch C đã chứng minh CompCert và trình phân tích tĩnh Frama-C , công ty quan tâm đến ngữ nghĩa chính thức hơn của C.
Và tối ưu hóa là một hiện tượng dài hạn : thực hiện một vài tối ưu hóa đơn giản là dễ dàng, nhưng chúng sẽ không làm cho trình biên dịch cạnh tranh! Bạn cần thực hiện rất nhiều tối ưu hóa khác nhau, và sắp xếp và kết hợp chúng một cách khéo léo, để có được một trình biên dịch trong thế giới thực có tính cạnh tranh. Nói cách khác, một trình biên dịch tối ưu hóa trong thế giới thực phải là một phần mềm phức tạp. BTW, cả GCC và Clang / LLVM đều có một số trình tạo mã C / C ++ chuyên dụng nội bộ. Và cả hai đều là những con thú khổng lồ (vài triệu dòng mã nguồn, với tốc độ tăng trưởng vài phần trăm mỗi năm) với cộng đồng nhà phát triển lớn (vài trăm người, làm việc chủ yếu toàn thời gian, hoặc ít nhất là một nửa thời gian).
Chú ý rằng có không có (theo sự hiểu biết của tôi) đa luồng C biên dịch, ngay cả khi một số bộ phận của một trình biên dịch có thể chạy song song (tối ưu hóa ví dụ như trong nội bộ thủ tục, đăng ký phân bổ, kế hoạch giảng dạy ...). Và xây dựng song song với make -j
không phải lúc nào cũng đủ (đặc biệt là với LTO ).
Ngoài ra, rất khó để được tài trợ cho việc mã hóa trình biên dịch C từ đầu, và một nỗ lực như vậy cần phải kéo dài vài năm. Cuối cùng, hầu hết các trình biên dịch C hoặc C ++ đều là phần mềm miễn phí ngày nay (không còn thị trường cho các trình biên dịch độc quyền mới được bán bởi các công ty khởi nghiệp) hoặc ít nhất là các hàng hóa độc quyền (như Microsoft Visual C ++ ) và là một phần mềm miễn phí gần như được yêu cầu cho các trình biên dịch ( bởi vì họ cần sự đóng góp từ nhiều tổ chức khác nhau).
Tôi rất vui khi nhận được tài trợ để làm việc trên trình biên dịch C từ đầu như phần mềm miễn phí, nhưng tôi không đủ ngây thơ để tin rằng điều đó là có thể ngày hôm nay!