Bài 2.1. Điều gì thực sự xảy ra khi chạy tệp hello_world.py

Bài 2.1. Điều gì thực sự xảy ra khi chạy tệp hello_world.py
Bạn mới bắt đầu học lập trình Python và đã viết tệp hello_world.py đầu tiên của mình? Khi bạn nhấn nút "Run" (Chạy), có rất nhiều quy trình thú vị diễn ra phía sau hậu trường. Trong bài viết này, chúng ta sẽ khám phá hành trình kỳ diệu từ mã nguồn đơn giản đến kết quả hiển thị trên màn hình.
Bắt đầu với Hello World
Hãy xem xét chương trình Python đơn giản nhất:
print("Hello FullhouseDev!")
Khi bạn chạy đoạn mã này, bạn sẽ thấy đầu ra đơn giản:
Hello FullhouseDev!
Tuy nhiên, nhiều bước phức tạp đã diễn ra để tạo ra kết quả đơn giản này.
Quá trình xử lý tệp .py
1. Nhận diện tệp Python
Đầu tiên, hệ điều hành nhận diện phần mở rộng .py
và hiểu rằng đây là một tệp chương trình Python. Phần mở rộng này là một quy ước giúp hệ thống biết cần sử dụng trình thông dịch Python để xử lý tệp.
2. Phân tích từ vựng và cú pháp
Khi bạn chạy tệp hello_world.py, trình thông dịch Python thực hiện hai bước phân tích ban đầu:
Phân tích từ vựng (Lexical Analysis): Trong giai đoạn này, mã nguồn được chia thành các "token" - đơn vị nhỏ nhất có ý nghĩa trong ngôn ngữ. Trong ví dụ của chúng ta, trình phân tích nhận diện
print
là một từ khóa và"Hello FullhouseDev!"
là một chuỗi string.Phân tích cú pháp (Syntax Analysis): Tiếp theo, trình thông dịch kiểm tra xem các token có được sắp xếp theo đúng quy tắc ngữ pháp của Python không. Nó xác nhận rằng lệnh
print()
có cú pháp đúng với các dấu ngoặc đơn được đóng mở phù hợp.
3. Biên dịch thành bytecode
Ngược với quan niệm phổ biến, Python không phải là ngôn ngữ được "thông dịch thuần túy". Trước khi thực thi, mã Python được biên dịch thành một dạng trung gian gọi là bytecode.
Bytecode là dạng mã đã được tối ưu hóa mà Python Virtual Machine (PVM) có thể thực thi nhanh chóng. Trong quá trình này, trình biên dịch của Python chuyển đổi tệp .py
thành các tệp .pyc
(được lưu trong thư mục __pycache__
).
hello_world.py -> __pycache__/hello_world.cpython-312.pyc
4. Thực thi bytecode trên Python Virtual Machine (PVM)
PVM là "trái tim" của Python, nó đọc và thực thi bytecode. Khi PVM gặp lệnh print("Hello FullhouseDev!")
, nó:
- Nhận diện đây là lời gọi đến hàm
print
- Xử lý đối số
"Hello FullhouseDev!"
là một chuỗi string - Gửi chuỗi này đến đầu ra tiêu chuẩn (thường là màn hình console)
Những gì xảy ra khi Python phân tích print("Hello FullhouseDev!")
Khi Python phân tích câu lệnh print("Hello FullhouseDev!")
, nó thực hiện các bước sau:
Tìm kiếm hàm: Python tìm kiếm trong không gian tên (namespace) hiện tại để tìm hàm
print
. Trong Python 3,print
là một hàm tích hợp sẵn.Đánh giá đối số: Python đánh giá chuỗi
"Hello FullhouseDev!"
và xác định đó là một đối tượng string.Gọi hàm: Python truyền đối tượng string vào hàm
print
.Thực thi hàm: Hàm
print
ghi chuỗi ra thiết bị đầu ra tiêu chuẩn (stdout), thường là console.
Mở rộng: Các biến thể của Hello World
Để hiểu rõ hơn, hãy xem một vài biến thể của chương trình Hello World:
Sử dụng biến:
message = "Hello FullhouseDev!" print(message)
Sử dụng string format:
name = "FullhouseDev" print(f"Hello {name}!")
Sử dụng nhiều lệnh print:
print("Hello") print("FullhouseDev!")
Mỗi biến thể này đều được xử lý hơi khác một chút bởi trình thông dịch Python, dù chúng đều tạo ra kết quả tương tự.
Hiểu về mã byte (bytecode)
Để hiểu rõ hơn về bytecode, bạn có thể sử dụng module dis
của Python để xem mã máy Python tạo ra. Ví dụ:
import dis
def hello():
print("Hello FullhouseDev!")
dis.dis(hello)
Kết quả có thể như sau:
3 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello FullhouseDev!')
4 CALL_FUNCTION 1
6 POP_TOP
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
Đây là các lệnh mà Python Virtual Machine thực thi: tải hàm print, tải chuỗi constant, gọi hàm với một tham số, v.v.
Kết luận
Khi bạn chạy một tệp Python đơn giản như hello_world.py, một loạt quy trình phức tạp diễn ra phía sau hậu trường. Từ việc nhận diện tệp Python, phân tích mã nguồn, biên dịch thành bytecode, đến việc thực thi trên Python Virtual Machine - tất cả chỉ để hiển thị dòng chữ "Hello FullhouseDev!" đơn giản trên màn hình.
Hiểu biết về những quy trình này không chỉ giúp bạn thỏa mãn tò mò mà còn trang bị cho bạn kiến thức nền tảng vững chắc để tiến xa hơn trên hành trình lập trình Python của mình.
Trong bài tiếp theo, chúng ta sẽ tìm hiểu về các biến trong Python và cách chúng hoạt động trong bộ nhớ. Hãy tiếp tục khám phá thế giới Python cùng FullhouseDev!
Comments