Tại sao Python không có những thứ này?
Tôi không chắc tại sao bạn nghĩ rằng không có triển khai Python nào quan tâm đến hiệu suất. PyPy , IronPython và Jython đều là các triển khai Python sẵn sàng sản xuất, quan tâm đến hiệu suất. Pyston là một thực hiện trong phát triển đã được đặc biệt tạo ra để thực hiện. Unladen Swallow và Psyco cũng là những dự án cải thiện hiệu năng của Python.
Tuy nhiên, thực tế là người dùng CPython vượt xa tổng số cơ sở người dùng kết hợp của tất cả các triển khai khác, rằng Unladen Swallow đã bị cộng đồng từ chối, rằng hầu hết các dự án này đều đã chết hoặc đang vật lộn để thu hút các nhà phát triển sẽ cho bạn biết điều gì đó về Python. hiệu suất cộng đồng.
Câu trả lời này là một ví dụ điển hình về tâm lý điển hình của cộng đồng Python: thay vì khắc phục các vấn đề về hiệu năng, họ chỉ đơn giản thích viết mã của họ không bằng Python.
Tôi đã xem xét PyPy và IronPython, cả hai đều khẳng định tốc độ tăng. PyPy Tôi không hiểu cách triển khai Python được viết bằng Python, ngôn ngữ được dịch, sẽ nhanh hơn so với triển khai tham chiếu trong C.
Trước hết: không quan trọng trình biên dịch được viết bằng ngôn ngữ nào. Rốt cuộc, trình biên dịch chỉ được thực thi một lần , vì vậy ngay cả khi nó chậm, điều đó không quan trọng: hiệu suất của trình biên dịch là không liên quan, điều gì có liên quan là hiệu suất của đầu ra của trình biên dịch.
Thứ hai, vì nó chỉ quan trọng đầu ra của trình biên dịch nhanh như thế nào và trình biên dịch được viết bằng Python, tức là ngôn ngữ mà nó biên dịch, nó thực sự có thể tự làm nhanh bằng cách tự biên dịch.
Thứ ba, không có thứ gọi là "ngôn ngữ diễn giải". Một ngôn ngữ là một tập hợp các quy tắc và hạn chế toán học. Đây là một đặc điểm kỹ thuật. Một mẩu giấy. Một ngôn ngữ không được biên dịch hoặc giải thích. Một ngôn ngữ chỉ là . Biên dịch và giải thích là những đặc điểm của việc thực hiện ngôn ngữ , chính xác hơn là trình biên dịch hoặc trình thông dịch (duh!), Chứ không phải ngôn ngữ. Mỗi ngôn ngữ có thể được thực hiện bởi một trình biên dịch. Mỗi ngôn ngữ có thể được thực hiện bởi một thông dịch viên. Bạn có thể tạo một trình biên dịch từ trình thông dịch và trình thông dịch từ trình biên dịch.
Nhưng tất cả những điều này thực sự không quan trọng, bởi vì PyPy thực sự không được viết bằng Python. Nó được viết bằng RPython . RPython bao gồm hai phần, ngôn ngữ lập trình RPython và khung RPython.
Ngôn ngữ lập trình RPython không phải là Python. Nó là một ngôn ngữ lập trình khác nhau. RPython là ngôn ngữ lập trình được gõ tĩnh, gần bằng mức độ trừu tượng như Java, với hiệu năng gần như C. RPython là một tập hợp con cú pháp và ngữ nghĩa của Python, có nghĩa là mọi chương trình RPython đều là chương trình Python hợp lệ và có thể được điều hành bởi một triển khai Python (mặc dù thường có một số đơn hàng độ lớn chậm hơn, nhưng điều này vẫn hữu ích để gỡ lỗi vì bạn có quyền truy cập vào tất cả các công cụ của Python và việc giải thích bắt đầu ngay lập tức, trong khi quá trình biên dịch ngôn ngữ thường mất khoảng 5-10 phút ), nhưng điều ngược lại là không đúng sự thật.
Khung RPython là một khung để viết các triển khai ngôn ngữ động hiệu suất cao bằng ngôn ngữ lập trình RPython. Nó bao gồm một trình thu gom rác, không gian đối tượng, giao thức đối tượng meta, các đối tượng được xác định trước, các loại và các hoạt động, v.v. Nhưng viên ngọc quý là khả năng tự động tạo trình biên dịch JIT từ trình thông dịch: nếu bạn triển khai một ngôn ngữ trong khung RPython, bạn chỉ phải viết một trình thông dịch, khung RPython sẽ xử lý JIT.
Có rất nhiều triển khai ngôn ngữ trên nền tảng RPython , không chỉ PyPy.
IronPython, cùng một ý tưởng nhưng tôi không thấy .NET Framework sẽ tăng tốc độ như thế nào.
Hầu hết các triển khai của ISO CLI, chẳng hạn như các biến thể .NET khác nhau của Microsoft hoặc Mono, đều chứa các trình thu gom rác, tối ưu hóa và trình biên dịch phức tạp. Điều này cũng đúng với các triển khai Jython và Java.
IronPython là một trình biên dịch, nó biên dịch mã nguồn Python thành các cây DLR (DLR là Dynamic Language Runtime), sau đó được biên dịch thành mã byte CIL, sau đó lại được biên dịch lại thành mã máy gốc.