25. Tạo mã byte

Tạo bytecode là giai đoạn CPython chuyển đổi cú pháp có cấu trúc thành các hướng dẫn máy ảo có thể thực thi được.

Trình phân tích cú pháp xây dựng AST.

Bảng ký hiệu xác định hành vi phạm vi.

Sau đó, trình biên dịch sẽ đưa ra các hướng dẫn mã byte triển khai ngữ nghĩa Python.

Đối với nguồn này:python id="bjlwm8" def add(a, b): return a + b CPython tạo mã byte có hình dạng như sau:text id="plhxq4" LOAD_FAST a LOAD_FAST b BINARY_OP + RETURN_VALUE Tên và định dạng lệnh chính xác khác nhau giữa các phiên bản Python, nhưng mô hình vẫn ổn định:```text id="ecx81v" bytecode is a low-level instruction stream executed by the CPython virtual machine


Vic to mã byte xy ra sau khi xây dng AST và phân tích phm vi.```text id="5v2o9v"
source
    
tokenization
    
parsing
    
AST
    
symbol table
    
bytecode generation
    
code object
    
evaluation loop
```Trình biên dch thc hin AST và đưa ra các hướng dn cùng vi siêu d liu.

Đầu ra tr thành mt phn ca đối tượng mã.

## 25.2 Mã byte đại diện cho điều gì

Bytecode là tp lnh o cho CPython.

Nó không phi là mã máy.

Nó không phi là mã ngun.

Nó là ngôn ng thc thi trung gian được thiết kế cho trình thông dch CPython.

Ngun ví d:```python id="mwhlwe"
x = 1 + 2
```Mã byte có th có:```text id="cv4c36"
LOAD_CONST 3
STORE_NAME x
LOAD_CONST None
RETURN_VALUE
```Trình thông dch sau đó s thc hin tng lnh mt.

Công vic ca trình biên dch là:```text id="wlk7tq"
preserve Python semantics
emit correct stack behavior
emit correct control flow
emit correct scope access
record source metadata
```## 25.3 Mã byte dựa trên ngăn xếp

Mã byte CPython s dng máy xếp chng.

Hu hết các hướng dn đẩy hoc bt các giá tr t ngăn xếp đánh giá.

Ví d:```python id="qggm8k"
a + b
```Biên son:```text id="jlwm0j"
LOAD_FAST a
LOAD_FAST b
BINARY_OP +
```S phát trin ca ngăn xếp:```text id="4tq4zg"
LOAD_FAST a
    stack: a

LOAD_FAST b
    stack: a, b

BINARY_OP +
    pop a and b
    push result
    stack: result
```Trình biên dch phi gi hiu ng ngăn xếp nht quán.

Mi đường dn mã byte phi duy trì trng thái ngăn xếp hp l.

## 25.4 Biên dịch biểu thức

Biu thc to ra giá tr.

Ví d:```python id="nl8bg0"
x + y * z
```AST duy trì quyn ưu tiên:```text id="0u6c93"
x + (y * z)
```Vic to mã byte tuân theo cu trúc đó.

Mã byte khái nim:```text id="jlwm0m"
LOAD_FAST x
LOAD_FAST y
LOAD_FAST z
BINARY_OP *
BINARY_OP +
```S phát trin ca ngăn xếp:```text id="f2zv3g"
x
x, y
x, y, z
x, temp
result
```Trình biên dch biên dch đệ quy các biu thc con.

## 25.5 Biên soạn câu lệnh

Các câu lnh thường phát ra các hướng dn v tác dng ph.

Ví d:```python id="rj0nwu"
x = value
```Biên son:```text id="zyulq0"
compile expression value
store into target x
```Mã byte có th có:```text id="jlwm0n"
LOAD_FAST value
STORE_FAST x
```Ví d:```python id="9hq2o6"
return x
```Biên son:```text id="jlwm0o"
LOAD_FAST x
RETURN_VALUE
```Trình biên dch phân bit gia:```text id="n0c2jr"
expressions producing values
statements performing actions
```## 25.6 Đang tải hằng số

Các hng s được ti t`co_consts`.

Ví d:```python id="s7hy3e"
x = 123
```Mã byte:```text id="jlwm0p"
LOAD_CONST 123
STORE_NAME x
```Trình biên dch chèn hng s vào`co_consts`và phát ra mt tham chiếu ch mc.

V mt khái nim:```text id="j49sul"
co_consts:
    0: 123

instruction:
    LOAD_CONST 0
```Trình thông dch gii quyết ch mc trong khi thc thi.

## 25.7 Đang tải người dân địa phương

Người dân địa phương nhanh chóng s dng các v trí được lp ch mc.

Ví d:```python id="bhz0x7"
def f(a, b):
    return a + b
```Mã byte:```text id="jlwm0q"
LOAD_FAST a
LOAD_FAST b
BINARY_OP +
RETURN_VALUE
```Trình biên dch s dng`LOAD_FAST`bi vì phân tích biu tượng đã được phân loi`a`Và`b`dưới dng các biến cc b.

Người dân địa phương nhanh chóng tránh tra cu t đin.

## 25.8 Đang tải quả cầu

Tra cu toàn cc và tích hp s dng các hướng dn khác nhau.

Ví d:```python id="y3afqz"
x = 10

def f():
    return x
```Bên trong`f`:

```text id="jlwm0r"
LOAD_GLOBAL x
RETURN_VALUE
```Trình thông dch kim tra:```text id="l1ajyz"
function globals
then builtins
```Trình biên dch chn`LOAD_GLOBAL`da trên thông tin bng ký hiu.

## 25.9 Đang tải các biến đóng

Các biến đóng s dng các hot động quy định.

Ví d:```python id="cv9ngd"
def outer():
    x = 1

    def inner():
        return x
```Bên trong`inner`:

```text id="jlwm0s"
LOAD_DEREF x
RETURN_VALUE
```Trình biên dch phát ra mã byte không tham chiếu vì`x`là mt biến min phí được ghi li t mt phm vi kèm theo.

Mã byte đóng truy cp vào các đối tượng ô thay vì các v trí cc b thông thường.

## 25.10 Mục tiêu nhiệm vụ

Mc tiêu bài tp được biên dch khác vi các biu thc thông thường.

Ví d:```python id="mav3fq"
x = 1
```Mã byte:```text id="jlwm0t"
LOAD_CONST 1
STORE_NAME x
```Nhưng vic gán thuc tính:```python id="y7g47q"
obj.value = 1
```Hình dng mã byte:```text id="jlwm0u"
LOAD_FAST obj
LOAD_CONST 1
STORE_ATTR value
```Bài tp ch s dưới:```python id="oxtk8t"
items[i] = value
```Hình dng mã byte:```text id="jlwm0v"
LOAD_FAST items
LOAD_FAST i
LOAD_FAST value
STORE_SUBSCR
```Biên dch mc tiêu ph thuc vào bi cnh AST.

## 25.11 Xóa

Vic xóa s dng các hướng dn chuyên dng.

Ví d:```python id="d8j5gc"
del x
```Mã byte có th có:```text id="jlwm0w"
DELETE_FAST x
```Ví d:```python id="b4d5gn"
del obj.attr
```Mã byte có th có:```text id="jlwm0x"
LOAD_FAST obj
DELETE_ATTR attr
```Vic xóa không phi là gán cho`None`. Nó loi b các ràng buc hoc mc nhp đối tượng theo loi mc tiêu.

## 25.12 Lệnh gọi hàm

Các cuc gi hàm to ra nhiu hướng dn.

Ví d:```python id="a3j0ut"
f(x, y)
```Mã byte khái nim:```text id="jlwm0y"
LOAD_NAME f
LOAD_FAST x
LOAD_FAST y
CALL 2
POP_TOP
```Trình biên dch phi:```text id="e8qjkl"
compile callable expression
compile positional arguments
compile keyword arguments
emit call instruction
handle stack layout
```Các cuc gi phương thc có th s dng các dng mã byte chuyên dng.

Ví d:```python id="s4m8cq"
obj.run()
```Hình dng có th:```text id="jlwm0z"
LOAD_FAST obj
LOAD_METHOD run
CALL 0
```Các phiên bn CPython hin đại cha chuyên môn hóa b sung và hành vi b nh đệm ni tuyến xung quanh các cuc gi.

## 25.13 Hoạt động nhị phân

Các phép toán s hc và nh phân phát ra hướng dn thao tác.

Ví d:```python id="gt4c4x"
a + b
```Mã byte:```text id="jlwm10"
LOAD_FAST a
LOAD_FAST b
BINARY_OP +
```Các ví d khác:

| Biu hin | Hot động |
| ---------- | --------------- |
|`a - b`| phép tr |
|`a * b`| phép nhân |
|`a / b`| phép chia |
|`a // b`| chia tng |
|`a % b`| modulo |
|`a ** b`| quyn lc |
|`a @ b`| ma trn nhân |
|`a << b`| dch chuyn trái |
|`a & b`| theo chiu bit và |

Trình biên dch đưa ra hướng dn vn hành. Vic gi loi thi gian chy xy ra sau đó.

Ví d:```python id="x8vwdk"
1 + 2
"a" + "b"
```C hai đều biên dch tương t nhau, nhưng hành vi ca đối tượng thi gian chy khác nhau.

## 25.14 So sánh

So sánh phát ra các hot động so sánh.

Ví d:```python id="e98twa"
a < b
```Mã byte có th có:```text id="jlwm11"
LOAD_FAST a
LOAD_FAST b
COMPARE_OP <
```So sánh theo chui yêu cu lung điu khin phc tp hơn.

Ví d:```python id="pxo93r"
a < b < c
```Điu này phi đánh giá`b`mt ln.

Biên son khái nim:```text id="jlwm12"
LOAD_FAST a
LOAD_FAST b
COMPARE_OP <
conditional jump if false
LOAD_FAST b
LOAD_FAST c
COMPARE_OP <
```Trình biên dch duy trì ng nghĩa so sánh theo chui ca Python.

## 25.15 Phép toán Boolean

Hot động Boolean ngn mch.

Ví d:```python id="dd8v9m"
a and b
```Mu biên dch:```text id="jlwm13"
evaluate a
jump if false
evaluate b

bchỉ thực hiện nếu cần thiết.

Tương tự:python id="a3pgh7" a or b đánh giábchỉ nếualà sai.

Hành vi đoản mạch được thực hiện thông qua các bước nhảy chứ không phải các lệnh gọi hàm thông thường.

25.16 Biểu thức điều kiện

Ví dụ:python id="r74d92" x if cond else y Mẫu biên dịch:```text id="jlwm14" evaluate cond jump to else branch if false evaluate x jump to end evaluate y


## 25,17`if`Báo cáo

Ví d:```python id="q70zfx"
if cond:
    a()
else:
    b()
```Mu biên dch:```text id="jlwm15"
compile condition
jump to else if false
compile a()
jump to end
compile b()
end
```Hình dng mã byte có th có:```text id="jlwm16"
LOAD_NAME cond
POP_JUMP_IF_FALSE else_label

LOAD_NAME a
CALL
POP_TOP
JUMP_FORWARD end_label

else_label:
LOAD_NAME b
CALL
POP_TOP

end_label:
```Trình biên dch qun lý nhãn và mc tiêu nhy ni b trước khi lp ráp cui cùng.

## 25,18`while`Vòng lặp

Ví d:```python id="0wdg4v"
while cond:
    work()
```Mu biên dch:```text id="jlwm17"
loop_start:
    evaluate cond
    jump to end if false
    compile body
    jump to loop_start
loop_end:
```Các vòng lp yêu cu theo dõi ngăn xếp khi cho:```text id="jlwm18"
break
continue
exception cleanup
```## 25,19`for`Vòng lặp

Ví d:```python id="uk10dk"
for item in items:
    work(item)
```Mu biên dch:```text id="jlwm19"
load iterable
get iterator

loop_start:
    get next item
    jump to end on StopIteration
    store item
    compile body
    jump to loop_start

loop_end:
```Trình biên dch phát ra mã byte giao thc iterator.

mt con trăn`for`vòng lp được điu khin bng trình lp ch không phi điu khin theo ch mc.

## 25,20`break`Và`continue`Ví dụ:```python id="h5f6ov"
while True:
    if stop:
        break

    continue

breaknhảy để thoát khỏi vòng lặp.continuenhảy tới điểm tiếp tục vòng lặp.

Trình biên dịch duy trì cấu trúc bối cảnh vòng lặp để các vòng lặp lồng nhau hoạt động chính xác.

Ví dụ:python id="r7bz0d" for x in xs: for y in ys: break Bên trongbreakchỉ thoát khỏi vòng lặp bên trong.

25.21 Xử lý ngoại lệ

Xử lý ngoại lệ yêu cầu siêu dữ liệu luồng điều khiển có cấu trúc.

Ví dụ:python id="12cm6v" try: risky() except ValueError: recover() finally: cleanup() Trách nhiệm biên soạn:```text id="jlwm1a" protected instruction ranges exception handler targets finally cleanup reraising behavior stack restoration


Trình biên dch ghi li:```text id="jlwm1b"
instruction range
handler entry
handler type
stack depth information
```Siêu d liu này cho phép trình thông dch chuyn sang trình x lý mt cách chính xác khi xy ra ngoi l.

## 25,22`with`Báo cáo

Ví d:```python id="wq6o7z"
with open(path) as f:
    data = f.read()
```Mu biên dch:```text id="jlwm1c"
evaluate context manager
call __enter__
store result
execute body
ensure __exit__ runs
handle exceptions correctly
```Trình biên dch phát ra logic dn dp đảm bo`__exit__`thc thi ngay c khi có ngoi l xy ra.`with`quá trình biên dch được kết ni cht ch vi máy x lý ngoi l.

## 25.23 Định nghĩa hàm

Các định nghĩa hàm biên dch theo hai giai đon.

Ví d:```python id="8k2d07"
def f(x):
    return x + 1
```Giai đon 1:```text id="jlwm1d"
compile function body into nested code object
```Giai đon 2:```text id="jlwm1e"
emit runtime instructions creating function object
```Mã byte khái nim:```text id="jlwm1f"
LOAD_CONST <code object f>
MAKE_FUNCTION
STORE_NAME f
```Bn thân phn thân s tr thành mã byte bên trong đối tượng mã lng nhau.

## 25,24 Đóng cửa

Ví d:```python id="b4pshk"
def outer():
    x = 1

    def inner():
        return x
```Trách nhim biên son:```text id="jlwm1g"
create closure cell for x
compile inner with free variable access
pass closure tuple during function creation
```Hình dng mã byte có th có bên trong`outer`:

```text id="jlwm1h"
MAKE_CELL x
LOAD_CONST 1
STORE_DEREF x

LOAD_CLOSURE x
BUILD_TUPLE 1
LOAD_CONST <code object inner>
MAKE_FUNCTION closure
```Bên trong`inner`:

```text id="jlwm1i"
LOAD_DEREF x
RETURN_VALUE
```## 25.25 Định nghĩa lớp

Ví d:```python id="1br4s3"
class C:
    x = 1
```Ni dung lp tr thành mt đối tượng mã lng nhau.

Mu biên dch:```text id="jlwm1j"
compile class body code object
emit runtime class construction logic
bind resulting class object
```Thân lp thc thi ging như các mô-đun nh vi không gian tên riêng.

Các phương thc tr thành các định nghĩa hàm lng nhau bên trong đối tượng mã ni dung lp.

## 25.26 Hiểu biết

S hiu biết được biên dch thành các phm vi lng nhau.

Ví d:```python id="9w8n9x"
[x * x for x in xs]
```Trách nhim biên son:```text id="jlwm1k"
create nested comprehension code object
iterate input iterable
bind local iteration variable
append results
return constructed container
```Các biến hiu không b rò r ra phm vi bên ngoài vì trình biên dch to ra b máy phm vi thc thi riêng bit.

## 25.27 Máy phát điện

Chc năng ca máy phát đin s dng đim treo.

Ví d:```python id="i8gtwx"
def gen():
    yield 1
    yield 2
```Trách nhim biên son:```text id="jlwm1l"
mark code object as generator
emit yield instructions
preserve resumable execution state
```Hình dng mã byte có th có:```text id="jlwm1m"
LOAD_CONST 1
YIELD_VALUE

LOAD_CONST 2
YIELD_VALUE

LOAD_CONST None
RETURN_VALUE
```Khung phi bo toàn trng thái trong sut h thng treo.

## 25.28 Coroutine và`await`Ví dụ:```python id="oqf8so"
async def fetch():
    return await client.get()
```Trách nhim biên son:```text id="jlwm1n"
mark coroutine flags
emit await handling
preserve suspension semantics
```Trình biên dch to mã byte cho hành vi lp lch coroutine thay vì các lnh gi đồng b thông thường.

## 25,29 Nhập khẩu

Ví d:```python id="3k7d9u"
import os
```Mu biên dch:```text id="jlwm1o"
IMPORT_NAME os
STORE_NAME os
```Ví d:```python id="38ef9k"
from math import sin
```Mu biên dch:```text id="jlwm1p"
IMPORT_NAME math
IMPORT_FROM sin
STORE_NAME sin
```Trình biên dch phát ra các hot động nhp. Quá trình ti mô-đun thc tế din ra trong thi gian chy.

## 25:30 Khẳng định

Ví d:```python id="g2m5qn"
assert x > 0
```Mu biên dch:```text id="jlwm1q"
evaluate condition
jump if true
raise AssertionError
```Trong chế độ ti ưu hóa (`python -O`), các câu lnh khng định có th được b qua hoàn toàn.

Đây là mt s chuyn đổi cp độ trình biên dch.

## 25.31 Vị trí nguồn và Bảng dòng

Trình biên dch ghi li ánh x gia mã byte và v trí ngun.

Các ánh x này h tr:```text id="jlwm1r"
tracebacks
debuggers
profilers
coverage tools
stepping
error reporting
```Mi phm vi hướng dn có th tương ng vi:```text id="jlwm1s"
line number
column offset
end line
end column
```Đối tượng mã lưu tr các bng ánh x nén.

## 25,32 Tính toán kích thước ngăn xếp

Trình biên dch tính toán độ sâu ngăn xếp ti đa.

Ví d:```python id="7qdzg3"
a + b * c
```Có th phát trin ngăn xếp:```text id="jlwm1t"
a
a, b
a, b, c
a, temp
result
```Độ sâu ti đa: 3.

Điu này tr thành`co_stacksize`.

Các khung phân b đủ không gian ngăn xếp da trên giá tr này.

## 25.33 Khối cơ bản

Trong ni b, trình biên dch thường nhóm các lnh thành các khi cơ bn.

Mt khi cơ bn là mt chui các hướng dn vi:```text id="jlwm1u"
single entry
single exit
no internal jumps
```Ví d:```python id="w2g2q7"
if cond:
    a()
b()
```Cu trúc khi có th:```text id="jlwm1v"
block 1:
    evaluate cond
    conditional jump

block 2:
    a()
    jump

block 3:
    b()
```Các khi cơ bn đơn gin hóa vic phân tích lung điu khin và độ phân gii bước nhy.

## 25,34 Độ phân giải nhảy

Trình biên dch ban đầu phát ra các nhãn tượng trưng.

Vic lp ráp sau này s gii quyết các sai lch lnh thc tế.

Quá trình khái nim:```text id="jlwm1w"
emit instructions
emit labels
calculate instruction offsets
replace labels with offsets
insert extended arguments if needed
recalculate offsets if sizes changed
```Độ phân gii bước nhy là mt lý do khiến quá trình biên dch có nhiu giai đon.

## 25.35 Bộ nhớ đệm nội tuyến và Hỗ trợ chuyên môn

Mã byte CPython hin đại h tr chuyên môn hóa thích ng.

Trình biên dch có th phát ra các mc trong b đệm liên quan đến hướng dn.

Các hot động ví d được hưởng li t chuyên môn hóa:```text id="jlwm1x"
attribute access
global lookup
binary operations
calls
method dispatch
```Mã byte ban đầu là chung chung.

Chuyên môn hóa thi gian chy sau này có th thay thế hành vi bng các đường dn nhanh được ti ưu hóa.

Trình biên dch chun b các b cc hướng dn cho phép điu chnh này.

## 25.36 Kiểm tra mã byte

s dng`dis`để kim tra mã byte được to.

Ví d:```python id="jlwm1y"
import dis

def f(a, b):
    return a + b

dis.dis(f)
```Các chc năng kim tra hu ích bao gm:```text id="jlwm1z"
dis.dis
dis.Bytecode
dis.get_instructions
```Kim tra mã byte là cn thiết cho:```text id="jlwm20"
compiler debugging
performance analysis
tooling
education
reverse engineering Python behavior
```## 25.37 Độ nhạy của phiên bản

Thay đổi mã byte gia các phiên bn CPython.

Nhng thay đổi có th bao gm:```text id="jlwm21"
new opcodes
removed opcodes
opcode renaming
instruction format changes
specialization changes
exception handling changes
line table changes
```Các công c nên tránh ph thuc vào b cc mã byte chính xác trên các phiên bn tr khi có h tr dành riêng cho phiên bn.

S dng API công khai thay vì phân tích mã byte thô theo cách th công bt c khi nào có th.

## 25.38 Vùng nguồn CPython quan trọng

Các tp tin quan trng bao gm:```text id="jlwm22"
Python/compile.c
Python/flowgraph.c
Python/assemble.c
Python/bytecodes.c
Include/opcode_ids.h
Lib/dis.py
Lib/opcode.py
```Vai trò khái nim:

| Khu vc | Vai trò |
| ------------- | -------------------------------------- |
|`compile.c`| Truyn ti AST và phát lnh hướng dn |
|`flowgraph.c`| X lý biu đồ lung điu khin |
|`assemble.c`| Lp ráp mã byte và độ phân gii nhy |
|`bytecodes.c`| Định nghĩa Opcode |
|`opcode.py`| Siêu d liu Opcode |
|`dis.py`| Kim tra mã byte |

## 25,39 Mô hình tinh thần tối thiểu

S dng mô hình này:```text id="jlwm23"
The compiler walks the AST.
Expressions emit stack-based instructions.
Statements emit side-effect and control-flow instructions.
Constants, names, and locals become indexed table references.
Control flow becomes jumps and exception metadata.
Functions, classes, comprehensions, and generators create nested code objects.
The final instruction stream becomes part of a code object executed by the CPython virtual machine.
```Vic to mã byte là giai đon trong đó cú pháp Python tr thành các hot động thc thi ca máy o.