Bạn quá đơn giản tuyên bố của Guido trong việc đặt câu hỏi của bạn. Vấn đề không phải là viết một trình biên dịch cho một ngôn ngữ gõ động. Vấn đề là viết một (tiêu chí 1) luôn luôn đúng, (tiêu chí 2) giữ kiểu gõ động và (tiêu chí 3) nhanh hơn đáng kể cho một số lượng mã đáng kể.
Thật dễ dàng để thực hiện 90% (không đạt tiêu chí 1) của Python và luôn luôn nhanh chóng với nó. Tương tự, thật dễ dàng để tạo một biến thể Python nhanh hơn bằng cách gõ tĩnh (không đạt tiêu chí 2). Việc thực hiện 100% cũng dễ dàng (trong khi thực hiện một ngôn ngữ phức tạp thì dễ), nhưng cho đến nay, mọi cách dễ dàng để thực hiện đều trở nên tương đối chậm (không đạt tiêu chí 3).
Việc triển khai một trình thông dịch cộng với JIT là chính xác, thực hiện toàn bộ ngôn ngữ và nhanh hơn đối với một số mã hóa ra là khả thi, mặc dù khó hơn đáng kể (xem PyPy) và chỉ như vậy nếu bạn tự động tạo trình biên dịch JIT (Psyco đã làm mà không cần nó , nhưng rất hạn chế về mã có thể tăng tốc). Nhưng lưu ý rằng điều này rõ ràng nằm ngoài phạm vi, vì chúng ta đang nói về tĩnhtrình biên dịch (còn gọi là trước thời hạn). Tôi chỉ đề cập đến điều này để giải thích tại sao cách tiếp cận của nó không hoạt động đối với các trình biên dịch tĩnh (hoặc ít nhất là không có ví dụ hiện có): Trước tiên, nó phải diễn giải và quan sát chương trình, sau đó tạo mã cho một vòng lặp cụ thể của vòng lặp (hoặc một mã tuyến tính khác đường dẫn), sau đó tối ưu hóa địa ngục dựa trên các giả định chỉ đúng với lần lặp cụ thể đó (hoặc ít nhất, không phải cho tất cả các lần lặp có thể). Kỳ vọng là nhiều lần thực thi mã sau đó cũng sẽ phù hợp với kỳ vọng và do đó được hưởng lợi từ việc tối ưu hóa. Một số kiểm tra (tương đối rẻ) được thêm vào để đảm bảo tính chính xác. Để làm tất cả điều này, bạn cần một ý tưởng về những gì cần chuyên biệt, và thực hiện chậm nhưng chung chung để quay trở lại. Trình biên dịch AOT không có. Họ không thể chuyên môn hóa tất cảdựa trên mã họ không thể thấy (ví dụ mã được tải động) và chuyên biệt có nghĩa là tạo ra nhiều mã hơn, có một số vấn đề (sử dụng icache, kích thước nhị phân, thời gian biên dịch, các nhánh bổ sung).
Việc triển khai trình biên dịch AOT thực hiện chính xác toàn bộ ngôn ngữ cũng tương đối dễ dàng: Tạo mã gọi vào thời gian chạy để làm những gì trình thông dịch sẽ làm khi được cung cấp với mã này. Nuitka (chủ yếu) làm điều này. Tuy nhiên, điều này không mang lại nhiều lợi ích về hiệu suất (không đạt tiêu chí 3), vì bạn vẫn phải thực hiện nhiều công việc không cần thiết như một trình thông dịch, tiết kiệm cho việc gửi mã byte tới khối mã C thực hiện những gì bạn đã biên dịch. Nhưng đó chỉ là một chi phí khá nhỏ - đủ đáng kể để đáng để tối ưu hóa trong một trình thông dịch hiện có, nhưng không đủ quan trọng để biện minh cho việc thực hiện hoàn toàn mới với các vấn đề của chính nó.
Điều gì sẽ là cần thiết để đáp ứng cả ba tiêu chí? Chúng tôi không có ý tưởng. Có một số sơ đồ phân tích tĩnh có thể trích xuất một số thông tin về các loại cụ thể, luồng điều khiển, v.v. từ các chương trình Python. Những cái mang lại dữ liệu chính xác ngoài phạm vi của một khối cơ bản duy nhất là cực kỳ chậm và cần phải xem toàn bộ chương trình, hoặc ít nhất là phần lớn. Tuy nhiên, bạn không thể làm gì nhiều với thông tin đó, ngoài việc có thể tối ưu hóa một vài thao tác trên các loại dựng sẵn.
Tại sao vậy Nói một cách thẳng thắn, trình biên dịch sẽ loại bỏ khả năng thực thi mã Python được tải trong thời gian chạy (không đạt tiêu chí 1) hoặc không đưa ra bất kỳ giả định nào có thể bị vô hiệu hóa bởi bất kỳ mã Python nào. Thật không may, trong đó bao gồm khá nhiều tất cả mọi thứ hữu ích để tối ưu hóa các chương trình: Globals bao gồm các chức năng có thể được phục hồi, các lớp học có thể được biến đổi hoặc thay thế hoàn toàn, mô-đun có thể được sửa đổi tùy tiện quá, nhập khẩu có thể bị tấn công theo nhiều cách, vv Một chuỗi đơn truyền cho eval
, exec
, __import__
hoặc nhiều chức năng khác, có thể thực hiện bất kỳ chức năng nào trong số đó. Trong thực tế, điều đó có nghĩa là hầu như không có tối ưu hóa lớn nào có thể được áp dụng, mang lại ít lợi ích hiệu suất (không đạt tiêu chí 3). Quay lại đoạn văn trên.