Một thử nghiệm tốt cho hiệu quả dịch thuật của trình biên dịch là tự biên dịch: mất bao lâu để một trình biên dịch nhất định tự biên dịch? Đối với C ++ thì phải mất một thời gian rất dài (giờ?). Khi so sánh, trình biên dịch Pascal / Modula-2 / Oberon sẽ tự biên dịch trong chưa đầy một giây trên một máy hiện đại [1].
Go đã được truyền cảm hứng bởi các ngôn ngữ này, nhưng một số lý do chính cho hiệu quả này bao gồm:
Một cú pháp được xác định rõ ràng là âm thanh toán học, để quét và phân tích hiệu quả.
Một ngôn ngữ được biên dịch tĩnh và an toàn kiểu sử dụng biên dịch riêng biệt với kiểm tra phụ thuộc và kiểm tra kiểu qua các ranh giới mô-đun, để tránh đọc lại các tệp tiêu đề và biên dịch lại các mô-đun khác - trái ngược với biên dịch độc lập như trong C / C ++ không có kiểm tra mô-đun chéo nào được trình biên dịch thực hiện (do đó cần phải đọc lại tất cả các tệp tiêu đề đó nhiều lần, ngay cả đối với chương trình "hello world" một dòng đơn giản).
Việc triển khai trình biên dịch hiệu quả (ví dụ: phân tích cú pháp từ trên xuống dưới đơn lẻ, đệ quy) - điều này tất nhiên được trợ giúp rất nhiều bởi các điểm 1 và 2 ở trên.
Những nguyên tắc này đã được biết đến và thực hiện đầy đủ vào những năm 1970 và 1980 bằng các ngôn ngữ như Mesa, Ada, Modula-2 / Oberon và một số ngôn ngữ khác, và chỉ bây giờ (trong những năm 2010) mới tìm được ngôn ngữ hiện đại như Go (Google) , Swift (Apple), C # (Microsoft) và một số người khác.
Chúng ta hãy hy vọng rằng điều này sẽ sớm trở thành chuẩn mực và không phải là ngoại lệ. Để đạt được điều đó, hai điều cần phải xảy ra:
Đầu tiên, các nhà cung cấp nền tảng phần mềm như Google, Microsoft và Apple nên bắt đầu bằng cách khuyến khích các nhà phát triển ứng dụng sử dụng phương pháp biên dịch mới, đồng thời cho phép họ sử dụng lại cơ sở mã hiện có của họ. Đây là những gì Apple hiện đang cố gắng thực hiện với ngôn ngữ lập trình Swift, ngôn ngữ có thể cùng tồn tại với Objective-C (vì nó sử dụng cùng một môi trường thời gian chạy).
Thứ hai, bản thân các nền tảng phần mềm cơ bản cuối cùng sẽ được viết lại theo thời gian bằng cách sử dụng các nguyên tắc này, đồng thời thiết kế lại hệ thống phân cấp mô-đun trong quy trình để làm cho chúng ít nguyên khối hơn. Tất nhiên đây là nhiệm vụ của voi ma mút và có thể là phần tốt hơn của một thập kỷ (nếu họ đủ can đảm để thực hiện nó - điều mà tôi không chắc chắn trong trường hợp của Google).
Trong mọi trường hợp, đó là nền tảng thúc đẩy việc áp dụng ngôn ngữ chứ không phải theo cách khác.
Người giới thiệu:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , trang 6: "Trình biên dịch tự biên dịch trong khoảng 3 giây". Báo giá này dành cho một ban phát triển Xilinx Spartan-3 chi phí thấp chạy ở tần số xung nhịp 25 MHz và có 1 MByte bộ nhớ chính. Từ đó , trình biên dịch có thể dễ dàng ngoại suy thành "dưới 1 giây" cho bộ xử lý hiện đại chạy ở tần số xung nhịp cao hơn 1 GHz và vài GB bộ nhớ chính (tức là mạnh hơn vài bậc so với bo mạch Xilinx Spartan-3), ngay cả khi tính đến tốc độ I / O. Đã trở lại vào năm 1990 khi Oberon được chạy trên bộ xử lý NS32X32 25 MHz với bộ nhớ chính 2-4 MB, trình biên dịch sẽ tự biên dịch chỉ sau vài giây. Khái niệm thực sự chờ đợi hoàn thành một chu trình biên dịch hoàn toàn xa lạ với các lập trình viên Oberon ngay cả khi đó. Đối với các chương trình điển hình, nó luôn luônmất nhiều thời gian hơn để loại bỏ ngón tay khỏi nút chuột đã kích hoạt lệnh biên dịch hơn là chờ trình biên dịch hoàn tất quá trình biên dịch vừa kích hoạt. Đó thực sự là sự hài lòng ngay lập tức, với thời gian chờ đợi gần như bằng không. Và chất lượng của mã được sản xuất, mặc dù không phải lúc nào cũng hoàn toàn ngang bằng với các trình biên dịch tốt nhất hiện có, rất tốt cho hầu hết các tác vụ và nói chung là khá chấp nhận được.