it-swarm-vi.com

Là Python Giải thích hay Biên dịch?

Đây chỉ là một thắc mắc tôi đã có trong khi đọc về các ngôn ngữ được giải thích và biên dịch.

Ruby chắc chắn là ngôn ngữ được dịch vì mã nguồn được xử lý bởi một trình thông dịch tại điểm thực thi.
[.__.] Ngược lại [~ # ~] c [~ # ~] là ngôn ngữ được biên dịch, vì người ta phải biên dịch mã nguồn đầu tiên theo máy rồi thực hiện. Kết quả này được thực hiện nhanh hơn nhiều.

Bây giờ sắp tới Python :

  • A python code ( somefile.py ) khi nhập sẽ tạo một tệp ( somefile.pyc ) trong cùng thư mục. Giả sử việc nhập được thực hiện trong mô đun python Shell hoặc Django Sau khi nhập, tôi thay đổi mã một chút và thực hiện lại các hàm đã nhập để thấy rằng nó vẫn đang chạy mã cũ. Điều này cho thấy các tệp * .pyc được biên dịch python các tệp tương tự như tệp thực thi được tạo sau khi biên dịch tệp C, mặc dù tôi không thể thực thi trực tiếp tệp * .pyc.
  • Khi tệp python (somefile.py) được thực thi trực tiếp (./somefile.py hoặc python somefile.py) không có tệp .pyc được tạo và mã được thực thi như thể hiện hành vi được giải thích.

Những điều này cho thấy mã a python được biên dịch mỗi khi nó được nhập trong một quy trình mới để tạo .pyc trong khi nó được diễn giải khi được thực thi trực tiếp.

Vì vậy, loại ngôn ngữ nào tôi nên xem nó là? Giải thích hay tổng hợp? Và làm thế nào để hiệu quả của nó so với các ngôn ngữ được giải thích và biên dịch?

Theo wiki's Ngôn ngữ được giải thích trang, nó được liệt kê là ngôn ngữ được biên dịch thành Mã máy ảo, điều đó có nghĩa là gì?

82
crodjer

Điều đáng chú ý là ngôn ngữ không được diễn giải hoặc biên dịch, mà là ngôn ngữ triển khai hoặc giải thích hoặc biên dịch mã. Bạn lưu ý rằng Ruby là "ngôn ngữ được dịch", nhưng bạn có thể biên dịch Ruby à la MacRuby , vì vậy nó không luôn luôn một ngôn ngữ được diễn giải.

Khá nhiều mỗi Python triển khai bao gồm một trình thông dịch (chứ không phải trình biên dịch). Các tệp .pyc Bạn thấy là mã byte cho Python máy ảo (tương tự như các tệp .class của Java). Tuy nhiên, chúng không giống với mã máy được tạo bởi trình biên dịch C cho kiến ​​trúc máy gốc. Tuy nhiên, một số thực hiện Python do bao gồm một trình biên dịch just-in-time sẽ biên dịch Python mã byte thành mã máy gốc.

(Tôi nói "khá nhiều mỗi" vì tôi không biết bất kỳ trình biên dịch máy gốc nào cho Python, nhưng tôi không muốn khẳng định rằng không có nơi nào tồn tại ở bất cứ đâu.)

83
mipadi

Python sẽ nằm dưới mã byte được giải thích. .py mã nguồn đầu tiên được biên dịch thành mã byte là .pyc. Mã byte này có thể được hiểu (CPython chính thức) hoặc JIT được biên dịch (PyPy). Python mã nguồn (.py) có thể được biên dịch thành mã byte khác nhau như IronPython (.Net) hoặc Jython (JVM). Có nhiều triển khai của Python. Cái chính thức là một mã byte được diễn giải. Có cả mã triển khai JIT được biên dịch mã.

Để so sánh tốc độ của việc triển khai các ngôn ngữ khác nhau, bạn có thể thử tại đây .

36
aufather

Biên dịch so với giải thích có thể hữu ích trong một số bối cảnh, nhưng khi áp dụng theo nghĩa kỹ thuật, đó là một sự phân đôi giả.

Trình biên dịch (theo nghĩa rộng nhất) là một trình dịch . Nó dịch chương trình A sang chương trình B và để thực hiện trong tương lai, nó sử dụng máy M.

Trình thông dịch (theo nghĩa rộng nhất) là một người thi hành . Đó là một máy M thực thi chương trình A. Mặc dù chúng ta thường loại trừ khỏi định nghĩa này các máy vật lý (hoặc các máy phi vật lý hoạt động giống như các máy vật lý). Nhưng từ góc độ lý thuyết, sự phân biệt đó có phần tùy ý.


Ví dụ: lấy re.compile . Nó "biên dịch" một biểu thức chính quy thành một hình thức trung gian và hình thức trung gian đó được diễn giải/đánh giá/thực thi.


Cuối cùng, nó phụ thuộc vào mức độ trừu tượng mà bạn đang nói đến, và những gì bạn quan tâm. Mọi người nói "biên dịch" hoặc "diễn giải" là những mô tả rộng rãi về những phần thú vị nhất của quy trình, nhưng thực sự hầu hết mọi chương trình đều được biên dịch (dịch) và diễn giải (thực hiện) theo cách này hay cách khác.

CPython (cách triển khai phổ biến nhất của Python) chủ yếu là thú vị để thực thi mã. Vì vậy, CPython thường được mô tả là diễn giải. Mặc dù đây là nhãn lỏng lẻo.

11
Paul Draper

Mã máy ảo là phiên bản nhỏ gọn hơn của mã nguồn gốc (mã byte). Nó vẫn cần được giải thích bởi một máy ảo, vì nó không phải là mã máy. Dù vậy, việc phân tích cú pháp dễ dàng và nhanh hơn so với mã gốc được viết bởi một con người.

Một số máy ảo tạo mã máy trong khi lần đầu tiên diễn giải mã máy ảo (chỉ trong quá trình biên dịch thời gian - JIT). Các lệnh sau đây sẽ sử dụng mã máy này trực tiếp, dẫn đến thực thi nhanh hơn.

Theo như tôi biết Ruby> = 1.9 sử dụng một máy ảo như Python.

7
LennyProgrammers

Thời gian chạy Python chạy mã đối tượng tùy chỉnh (mã byte) trên máy ảo.

Quá trình biên dịch chuyển đổi mã nguồn thành mã đối tượng.

Để tăng tốc mọi thứ, mã đối tượng (hoặc mã byte, nếu bạn thích) được lưu trữ trên đĩa, vì vậy nó có thể được sử dụng lại vào lần tiếp theo khi chương trình được chạy.

5
ykombinator