Python 2: Python hoạt động thế nào?

Chủ đề Tự học Python
Bài này nằm trong loạt bài Tự học Python.

Ở bài này chúng ta sẽ xem những gì thật sự chạy phía dưới ngôn ngữ Python? Hiểu chút về bản chất của nó trước khi đi vào tìm hiểu các câu lệnh.

Giả sử bạn viết một chương trình python, sau đó nhấn chạy nó và một output xuất hiện. Vậy điều gì đã xảy ra?

# file first.py
print("Hello Math2IT!")
# output: Hello Math2IT!

Có một thứ sẽ “đọc” các dòng code này từ trên xuống dưới, từng dòng một và chuyển ra kết quả. Thứ đó gọi là interpreter (trình phiên dịch).

Trình phiên dịch Interpreter “sẽ đọc các dòng code trong Source code và cho ra kết quả.

Vậy bên trong cái Interpreter này đang xảy ra điều gì?

Bên trong Interpreter.

Có một “nhân viên” mang tên Compiler sẽ lãnh nhiệm vụ “dịch” những dòng code của bạn. Nếu có lỗi xảy ra, anh ta sẽ ngừng dịch và báo rằng “Ô, có lỗi rồi bồ ơi!“.

Còn nếu không có lỗi gì xảy ra, tất cả các dòng code của bạn (trong trường hợp này là print("Hello Math2IT!")) sẽ được anh chàng này dịch sang một thứ “ngôn ngữ” mới mang tên Byte Code.

Có sự khác biệt giữa ngôn ngữ python mà bạn thấy trong khung code ở trên và cái đã được dịch ra là bytecode. Nhìn vào bytecode chúng ta sẽ chẳng hiểu gì vì nó đa phần là các con số. Chúng có thể chạy trên bất kỳ nền tảng nào (bất kể là Windows, Linux hay MacOS). Hiểu nôm na là một ngôn ngữ trung gian (kiểu kiểu tiếng Anh vậy đó).

Các bytecode này sau đó sẽ được chuyển đến một “cái máy ảo” mang tên Virtual Machine (VM) để tiếp tục quá trình xử lý và chuyển thể thành ngôn ngữ máy (Machine Code) để cho máy tính có thể hiểu. Nếu có lỗi xảy ra, nó sẽ xuất lỗi, nếu không, nó sẽ cho ra kết quả mong muốn!

Có nhiều anh chàng Compiler và VM khác nhau đảm nhận công việc “dịch thuật” này. Một số ví dụ như:

  • CPython: chuyển lệnh python (ta đọc được) sang Python bytecode. Python bytecode này sau đó sẽ được một VM viết bằng C nói cho máy biết sẽ làm gì tiếp theo. Đây là trình biên dịch và thực thi (implementation) mặc định của Python và được sử dụng rất rộng rãi.
  • JPython: Khác với CPython, JPython sẽ dịch các lệnh python sang Java bytecode vốn được một Java VM xử lý và nói cho máy tính biết.
  • IronPython: Lần này, code python sẽ được dịch sang .NET bytecode và chạy trên một VM .NET.

Tại sao lại có nhiều cái trình dịch thuật như vậy? Giả dụ xét một lập trình viên .NET, anh ta muốn sử dụng các thư viện và code python vào trong một dự án viết bằng ngôn ngữ .NET của anh ta, vậy thì phải làm sao? Anh ta sẽ dùng IronPython để biên dịch các lệnh và code python kia sang .NET bytecode, sau đó các bytecode này sẽ được dùng cùng với các code .NET của anh ta một cách dễ dàng và tương thích.

Một câu hỏi đặt ra là, liệu mỗi lần ta viết code hay chạy các code python của ta (chạy lại file first.py ở trên) thì liệu toàn bộ quá trình trên có lặp đi lặp lại hay không?

Câu trả lời là tùy. Ví dụ sau khi CPython dịch ra Python bytecode dưới dạng các file .pyc hay .pyo (nằm trong thư mục __pycache__) thì nó cũng kèm theo luôn cả các dấu thời gian (timestamp). Nếu VM xét thấy các bytecode này chả có gì thay đổi (cùng timestamp) thì nó không cần dịch lại các code python sang bytecode nữa mà nó sẽ làm việc với các bytecode cũ này. Thật ra trong các file .pyc còn có 1 thông tin nữa bên cạnh timestamp mà tôi không nhắc tới vì không thật cần thiết, bạn có thể tham khảo tại đây.

Có một dạng thực thi khác mà không sử dụng các interpreters, đó là PyPy. Nó thực thi bằng cách dùng một trình biên dịch gọi là just-in-time compiler (JIT). Nó là gì vậy? Nó là một trình biên dịch cho phép dịch thẳng code python sang ngôn ngữ máy mà không cần thông qua các bytecode. Điều này khiến cho tốc độ thực thi chương trình nhanh hơn rất nhiều so với CPython mặc định.

Vậy tại sao người ta không dùng PyPy làm mặc định mà lại dùng CPython? Lý do tương thích là chủ yếu, ngoài ra còn vài lý do khác, bạn có thể đọc cái này để biết!

Đọc thêm & Tham khảo

  1. Difference between various Implementations of Pythongeeksforgeeks.
  2. Python (2.5) Virtual Machine: A Guide TourPeter Troger.
  3. How Python runs?Indian Pythonista.

Một số hình ảnh trong bài lấy từ indianpythonista.wordpress.com và geeksforgeeks.org.