30. Hướng dẫn mã byte

Hướng dẫn mã byte là các hoạt động được thực hiện bởi vòng đánh giá CPython. Chúng là dạng mã Python nhỏ gọn, ở cấp độ trình thông dịch sau khi phân tích cú pháp, xây dựng AST, phân tích ký hiệu và biên dịch.

Một hàm Python như:```python id="ya54lv" def add(a, b): return a + b


Bn có th kim tra lung đó bng`dis`:

```python id="7yf46p"
import dis

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

dis.dis(add)
```Đầu ra ph thuc vào phiên bn Python, nhưng nó thường hin th các hướng dn như:```text id="ot1vx4"
LOAD_FAST
LOAD_FAST
BINARY_OP
RETURN_VALUE
```Nhng hướng dn đó là t vng ca máy o CPython.

## 30.1 Lệnh Bytecode là gì

Lnh mã byte yêu cu trình thông dch thc hin mt thao tác nh.

Ví d:```text id="4m3y16"
load a local variable
load a constant
store into a local variable
perform binary addition
call a function
jump to another instruction
return from a frame
raise an exception
build a list
load an attribute
```Mt lnh thường có hai phn:```text id="3pmt1a"
opcode
operand
```Opcode cho biết phi làm gì.

Toán hng cung cp mt đối s s nguyên nh khi cn thiết.

Ví d:```text id="7i5m11"
LOAD_FAST 0
```có nghĩa:```text id="ssxj7c"
load fast local variable at slot 0
```Và:```text id="po4eiq"
LOAD_CONST 1
```có nghĩa:```text id="056i57"
load constant at index 1 in the code object's constants table
```Một số hướng dẫn không có toán hạng có ý nghĩa. Một số có toán hạng mà ý nghĩa của nó phụ thuộc hoàn toàn vào opcode.

## 30.2 Mã byte tồn tại trong các đối tượng mã

Bytecode thuộc về một đối tượng mã.

Một đối tượng hàm trỏ đến một đối tượng mã:```python id="3zs8ni"
def f(x):
    return x + 1

print(f.__code__)
```Đối tượng mã chứa luồng lệnh và các bảng được sử dụng bởi các lệnh.

Dữ liệu đối tượng mã quan trọng bao gồm:

| Lĩnh vực | Mục đích |
|---|---|
|`co_code`| Biểu diễn mã byte tiếp xúc với Python |
|`co_consts`| Các hằng số được sử dụng bởi`LOAD_CONST` |
| `co_names`| Tên được sử dụng bởi các hoạt động toàn cầu, thuộc tính và nhập |
|`co_varnames`| Tên biến cục bộ nhanh |
|`co_freevars`| Biến miễn phí từ phạm vi bên ngoài |
|`co_cellvars`| Người dân địa phương được nắm bắt bởi các chức năng bên trong |
|`co_stacksize`| Độ sâu ngăn xếp giá trị tối đa |
|`co_flags`| Cờ thực thi |
|`co_filename`| Tên tệp nguồn |
|`co_name`| Tên đối tượng mã |
|`co_qualname`| Tên đủ điều kiện |
| bảng ngoại lệ | Siêu dữ liệu xử lý ngoại lệ |
| bảng dòng | Siêu dữ liệu vị trí nguồn |

Luồng mã byte nhỏ gọn vì nó không lưu trữ trực tiếp tên đầy đủ, hằng hoặc con trỏ đối tượng. Nó lưu trữ các chỉ mục số nguyên vào các bảng này.

## 30.3 Hướng dẫn Tham khảo Bảng

Hãy xem xét:```python id="p7suvh"
def f(x):
    return x + 10
```Hằng số`10`được lưu trữ trong bảng hằng số của đối tượng mã.

Tên địa phương`x`được lưu trữ trong bảng biến cục bộ.

Luồng hướng dẫn đề cập đến chúng theo chỉ mục.

Về mặt khái niệm:```text id="d913xq"
co_consts:
    [None, 10]

co_varnames:
    ["x"]

bytecode:
    LOAD_FAST 0
    LOAD_CONST 1
    BINARY_OP +
    RETURN_VALUE
```Thiết kế này giữ cho hướng dẫn nhỏ.

Thay vì lưu trữ chuỗi`"x"`trong mọi lệnh truy cập cục bộ, CPython lưu trữ số vị trí`0`.

Thay vì lưu trữ đối tượng`10`ngay bên trong lệnh, CPython lưu trữ chỉ số không đổi`1`.

## 30.4 Tháo gỡ

các`dis`mô-đun chuyển đổi mã byte thành dạng có thể đọc được.```python id="45j36i"
import dis

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

dis.dis(f)
```Việc tháo dỡ thường bao gồm:```text id="zxtwgj"
source line number
bytecode offset
opcode name
operand
resolved operand meaning
jump target markers
cache entries, depending on options and version
```Hình dạng ví dụ:```text id="pely0k"
  3           0 RESUME                   0
              2 LOAD_FAST                0 (a)
              4 LOAD_FAST                1 (b)
              6 BINARY_OP                0 (+)
             10 STORE_FAST               2 (c)

  4          12 LOAD_FAST                2 (c)
             14 RETURN_VALUE
```Đầu ra chính xác thay đổi theo phiên bản Python. Mã byte là chi tiết triển khai CPython, không phải là tập lệnh bên ngoài ổn định.

## 30.5 Độ lệch lệnh

Mỗi lệnh có một vị trí trong luồng mã byte.

Việc tháo gỡ hiển thị điều này như một sự bù đắp:```text id="p6y2o6"
0 RESUME
2 LOAD_FAST
4 LOAD_FAST
6 BINARY_OP
10 STORE_FAST
```Offset được sử dụng bởi:```text id="qv3e7s"
jump instructions
exception tables
line number mapping
tracebacks
debuggers
profilers
coverage tools
```Lệnh nhảy có thể nhắm tới một offset khác.

Về mặt khái niệm:```text id="3ew1cz"
POP_JUMP_IF_FALSE 24
```có nghĩa:```text id="c0kqvz"
if condition is false, continue execution at bytecode offset 24
```Các chi tiết CPython hiện đại khác nhau, nhưng ý tưởng thì giống nhau: mã byte là một chuỗi các hướng dẫn có thể định địa chỉ.

## 30.6 Hiệu ứng ngăn xếp

Mỗi lệnh đều có hiệu ứng ngăn xếp.

Hiệu ứng ngăn xếp mô tả cách lệnh thay đổi ngăn xếp giá trị của khung.

| Hướng dẫn | Xếp chồng trước | Xếp chồng sau |
|---|---|---|
|`LOAD_CONST` | `[]` | `[constant]` |
| `LOAD_FAST` | `[]` | `[local]` |
| `STORE_FAST` | `[value]` | `[]` |
| `BINARY_OP` | `[left, right]` | `[result]` |
| `LOAD_ATTR` | `[object]` | `[attribute]` |
| `CALL` | `[callable, args...]` | `[result]` |
| `RETURN_VALUE` | `[value]`| thoát khỏi khung |

Trình biên dịch phải phát ra mã byte với kỷ luật ngăn xếp hợp lệ. Tại mỗi lệnh, ngăn xếp phải chứa các giá trị mà lệnh mong đợi.

Tại các điểm hợp nhất luồng điều khiển, tất cả các đường dẫn đến phải tạo ra các hình dạng ngăn xếp tương thích.

## 30.7 Hướng dẫn tải cơ bản

Tải hướng dẫn đẩy các giá trị vào ngăn xếp.

Các loại tải phổ biến:

| Hướng dẫn | Ý nghĩa |
|---|---|
|`LOAD_CONST`| Đẩy một hằng số từ`co_consts` |
| `LOAD_FAST`| Đẩy một biến cục bộ từ một khe cục bộ nhanh |
|`LOAD_GLOBAL`| Đẩy tên toàn cầu hoặc tên dựng sẵn |
|`LOAD_DEREF`| Đẩy một giá trị ô đóng |
|`LOAD_ATTR`| Đẩy một thuộc tính từ một đối tượng |
|`LOAD_NAME`| Đẩy tên bằng cách sử dụng lớp hoặc tra cứu không gian tên động |

Ví dụ:```python id="0nyz5p"
def f(x):
    return x + 1
```Mã byte khái niệm:```text id="zc9cpj"
LOAD_FAST x
LOAD_CONST 1
BINARY_OP +
RETURN_VALUE

LOAD_FASTđọc một khe từ khung hiện tại.LOAD_CONSTđọc từ đối tượng mã.

30.8 Hướng dẫn về cửa hàng

Hướng dẫn lưu trữ sử dụng các giá trị từ ngăn xếp và đặt chúng ở đâu đó.

Hướng dẫn Ý nghĩa
STORE_FAST Lưu trữ vào một khe cục bộ nhanh
STORE_GLOBAL Lưu trữ vào không gian tên chung
STORE_NAME Lưu trữ vào không gian tên cục bộ hiện tại
STORE_ATTR Lưu trữ vào thuộc tính đối tượng
STORE_SUBSCR Lưu trữ vào mục tiêu đăng ký
STORE_DEREF Lưu trữ vào ô đóng cửa
DELETE_FAST Xóa một vị trí cục bộ
DELETE_ATTR Xóa một thuộc tính
DELETE_SUBSCR Xóa một mục

Ví dụ:python id="dvy1us" def f(a, b): c = a + b return c Hành vi ngăn xếp khái niệm:```text id="env4qv" LOAD_FAST a stack: [a] LOAD_FAST b stack: [a, b] BINARY_OP + stack: [result] STORE_FAST c stack: []


`STORE_FAST`tiêu th kết qu. Nó không để li giá tr được gán trên ngăn xếp tr khi trình biên dch sao chép rõ ràng nó cho mc đích s dng khác.

## 30.9 Hướng dẫn biến cục bộ

Hướng dn cc b nhanh s dng ch mc, không phi tên.

Vì:```python id="dse6a4"
def f(a, b):
    c = a + b
    return c
```Trình biên dch gán các v trí cc b:

| Khe | Tên |
|---:|---|
| 0 |`a`|
| 1 |`b`|
| 2 |`c`|

Hướng dn:```text id="wz4dzl"
LOAD_FAST 1
```có nghĩa:```text id="nxyj1j"
push local slot 1, which is b
```Điu này r hơn nhiu so vi vic tra cu t đin. Khung lưu tr các cc b nhanh theo b cc ging như mng.

## 30.10 Hướng dẫn liên tục

Các hng s được lưu tr trong`co_consts`.

Ví d:```python id="j8ju43"
def f():
    return 123
```Đối tượng mã khái nim:```text id="2kqu9y"
co_consts:
    [None, 123]

bytecode:
    LOAD_CONST 1
    RETURN_VALUE
```Bng hng s có th cha:```text id="b0tjvm"
None
numbers
strings
bytes
tuples of constants
frozensets of constants
nested code objects
```Các hàm lng nhau và s hiu biết thường xut hin dưới dng các đối tượng mã lng nhau bên trong`co_consts`.

## 30.11 Hướng dẫn đặt tên

Tra cu tên ph thuc vào phm vi.

 cp độ mô-đun:```python id="axbo96"
x = 10
print(x)
```tên tn ti trong t đin mô-đun.

Bên trong mt chc năng:```python id="0nxa3s"
def f():
    return x
```nếu như`x`không phi là cc b, CPython thc hin tra cu toàn cc hoc tích hp.

Hướng dn quan trng:

| Hướng dn | S dng đin hình |
|---|---|
|`LOAD_GLOBAL`| Chc năng tra cu toàn cc và tích hp |
|`LOAD_NAME`| Tra cu ni dung lp và không gian tên động |
|`STORE_NAME`| Phân công không gian tên mô-đun hoc lp |
|`LOAD_FAST`| Chc năng tra cu slot cc b |
|`LOAD_DEREF`| Tra cu biến đóng ca |

Trình biên dch chn lnh da trên phân tích bng ký hiu.

## 30.12 Hướng dẫn thuộc tính

Truy cp thuc tính s dng các hướng dn như`LOAD_ATTR`Và`STORE_ATTR`.

```python id="vqlcss"
value = obj.x
```V mt khái nim:```text id="so9d8z"
LOAD_FAST obj
LOAD_ATTR x
STORE_FAST value
```Tra cu thuc tính có th liên quan đến:```text id="bq7pdp"
object type
descriptor protocol
instance dictionary
slots
class dictionary
base classes
custom __getattribute__
custom __getattr__
inline caches
```Nhưng hiu ng ngăn xếp  cp mã byte rt đơn gin:```text id="nxg6f5"
LOAD_ATTR:
    input:  [object]
    output: [attribute_value]
```Đối vi nhim v:```python id="5m00ah"
obj.x = value
```V mt khái nim:```text id="y7heq6"
LOAD_FAST value
LOAD_FAST obj
STORE_ATTR x
```Th t toán hng chính xác được xác định bng cách trin khai opcode.

## 30.13 Hướng dẫn đăng ký

Đăng ký s dng toán hng ngăn xếp.```python id="0323zx"
value = xs[i]
```Mã byte khái nim:```text id="kvxa2c"
LOAD_FAST xs
LOAD_FAST i
BINARY_SUBSCR
STORE_FAST value
```các`BINARY_SUBSCR`lnh s dng vùng cha và khóa, sau đó đẩy kết qu.

Đối vi nhim v:```python id="tnoqbn"
xs[i] = value
```V mt khái nim:```text id="ey4z88"
LOAD_FAST value
LOAD_FAST xs
LOAD_FAST i
STORE_SUBSCR
```Điu này gi giao thc gán mc ca đối tượng.

Để xóa:```python id="edq3j2"
del xs[i]
```trình biên dch phát ra mã byte đăng ký theo định hướng xóa.

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

S dng CPython hin đại`BINARY_OP`cho nhiu phép toán nh phân, vi toán hng mô t phép toán c th.

Biu thc Python:```python id="dgwszy"
a + b
```Mã byte khái nim:```text id="g1haxi"
LOAD_FAST a
LOAD_FAST b
BINARY_OP +
```Các hot động khác bao gm:```text id="7wzr1z"
+
-
*
@
/
%
//
**
<<
>>
&
|
^
```Các biến th ti ch cũng tn ti v mt khái nim:```python id="zg641m"
x += y
```Điu này có th s dng mt biu mu hot động ti ch hoc mt biến th toán hng c gng ng nghĩa ti ch.

Các hot động nh phân rt năng động.`+`có th có nghĩa là cng s nguyên, cng float, ni chui, ni danh sách hoc do người dùng xác định`__add__`.

## 30.15 Hoạt động đơn nhất

Hot động đơn nguyên tiêu th mt giá tr ngăn xếp và đẩy mt kết qu.

Ví d:```python id="45q3s0"
-x
+x
~x
not x
```Mã byte khái nim:```text id="0wm8tb"
LOAD_FAST x
UNARY_NEGATIVE
```Hiu ng ngăn xếp:```text id="4h9g0l"
input:  [x]
output: [-x]
```Các hot động đơn nht vn s dng ng nghĩa đối tượng Python.`-x`có th gi`x.__neg__()`cho các đối tượng do người dùng định nghĩa.

## 30.16 Hướng dẫn so sánh

Vic so sánh s dng toán hng và đưa ra kết qu.```python id="kybtui"
a < b
```V mt khái nim:```text id="lpn8y7"
LOAD_FAST a
LOAD_FAST b
COMPARE_OP <
```Các thao tác so sánh bao gm:```text id="viop49"
<
<=
==
!=
>
>=
in
not in
is
is not
exception matching
```So sánh có th gi mã người dùng:```python id="iwk7b1"
class X:
    def __lt__(self, other):
        return True
```Vì vy, ngay c mt lnh so sánh cũng có th phân b, gi mã Python, đưa ra mt ngoi l hoc tr v các đối tượng không phi Boolean trong mt s bi cnh giao thc trước khi kim tra tính xác thc.

## 30.17 Hướng dẫn nhảy

Lnh nhy thay đổi con tr lnh.

H thc hin:```text id="td78o9"
if statements
while loops
for loops
boolean short-circuiting
conditional expressions
exception flow
pattern matching branches
```Ví d:```python id="gtmgg4"
def f(x):
    if x:
        return 1
    return 0
```Mã byte khái nim:```text id="gsgii8"
LOAD_FAST x
POP_JUMP_IF_FALSE else_branch
LOAD_CONST 1
RETURN_VALUE

else_branch:
LOAD_CONST 0
RETURN_VALUE
```Mt s bước nhy là vô điu kin. Mt s kim tra giá tr ngăn xếp hàng đầu. Mt s bo tn giá tr. Mt s bt nó lên.

Hiu ng ngăn xếp ca mt bước nhy cũng quan trng như mc tiêu ca nó.

## 30.18 Hướng dẫn vòng lặp

Vòng lp s dng các lnh nhy cng vi các lnh dành riêng cho trình vòng lp.

MT`while`vòng lp:```python id="1vfdnh"
while cond:
    body()
```v mt khái nim biên dch thành:```text id="kbpb8k"
loop_start:
    evaluate cond
    if false, jump loop_end
    execute body
    jump loop_start

loop_end:
```MT`for`vòng lp:```python id="5q6rsq"
for x in xs:
    body(x)
```s dng hướng dn giao thc iterator:```text id="x43wuw"
LOAD_FAST xs
GET_ITER

loop:
    FOR_ITER end
    STORE_FAST x
    ...
    JUMP loop

end:

FOR_ITERgiữ iterator trên ngăn xếp trong khi quá trình lặp tiếp tục.

30.19 Hướng dẫn gọi

Cuộc gọi là một trong những hoạt động mã byte quan trọng nhất về hiệu suất.

Vì:python id="e7dc4b" result = f(a, b) thiết lập ngăn xếp khái niệm:```text id="a7s51h" LOAD_FAST f LOAD_FAST a LOAD_FAST b CALL 2 STORE_FAST result


Các cuộc gọi có thể nhắm mục tiêu:```text id="t77949"
Python functions
built-in functions
bound methods
classes
callable instances
C extension functions
coroutines
descriptors
```CPython sử dụng các quy ước gọi được tối ưu hóa như vectorcall để giảm việc tạo bộ dữ liệu và từ điển tạm thời.

## 30.20 Hướng dẫn trả lại

Lệnh quay lại thoát khỏi khung hiện tại.```python id="k8kmjw"
def f():
    return 42
```Mã byte khái niệm:```text id="tq86ob"
LOAD_CONST 42
RETURN_VALUE
```Ngăn xếp trước khi trở về:```text id="5ks5b0"
[42]

RETURN_VALUEtiêu thụ đối tượng trả về và đưa nó cho người gọi.

Đối với các hàm không có trả về rõ ràng:python id="j1sx5u" def f(): pass trình biên dịch trả vềNone.

Về mặt khái niệm:```text id="x839pp" LOAD_CONST None RETURN_VALUE


Đưa ra mt ngoi l cũng s dng mã byte.```python id="c411i6"
raise ValueError("bad")
```V mt khái nim:```text id="2swrvt"
LOAD_GLOBAL ValueError
LOAD_CONST "bad"
CALL 1
RAISE_VARARGS 1
```Lnh raise thoát khi quá trình thc thi thông thường và chuyn sang giai đon lan truyn ngoi l.

Nó phi tương tác vi:```text id="nkhmtx"
thread exception state
tracebacks
exception handlers
finally blocks
context and cause
frame unwinding
```Lnh tăng lương thường không mang li kết qu bình thường.

## 30.22 Hướng dẫn xử lý ngoại lệ

Mã byte x lý ngoi l đã thay đổi đáng k trên các phiên bn Python.

CPython hin đại s dng các bng ngoi l được liên kết vi các đối tượng mã thay vì các mã ngăn xếp khi cũ hơn cho nhiu tác v.

Tuy nhiên, trình thông dch cn hướng dn và siêu d liu cho:```text id="3wj1o7"
entering handlers
matching exception types
binding exception variables
reraising
clearing exception state
running finally blocks
handling with-statements
```Ví d:```python id="7pkq92"
try:
    risky()
except ValueError as exc:
    recover(exc)
```Mã được biên dch phi mô t:```text id="fxm4bb"
protected bytecode range
handler target
stack depth to restore
exception matching operation
binding of exc
cleanup of exc
```Mã byte ngoi l rt nhy cm vì nó phi bo toàn ng nghĩa Python trong khi làm sch các giá tr ngăn xếp tm thi mt cách chính xác.

## 30.23 Hướng dẫn nhập

Quá trình nhp có các hot động mã byte chuyên dng.```python id="gik0n1"
import math
```V mt khái nim:```text id="m9nu5u"
LOAD_CONST level
LOAD_CONST fromlist
IMPORT_NAME math
STORE_NAME math
```Vì:```python id="zoxgo7"
from math import sqrt
```hot động khái nim bao gm:```text id="n577z3"
IMPORT_NAME math
IMPORT_FROM sqrt
STORE_NAME sqrt
```Nhp mã byte gi máy nhp. Nó có th thc thi mã mô-đun, ly khóa nhp, ti mã byte được lưu trong b nh đệm, chy khi to gói hoc gây ra li nhp.

Câu lnh nhp là mã thc thi, không phi là khai báo tĩnh.

## 30.24 Hướng dẫn về vùng chứa

Nghĩa đen ca vùng cha s dng hướng dn xây dng.```python id="fofmnt"
xs = [a, b, c]
```V mt khái nim:```text id="8ezo7g"
LOAD_FAST a
LOAD_FAST b
LOAD_FAST c
BUILD_LIST 3
STORE_FAST xs
```Các hướng dn xây dng khác bao gm các thao tác cho:```text id="xge9ra"
tuples
sets
dicts
slices
strings
lists from comprehensions
maps from key-value pairs
```Đối vi nghĩa đen trong t đin:```python id="2pyoy0"
d = {"x": a, "y": b}
```trình biên dch sp xếp các khóa và giá tr để lnh xây dng chính t có th s dng chúng.

## 30.25 Hướng dẫn giải nén

Hướng dn gii nén phân hy các giá tr lp li.```python id="75qhe0"
a, b = pair
```V mt khái nim:```text id="h2jtqv"
LOAD_FAST pair
UNPACK_SEQUENCE 2
STORE_FAST a
STORE_FAST b
```Gii nén m rng:```python id="b1ifoe"
a, *middle, z = values
```s dng hướng dn gii nén có kh năng to danh sách cho mc tiêu được gn du sao.

Hướng dn gii nén phi thc thi đúng nguyên tc. Nếu iterable có quá ít hoc quá nhiu giá tr, CPython s báo li.

## 30.26 Hướng dẫn đóng

Các hàm lng nhau yêu cu các hướng dn liên quan đến vic đóng.

Ví d:```python id="ji8q8n"
def outer():
    x = 10

    def inner():
        return x

    return inner
```Trình biên dch phi sp xếp`x`sng trong mt vt th tế bào.

Các hot động liên quan bao gm:```text id="miqfx4"
make cell variables
load closure cells
load dereferenced values
store dereferenced values
build function with closure
```V mt khái nim:```text id="xdtmaw"
outer frame:
    x stored in cell

inner function:
    closure points to same cell

inner bytecode:
    LOAD_DEREF x
```Đây là cách`inner`có th truy cp`x`sau đó`outer`tr li.

## 30.27 Hướng dẫn tạo hàm

A`def`câu lnh to mt đối tượng hàm khi chy.```python id="az4vj6"
def f(x):
    return x + 1
```Ti thi đim thc thi mô-đun, CPython không ch đăng ký mt hàm tĩnh. Nó thc thi mã byte để xây dng mt đối tượng hàm t mt đối tượng mã.

V mt khái nim:```text id="oxvnd7"
LOAD_CONST <code object f>
MAKE_FUNCTION
STORE_NAME f
```Nếu hàm có giá tr mc định, chú thích, giá tr mc định ca t khóa hoc ô đóng, thì chúng s được ti và đính kèm trong quá trình to hàm.

Điu này gii thích ti sao`def`có th thc thi được:```python id="vb8p68"
if debug:
    def f():
        return "debug"
else:
    def f():
        return "normal"
```Ch có mt nhánh to và liên kết`f`.

## 30.28 Hướng dẫn tạo lớp

A`class`câu lnh cũng thc thi mã byte.```python id="4c6kdt"
class C:
    x = 1
```Hành vi cp cao mang tính khái nim:```text id="n94lef"
load build_class
load class body code object
make function for class body
load class name
call build_class
store class object
```Bn thân thân lp có mt đối tượng mã. Nó chy trong mt không gian tên được chun b sn. Sau khi nó kết thúc, siêu d liu s to đối tượng lp thc tế.

Điu này gii thích ti sao thân lp có th chy mã tùy ý:```python id="x8cd5y"
class C:
    print("building class")
    x = compute()
```Vòng lp đánh giá thc thi phn thân đó ging như mã khác.

## 30.29 Hướng dẫn về trình tạo và Coroutine

Trình to và coroutine cn có hướng dn để tm dng và tiếp tc.

Ví d:```python id="0q3kic"
def gen():
    yield 1
    yield 2
```MT`yield`lnh tr v mt giá tr cho người gi trong khi vn gi nguyên trng thái khung.

V mt khái nim:```text id="47ev86"
LOAD_CONST 1
YIELD_VALUE
resume later
LOAD_CONST 2
YIELD_VALUE
resume later
LOAD_CONST None
RETURN_VALUE
```Coroutine s dng các cơ chế liên quan để`await`.

```python id="sbeqhd"
async def f():
    result = await g()
    return result
```Mã byte phi h tr:```text id="b2khca"
creating coroutine objects
awaiting awaitables
suspending execution
resuming with values
resuming with exceptions
returning final result
```## 30.30 Hướng dẫn khớp mẫu

So khp mu cu trúc biên dch thành các bài kim tra chuyên bit, gii nén, truy cp thuc tính, kim tra ánh x, kim tra trình t và các nhánh.

Ví d:```python id="1rrlbw"
match value:
    case [x, y]:
        return x + y
    case _:
        return 0
```Trình biên dch phát ra mã byte gn như thc hin:```text id="6oglmv"
load subject
check sequence pattern
check length
unpack values
bind x and y
execute body
otherwise try next case
```Mã byte khp mu phi bo toàn ng nghĩa Python xung quanh các kết qu khp không thành công. Các ràng buc t các la chn thay thế tht bi không được rò r sai vào các trường hp thành công sau này.

## 30.31 Hướng dẫn về bộ đệm

CPython hin đại bao gm các mc b đệm ni tuyến được liên kết vi mt s hướng dn mã byte.

Khi tháo g, bn có th thy các mc liên quan đến b đệm tùy thuc vào tùy chn và phiên bn.

Các mc b đệm này h tr chuyên môn hóa cho các hot động như:```text id="j0ixza"
attribute access
global lookup
binary operations
method calls
function calls
subscript operations
```Các mc trong b đệm không phi là hot động bình thường ca Python. Chúng là siêu d liu thông dch viên.

Hiu ng ngăn xếp ca lnh logic vn là phn ng nghĩa quan trng.

Ví d:```text id="8sx1vs"
LOAD_ATTR name
CACHE
CACHE

LOAD_ATTRvẫn tiêu thụ một đối tượng và đẩy một giá trị thuộc tính. Các mục bộ đệm giúp thực hiện việc đó nhanh hơn.

30.32 Hướng dẫn thích ứng

Mã byte thích ứng cho phép CPython chuyên môn hóa các hoạt động nóng.

Một thao tác chung có thể được viết lại hoặc diễn giải như một dạng chuyên biệt sau khi thực hiện lặp đi lặp lại.

Ví dụ về luồng khái niệm:text id="08ouu3" BINARY_OP observes int + int repeatedly ↓ specialized int-add path Lệnh chuyên biệt phải giữ nguyên hợp đồng ngăn xếp:```text id="8f1uvg" input: [left, right] output: [result]


Cơ chế này mang li nhng ci tiến v hiu sut mà không thay đổi ng nghĩa  cp độ Python.

## 30.33 Hướng dẫn giả

Mt s tên lnh có th xut hin trong phn bên trong ca trình biên dch hoc siêu d liu được to nhưng không xut hin dưới dng mã hot động thi gian chy thông thường trong lung mã byte cui cùng.

Các hướng dn gi có th giúp th hin:```text id="5ql4dw"
abstract control-flow operations
exception handling structure
compiler intermediate forms
assembler-level markers
```Khi đọc ni b CPython, hãy phân bit:```text id="ccdgxn"
source-level syntax
compiler intermediate instructions
runtime bytecode instructions
inline cache entries
generated metadata
```Không phi mi tên trong các tp liên quan đến opcode đều hot động ging như mt lnh thông thường được thc thi bi vòng đánh giá.

## 30.34 Hướng dẫn Gia đình

Nhiu hướng dn thuc v gia đình.

Ví d:```text id="36dyw4"
load family
store family
delete family
binary operation family
unary operation family
jump family
call family
import family
closure family
container-build family
exception family
```Hướng dn gia đình giúp bn đọc tháo g.

Khi bn nhìn thy`LOAD_*`, mong đợi mt giá tr được đẩy.

Khi bn nhìn thy`STORE_*`, mong đợi mt giá tr được tiêu th.

Khi bn nhìn thy`JUMP_*`, mong đợi lung điu khin s thay đổi.

Khi bn nhìn thy`CALL`, mong đợi b cc ngăn xếp đối s và có th gi được s quan trng.

## 30.35 Hướng dẫn trung lập về ngăn xếp

Mt s hướng dn không thay đổi ngăn xếp giá tr logic ca Python.

Ví d có th bao gm:```text id="cos45t"
RESUME
NOP
cache-related entries
some instrumentation markers
```Các hướng dn này vn có th quan trng đối vi trng thái thc thi, truy tìm, chuyên môn hóa hoc trình thông dch.

Lnh trung lp ngăn xếp có th nh hưởng đến hành vi thi gian chy ngay c khi nó không đẩy hoc bt đối tượng Python.

Ví d,`RESUME`đánh du các đim tiếp tc thc thi trong mã byte CPython hin đại.

## 30.36 Sự khác biệt về phiên bản

Mã byte CPython thay đổi trên các phiên bn.

Nhng thay đổi có th bao gm:```text id="kiol94"
new opcodes
removed opcodes
combined opcodes
different call protocol
different exception handling representation
different cache layout
different jump semantics
different disassembly format
specialized instruction changes
```Đây là lý do ti sao mã byte nên được coi là dành riêng cho phiên bn.

Mã ph thuc vào mã byte chính xác s khai báo phiên bn Python nào nó nhm mc tiêu.

Ví d v các công c phân bit phiên bn:```text id="yl9axc"
bytecode transformers
coverage tools
debuggers
decompilers
optimizers
security analyzers
teaching visualizers
profilers
```Đối vi mã ng dng Python thông thường, chi tiết mã byte thường không liên quan. Đối vi ni b CPython, chúng là trung tâm.

## 30.37 Đọc mã byte bằng tay

Mt quá trình đọc hu ích:```text id="4mbysd"
identify locals
identify constants
identify names
track stack effects
mark jumps
mark call sites
mark exception regions
mark return paths
```Ví d:```python id="9opwew"
def f(a, b):
    if a > b:
        return a - b
    return b - a
```Mã byte khái nim:```text id="c9ffv9"
LOAD_FAST a
LOAD_FAST b
COMPARE_OP >
POP_JUMP_IF_FALSE else

LOAD_FAST a
LOAD_FAST b
BINARY_OP -
RETURN_VALUE

else:
LOAD_FAST b
LOAD_FAST a
BINARY_OP -
RETURN_VALUE
```Theo dõi ngăn xếp:```text id="45f5d2"
LOAD_FAST a        [a]
LOAD_FAST b        [a, b]
COMPARE_OP >       [a > b]
POP_JUMP...        []
```C hai nhánh đều tr v trc tiếp, do đó không có s hp nht sau nhánh.

## 30.38 Ví dụ: Hiểu danh sách

Ngun:```python id="k2d22v"
def f(xs):
    return [x * 2 for x in xs if x > 0]
```V mt khái nim, CPython to mt đối tượng mã lng nhau để d hiu.

Chc năng bên ngoài:```text id="4gr87o"
load comprehension code object
make function
load xs
get iterator
call comprehension function
return result
```Mã hiu bên trong:```text id="c4xj0s"
build empty list
for each x in iterator:
    if x > 0:
        append x * 2
return list
```Điu này gii thích ti sao s hiu biết có phm vi riêng ca chúng.

Lung lnh mã byte làm cho điu này hin th vì đối tượng mã lng nhau xut hin trong`co_consts`.

## 30.39 Ví dụ: Đóng cửa

Ngun:```python id="9gbvx8"
def outer(x):
    def inner(y):
        return x + y
    return inner
```Các khái nim mã byte quan trng:```text id="5c33p4"
x becomes a cell variable in outer
x becomes a free variable in inner
outer creates inner with closure data
inner uses LOAD_DEREF to read x
```Điu tra:```python id="x2ckc7"
def outer(x):
    def inner(y):
        return x + y
    return inner

print(outer.__code__.co_cellvars)
inner = outer(10)
print(inner.__code__.co_freevars)
print(inner.__closure__)
```Hướng dn mã byte hin th cu trúc đóng và quyn truy cp vô căn c.

## 30.40 Ví dụ: Thử Ngoại trừ

Ngun:```python id="g6xgtw"
def f(x):
    try:
        return 10 / x
    except ZeroDivisionError:
        return 0
```Cu trúc khái nim:```text id="eylcef"
protected region:
    LOAD_CONST 10
    LOAD_FAST x
    BINARY_OP /
    RETURN_VALUE

handler:
    check exception matches ZeroDivisionError
    LOAD_CONST 0
    RETURN_VALUE
```Đối tượng mã cha siêu d liu bng ngoi l mô t phm vi mã byte nào được bo v và nơi bt đầu trình x lý.

Khi đọc mã byte này, hãy kim tra c hai:```text id="caeiew"
instruction stream
exception table
```Bng ngoi l là mt phn ca cu trúc thc thi.

## 30.41 Mã byte và dòng nguồn

Hướng dn mã byte được ánh x tr li v trí ngun.

Bn đồ này h tr:```text id="vn48tw"
tracebacks
debuggers
coverage tools
profilers
line tracing
error messages
```Mt dòng ngun duy nht có th biên dch thành nhiu hướng dn mã byte.```python id="8bi6zl"
x = f(a) + g(b)
```Mã byte khái nim bao gm:```text id="n0ncx0"
load f
load a
call f
load g
load b
call g
binary add
store x
```Siêu d liu v trí ngun cho phép CPython báo cáo v trí chính xác hơn v li và theo dõi s kin.

## 30,42 Mã byte và truy nguyên

Khi mt ngoi l xy ra, quá trình truy nguyên s ghi li khung và v trí ngun/lnh liên quan.

Ví d:```python id="lzbl8z"
def f(x):
    return 10 / x

f(0)
```Hot động tht bi là mã byte chia. CPython s dng đối tượng mã ca khung và v trí lnh để báo cáo dòng ngun.

Do đó, truy nguyên được kết ni vi:```text id="cc3baw"
frame
code object
instruction offset
source location table
exception state
```## 30.43 Mã byte và tối ưu hóa

CPython thc hin mt s ti ưu hóa thi gian biên dch và thi gian chy.

Các ví d v thi gian biên dch có th bao gm:```text id="3ej829"
constant handling
dead code handling in simple cases
jump simplification
stack size computation
scope resolution
literal container optimizations
```Ví d v thi gian chy bao gm:```text id="ta6h3c"
adaptive specialization
inline caches
optimized call paths
fast locals
specialized attribute access
specialized global lookup
```Lung lnh bytecode nm gia trình biên dch và trình ti ưu hóa thi gian chy. Nó va là đầu ra ca trình biên dch va là đầu vào ca trình thông dch.

## 30.44 Mã byte không phải là API ổn định

Mã byte CPython không được thiết kế làm mc tiêu máy o công cng n định.

Nó có th thay đổi gia các bn phát hành để h tr:```text id="18txrq"
better performance
simpler interpreter implementation
new language features
better debugging information
new exception machinery
new call conventions
specialization
free-threading work
JIT experiments
```Điu này không có nghĩa là mã byte không th s dng được. Điu đó có nghĩa là các công c cp mã byte phi nhn biết được phiên bn.

Để chương trình hot động n định, hãy da vào ng nghĩa ca ngôn ng Python. Đối vi công vic ni b CPython, hãy nghiên cu mã byte cho phiên bn CPython chính xác.

## 30.45 Trình thông dịch mã byte tối thiểu

Mt thông dch viên đồ chơi giúp th hin ý tưởng.```python id="bo0wgp"
LOAD_CONST = "LOAD_CONST"
LOAD_FAST = "LOAD_FAST"
STORE_FAST = "STORE_FAST"
ADD = "ADD"
RETURN = "RETURN"

def run(code, consts, locals_):
    stack = []

    for op, arg in code:
        if op == LOAD_CONST:
            stack.append(consts[arg])

        elif op == LOAD_FAST:
            stack.append(locals_[arg])

        elif op == STORE_FAST:
            locals_[arg] = stack.pop()

        elif op == ADD:
            right = stack.pop()
            left = stack.pop()
            stack.append(left + right)

        elif op == RETURN:
            return stack.pop()

    raise RuntimeError("missing RETURN")
```Mt chương trình nh:```python id="5gvw2y"
code = [
    (LOAD_FAST, "a"),
    (LOAD_FAST, "b"),
    (ADD, None),
    (STORE_FAST, "c"),
    (LOAD_FAST, "c"),
    (RETURN, None),
]

print(run(code, [], {"a": 2, "b": 3}))
```Đầu ra:```text id="n2zzxm"
5
```Đồ chơi này loi b hu hết CPython:```text id="mrtfdz"
objects
reference counts
exceptions
calls
descriptors
classes
imports
closures
generators
coroutines
specialization
inline caches
tracing
thread state
```Nhưng nó nm bt được ý tưởng ct lõi: các lnh mã byte hot động trên trng thái khung và ngăn xếp giá tr.

## 30.46 Những hiểu lầm phổ biến

| Hiu lm | Đúng mu |
|---|---|
| Bytecode là ngun Python theo cú pháp khác | Bytecode là lung hướng dn thông dch |
| Bytecode có th di chuyn được trên tt c các trin khai Python | Mã byte CPython dành riêng cho CPython |
| Bytecode n định trên các phiên bn | Thay đổi mã byte gia các phiên bn CPython |
| Hướng dn cha tên biến đầy đủ | Nhiu lnh cha các ch mc vào các bng đối tượng mã |
|`dis`đầu ra là câu chuyn thi gian chy đầy đủ | Thi gian chy cũng s dng khung, b đệm, bng ngoi l và chuyên môn hóa |
| Mt dòng ngun có nghĩa là mt hướng dn | Mt dòng thường biên dch thành nhiu hướng dn |
| Bytecode luôn ánh x trc tiếp ti cú pháp | Mt s mã byte tn ti cho máy móc giao thc thi gian chy |
| B nh đệm ni tuyến là các hot động ca Python | Chúng là siêu d liu ti ưu hóa trình thông dch |

## 30.47 Chiến lược đọc

Để hiu các hướng dn mã byte, hãy làm vic t các ví d nh.

Bt đầu vi:```python id="6w8kmn"
def f(a, b):
    return a + b
```Sau đó kim tra:```python id="0tvkkr"
import dis
dis.dis(f)
```Sau đó kim tra:```python id="6h63o9"
print(f.__code__.co_consts)
print(f.__code__.co_varnames)
print(f.__code__.co_names)
print(f.__code__.co_stacksize)
```Đối vi mi hướng dn, hãy hi:```text id="w1yd94"
What does it consume from the stack?
What does it push?
Which code object table does it reference?
Can it jump?
Can it raise?
Can it call Python code?
Can specialization change its fast path?
```Phương pháp này m rng t s hc đơn gin đến các hàm, bao đóng, nhp, lp, ngoi l và hiu.

## 30.48 Tóm tắt chương

Hướng dn mã byte là định dng hướng dn thc thi ca CPython. Chúng sng bên trong các đối tượng mã và được thc thi bi các khung thông qua vòng đánh giá.

Mô hình ct lõi là:```text id="rbfch8"
code object holds bytecode and metadata
frame holds execution state
bytecode instruction mutates frame state
evaluation loop dispatches instructions
stack effects define operand flow
```Hướng dn ti giá tr, lưu tr giá tr, gi hàm, thc hin các thao tác, xây dng vùng cha, nhánh, x lý các ngoi l, to hàm và lp, nhp mô-đun, tm dng trình to và tr v kết qu.

Bytecode nh gn, năng động, da trên ngăn xếp và dành riêng cho phiên bn. Vic hiu nó s mang li cho bn cái nhìn trc tiếp v cách ngun Python tr thành thc thi CPython.