Python có "biên dịch" không?

Em được biết Python là một ngôn ngữ thông dịch? Vậy nên em hiểu là nó không hề biên dịch. Nhưng lại vô tình được được bài này

Python is not compiled?

While not requiring a separate compiler toolchain like C++, Python is in fact compiled to bytecode, much like Java and many other compiled languages. Further compilation steps, if any, are at the discretion of the runtime, be it CPython, PyPy, Jython/JVM, IronPython/CLR, or some other process virtual machine.

Vậy thì một chương trình Python cũng được biên dịch giống Java phải không ạ? Thế thì sao lại nói nó là ngôn ngữ thông dịch được ạ?

Hi tutu.
Tất nhiên bạn phải chuyển file text mã nguồn thành một dạng dữ liệu khác tối ưu hơn cho việc thực thi. Thường thì các file này được giữ lại để chạy cho lần sau như .class của java.
Tại sao nói nó là thông dich vì đầu vào cho máy ảo thực thi là file text còn java là file .class.

1 Like

Về Java thì em đã hiểu rồi. Java phải biên dịch thành bytecode rồi JVM mới thông dịch. Nhưng còn Python cơ ạ. Em nghe nói nó là ngôn ngữ thông dịch. Thế tại sao bài viết này lại còn nói nó được biên dịch thành bytecode nữa? Đó là cái em thắc mắc.

1 Like

Hi tutu.
Khi load file text vào thì bạn cần phải tạo nơi lưu trữ biến stack gọi hàm class v.v.v…


Để khỏi mất công tạo các dữ liệu đó thì lưu file đấy lại dùng lại sau.

1 Like

Python là một ngôn ngữ lập trình. Nó là các quy tắc để một người lập trình biểu diễn các thuật toán, giải pháp cho bài toán của mình.
Mã nguồn được biên dịch hay thông dịch sẽ dựa vào phần mềm mà bạn sử dụng để có thể chạy mã nguồn của bạn.
Với Python, các biến được khai báo mà không cần kiểu, như vậy, kiểu của biến được gán theo ngữ cảnh. Việc thông dịch sẽ dễ hơn biên dịch.

1 Like

Em chỉ hỏi là Python có được biên dịch không? Và nếu như đúng bài viết kia nói thì sau khi được biên dịch thành bytecode. Cái gì sẽ thông dịch Python sang ngôn ngữ máy? Như ở Java là JVM ấy ạ? Ở Python là gì?

1 Like

Những anh ở trên đã trả lời rồi. Mình chỉ nhắc lại thôi. (với CPython).
Bạn có thử vào thư mục chứa thư viện của Python không? Bạn có thấy các file dạng *.pyc (hay *.pyo) không? Nó là bytecode sau khi biên dịch của Python và dĩ nhiên càng không phải ngôn ngữ máy nên không có chuyện “thông dịch sang ngôn ngữ máy”.
Lúc nào Python nạp 1 file nào thì nó đều được compile trước :slight_smile: việc các file được compile là để tăng tốc nạp thư viện vào thôi :slight_smile:
Bạn cũng nên phân biệt interpretervirtual machine :slight_smile: tụi nó không giống nhau. Và câu hỏi này rất dễ để tìm đáp án Google (miễn là từ khóa tiếng anh).

1 Like
1 Like

Bạn đọc mấy link này xem :smile: , nói chung có mấy ý quan trọng là:

  • Ngôn ngữ Python khác với Python implementation, 1 ngôn ngữ thì không có khái niệm compiled hay interpreted mà implementation của ngôn ngữ đó mới có 2 khái niệm đó.
  • Ngôn ngữ python là cái trong file .py, còn python implementation là CPython ( cái hầu hết mọi người dùng), Jython, IronPython, PyPy.
  • CPython compile Python code ra bytecode rồi interpreted bytecode ra mã máy
  • CPython và Cython là 2 cái khác nhau
3 Likes

Cpython là ngôn ngữ biên dịch nhé. Nó có hai giai đoạn. Giai đoạn đầu nó phân tích source code thành bytecode lưu ở dạng file đuôi pyc. Giai đoạn sau nó sử dụng máy ảo pvm hay ta thường hiểu nó là interpreter-thông dịch.máy ảo này sử dụng bytecode tạo ra ở giai đoạn trước để chạy chứ nó k biên dịch ra machine code như các ngôn ngữ như C,C++ và cũng không giống như máy ảo java hay .net. Trong java và .net nó cũng có máy ảo nhưng máy ảo đó sẽ dùng trình biên dịch JIT compiler để chuyển bytecode sang machine code. Thật sự lúc mới tìm hiểu mình cứ hay đánh đồng python giống .net hay java nhưng thực sự cách hiện thực của nó khác hoàn toàn và thật sự rất hack não. Nói chung triết lý xây dựng nên Python nó không nhất quán và bài bản như .net nên không thể vận dụng những hiểu biết bên .net hay C giải thích bên trong python.bạn nào hứng thú nghiên cứu bên trọng có thể giao lưu vs mình

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?