Tại sao không có trình biên dịch python cho mã máy gốc?


25

Theo tôi hiểu, nguyên nhân của sự khác biệt về tốc độ giữa ngôn ngữ được biên dịch và python là do lần đầu tiên biên dịch mã theo mã của máy bản địa, trong khi python biên dịch thành mã python, được PVM giải thích. Tôi thấy rằng cách này có thể sử dụng mã python trên nhiều hệ điều hành (ít nhất là trong hầu hết các trường hợp), tuy nhiên tôi không hiểu, tại sao không có trình biên dịch bổ sung (và tùy chọn) cho python, trình biên dịch giống như trình biên dịch truyền thống . Điều này sẽ để cho các lập trình viên lựa chọn, điều quan trọng hơn đối với họ; khả năng thực thi đa nền tảng hoặc hiệu suất trên máy gốc. Nói chung; Tại sao không có ngôn ngữ nào có thể hành xử cả khi được biên dịch và giải thích?


4
. Haskell cũng có thể hoạt động như được biên dịch hoặc giải thích thông qua GHCI
to nướng_flakes

C ++ cũng có phiên dịch viên . Và có lẽ hàng tấn ngôn ngữ khác có cả hai triển khai.
Claudio

2
Trên thực tế, bằng cách chọn IronPythong ( ironpython.net ) và biên dịch mã IL được sản xuất bằng cách sử dụng "ngen" ( msdn.microsoft.com/de-de/library/6t9t5wcf%28v=vs.110%29.aspx ) có một cách để biên dịch Python thành mã máy gốc. Không phải là tôi đã thử chuỗi công cụ đó.
Doc Brown

10
Người ta có thể viết trình biên dịch Python-to -igen. Chúng không thực sự thú vị bởi vì chúng không thực sự cải thiện hiệu suất bởi bất kỳ mức lợi nhuận đáng kể nào, trừ khi chúng thực sự triển khai một ngôn ngữ trông giống Python nhưng bị hạn chế hơn nhiều. Trước đây tôi đã giải thích tại sao.

Câu trả lời:


29

Không. Lý do tại sao có sự khác biệt về tốc độ giữa các ngôn ngữ như Python và C ++ là vì các ngôn ngữ được nhập tĩnh cung cấp cho trình biên dịch hàng tấn thông tin về cấu trúc của chương trình và dữ liệu của nó cho phép nó tối ưu hóa cả tính toán và truy cập bộ nhớ. Vì C ++ biết rằng biến đó là kiểu int, nên nó có thể xác định cách tối ưu để thao tác biến đó ngay cả trước khi chương trình được chạy. Mặt khác, trong Python, bộ thực thi không biết giá trị nào trong một biến phải cho đến khi trình thông dịch đạt được dòng. Điều này cực kỳ quan trọng đối với các cấu trúc, trong C ++, trình biên dịch có thể dễ dàng cho biết kích thước của cấu trúc và mọi vị trí của các trường trong bộ nhớ trong quá trình biên dịch. Điều này mang lại cho nó sức mạnh to lớn trong việc dự đoán cách dữ liệu có thể được sử dụng và cho phép nó tối ưu hóa theo những dự đoán đó.

Để biên dịch hiệu quả các ngôn ngữ như Python, bạn cần phải:

  1. Đảm bảo rằng cấu trúc dữ liệu là tĩnh trong quá trình thực hiện chương trình. Đây là vấn đề vì Python có eval và metaclass. Cả hai đều có thể thay đổi cấu trúc của chương trình dựa trên đầu vào của chương trình. Đây là một trong những điều mang lại cho Python sức mạnh biểu cảm như vậy.
  2. Suy ra các loại của tất cả các biến, cấu trúc và các lớp từ chính mã nguồn. Mặc dù có thể ở một mức độ nào đó, hệ thống và thuật toán kiểu tĩnh sẽ phức tạp đến mức gần như không thể thực hiện theo cách có thể sử dụng được. Bạn có thể làm điều đó cho một tập hợp con của ngôn ngữ, nhưng chắc chắn không phải cho toàn bộ các tính năng ngôn ngữ.

6
Điều đáng chú ý là điều này làm cho vấn đề trở nên khó khăn , nhưng không phải là không thể. sbcl biên dịch Common Lisp cũng là động, có evalvà một loạt các thứ khác để làm cho các nhà văn biên dịch buồn. Nó không đến mức gcc, nhưng nó chắc chắn nhanh hơn trình thông dịch của CPython.
Daniel Gratzer

3
@jozefg Mình nói biên dịch hiệu quả. Không chỉ biên dịch. Python cũng có trình biên dịch Cython tạo mã riêng. Vấn đề là các trình biên dịch này không thực hiện được một phần tối ưu hóa mà trình biên dịch cho các ngôn ngữ gõ tĩnh có thể. Và khi bạn so sánh hiệu năng, hãy so sánh nó với C ++ đã biên dịch và không hiểu Python.
Euphoric

2
Thực sự, bạn sẽ ngạc nhiên về những gì sbcl có thể làm. Trò chơi điểm chuẩn cho thấy nó chạy nhanh như Java, nhanh gần bằng GHC và trong vòng từ 1 đến 10 lần so với C. Nó không chậm theo bất kỳ tiêu chuẩn nào. Vâng, các loại động ức chế biên dịch ở một mức độ nào đó, nhưng không quá nhiều như bạn nghĩ.
Daniel Gratzer

3
So sánh tốc độ của python được giải thích với python biên dịch là thú vị của chính nó. Ngừng nói "sử dụng C ++". Có lẽ bạn đã có mã được viết bằng Python. Có lẽ mã dễ viết bằng python. Ai quan tâm. Điều tôi quan tâm là tốc độ tăng gấp 1,5 lần (bất kể đó là gì). Điều đó có thể tạo ra một sự khác biệt rất lớn.
Thomas Eding

3
Nói cách khác, nếu bạn muốn biên dịch, hãy chọn một ngôn ngữ khác được điều chỉnh cho điều đó, như C ++ hoặc Pascal.
Vui lòng_Dont_Bully_Me_SO_Lords

0

Hai khái niệm có thể giúp chúng ta hiểu rõ hơn tại sao Python được biên dịch thành mã máy gốc "có thể" không chạy nhanh như C được biên dịch hoặc các ngôn ngữ được biên dịch phổ biến khác. Chúng được gọi là ràng buộc sớm và ràng buộc muộn.

Tôi nên bắt đầu bằng cách nói rằng tôi không phải là một chuyên gia về Python và tôi đã vô tình đến trang web này. Nhưng tôi thích trang web này.

Như đã đề cập trong một phản hồi khác ở đây, trình biên dịch C ++ có thể biết rất nhiều về chương trình và đưa ra quyết định về việc sử dụng thao tác nào cho các cấu trúc dữ liệu cụ thể. Như một ví dụ nếu hai biến số nguyên cần được thêm vào với nhau, trình biên dịch biết chúng là số nguyên riêng, ví dụ rộng 32 bit và nó có thể thêm chúng cùng với một lệnh "THÊM". Vì vậy, nó biên dịch lệnh ADD vào mã. Nó bị khóa và không thể thay đổi trong khi chương trình đang chạy. Đó là ràng buộc sớm.

Mặt khác, trong một ngôn ngữ như Python, chúng ta có thể mong đợi chương trình sẽ ném các loại dữ liệu khác nhau theo những cách phức tạp. Bây giờ trình biên dịch không biết nếu 2 biến của chúng ta là số nguyên, số float, chuỗi hoặc danh sách. Vì vậy, nó phải biên dịch mã xác định thông tin đó trong thời gian chạy và chọn thao tác chính xác trong khi chương trình đang chạy. Đây là ràng buộc muộn và chúng tôi có thể hiểu rằng sẽ có một cú hích hiệu năng để thực hiện công việc bổ sung đó trong khi chương trình đang chạy. Đó là cái giá bạn phải trả cho việc giữ các tùy chọn đó mở bằng ngôn ngữ như Python nhưng nó cung cấp sự linh hoạt trong thời gian chạy tối đa.


-4

Tôi nghĩ rằng nó có liên quan nhiều hơn đến bản thân các chi tiết cụ thể của Python, cùng lý do bạn không thể biên dịch C # thành mã máy. Các chi tiết cụ thể về ngôn ngữ sẽ thực sự khiến các chương trình của bạn bị lỗi ngay cả khi điều đó là có thể do bản chất của ngôn ngữ. Tại sao không chỉ học ngôn ngữ C? Nó dễ hơn nhiều so với C ++ và hơi tiên tiến hơn Python nhưng vẫn dễ tiếp cận.


5
C # có thể chuyển trực tiếp tới mã máy: Ngôn ngữ trung gian phổ biến: Biên dịch trước thời gian - "Môi trường thực thi tương thích CLI cũng đi kèm với tùy chọn thực hiện biên dịch trước thời gian (AOT) của một tổ hợp để thực hiện nhanh hơn bằng cách xóa quá trình JIT khi chạy. Trong .NET Framework có một công cụ đặc biệt gọi là Trình tạo ảnh gốc (NGEN) thực hiện AOT. Trong Mono cũng có một tùy chọn để thực hiện AOT. "
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.