3. Bố cục kho lưu trữ

Kho lưu trữ CPython được tổ chức xung quanh các hệ thống con chính của trình thông dịch: triển khai đối tượng, bộ máy thời gian chạy, đường dẫn trình biên dịch, trình phân tích cú pháp, mô-đun tích hợp, thư viện chuẩn, kiểm tra, tài liệu và tệp xây dựng nền tảng.

Cách tốt đầu tiên là coi cây nguồn như một bản đồ trách nhiệm.```text cpython/ Include/ Objects/ Python/ Parser/ Modules/ Lib/ Programs/ Tools/ Doc/ Grammar/ PC/ PCbuild/ Mac/


## 3.1 Cấu trúc cấp cao nhất

| Thư mục | Vai trò chính |
| ----------- | --------------------------------------------------- |
|`Include/`| Tiêu đề C công khai, nội bộ và riêng tư |
|`Objects/`| Triển khai các loại đối tượng cốt lõi |
|`Python/`| Thời gian chạy, trình biên dịch, vòng lặp thông dịch, khởi tạo |
|`Parser/`| Mã hỗ trợ mã thông báo và trình phân tích cú pháp |
|`Grammar/`| Tệp đầu vào ngữ pháp |
|`Modules/`| Các mô-đun mở rộng và tích hợp được viết bằng C |
|`Lib/`| Thư viện chuẩn Python |
|`Lib/test/`| Bộ kiểm tra hồi quy CPython |
|`Programs/`| Điểm vào có thể thực thi |
|`Tools/`| Công cụ dành cho nhà phát triển và xây dựng |
|`Doc/`| Nguồn tài liệu |
|`PC/`| Tệp nguồn và cấu hình dành riêng cho Windows |
|`PCbuild/`| Hệ thống xây dựng Windows |
|`Mac/`| hỗ trợ dành riêng cho macOS |

Các thư mục quan trọng nhất để đọc nội bộ là:```text
Include/
Objects/
Python/
Parser/
Modules/
Lib/test/
```Các thư mục đó bao gồm mô hình đối tượng, công cụ thực thi, trình biên dịch, trình phân tích cú pháp, các loại tích hợp, API C và các thử nghiệm.

## 3.2`Include/`: Tệp tiêu đề C`Include/`chứa các tệp tiêu đề được sử dụng bởi chính CPython, các mô-đun mở rộng và trình nhúng.

Một bố cục đơn giản hóa:```text
Include/
    Python.h
    object.h
    unicodeobject.h
    listobject.h
    dictobject.h
    cpython/
    internal/
```Tệp quan trọng nhất là:```c
#include <Python.h>

Python.hlà tiêu đề chung chung cho các mô-đun mở rộng. Nó bao gồm nhiều tiêu đề công khai khác và hiển thị API C mà hầu hết các tác giả tiện ích mở rộng sử dụng.

Danh mục tiêu đề

Khu vực tiêu đề Khán giả Tính ổn định
Include/*.h Người dùng API C công khai Tương đối ổn định
Include/cpython/ API dành riêng cho CPython Ít di động hơn
Include/internal/ Chỉ nội bộ CPython Có thể thay đổi tự do

Sự khác biệt này quan trọng. Mã bên trong CPython có thể bao gồm các tiêu đề nội bộ. Tiện ích mở rộng của bên thứ ba nói chung là không nên.

Ví dụ:```c #include "Python.h"


Nhưng:```c
#include "internal/pycore_runtime.h"
```dành cho mã lõi CPython. Nó hin th các cu trúc thi gian chy ni b không phi là mt phn ca API công khai n định.

## 3.3`Objects/`: Triển khai đối tượng tích hợp`Objects/`chứa các triển khai C của nhiều loại đối tượng Python cốt lõi.

Ví d:

| Tp tin | Thc hin |
| ------------------- | --------------------------------- |
|`object.c`| Hot động đối tượng cơ s |
|`typeobject.c`| Nhp đối tượng, lp, MRO, v trí |
|`longobject.c`| S nguyên Python |
|`floatobject.c`| Python ni |
|`unicodeobject.c`| Chui Python |
|`bytesobject.c`     | `bytes`                           |
| `bytearrayobject.c` | `bytearray`                       |
| `listobject.c`      | `list`                            |
| `tupleobject.c`     | `tuple`                           |
| `dictobject.c`      | `dict`                            |
| `setobject.c`       | `set`Và`frozenset`             |
| `funcobject.c`| Đối tượng chc năng |
|`methodobject.c`| Đối tượng phương thc tích hp |
|`moduleobject.c`| Đối tượng mô-đun |
|`genobject.c`| Trình to và coroutine |
|`frameobject.c`| H tr đối tượng khung |
|`codeobject.c`| Đối tượng mã |
|`cellobject.c`| Tế bào đóng ca |
|`descrobject.c`| Mô t |

Thư mc này là nơi tt nht để nghiên cu cách biu din và vn hành các giá tr Python.

Ví d: hành vi lit kê tn ti ch yếu :```text
Objects/listobject.c
```Hành vi t đin sng ch yếu :```text
Objects/dictobject.c
```Hành vi chui tn ti ch yếu :```text
Objects/unicodeobject.c
```Khi Python chy:```python
items = []
items.append(1)
```hot động phân b, thay đổi kích thước, tra cu phương thc và ni thêm danh sách cơ bn cui cùng liên quan đến mã trong`Objects/listobject.c`và gõ máy móc vào`Objects/typeobject.c`.

## 3,4`Python/`: Lõi thời gian chạy, trình biên dịch và phiên dịch`Python/`chứa nhiều máy móc trung tâm của CPython.

Các tp tin quan trng bao gm:

| Tp tin | Vai trò |
| ------------------ | -------------------------------------------------- |
|`ceval.c`| Vòng đánh giá mã byte |
|`bytecodes.c`| Định nghĩa hướng dn mã byte trong CPython hin đại |
|`compile.c`| AST để biên dch đối tượng mã |
|`symtable.c`| Phân tích bng ký hiu |
|`ast.c`| H tr AST |
|`pythonrun.c`| Đim vào thc thi cp cao |
|`pylifecycle.c`| Khi to và hoàn thin thi gian chy |
|`import.c`| H tr nhp khu |
|`errors.c`| API li và trng thái ngoi l |
|`traceback.c`| H tr truy nguyên |
|`sysmodule.c`| Thc hin`sys`                            |
| `bltinmodule.c`| Các chc năng tích hp và mô-đun dng sn |
|`marshal.c`| Định dng tun t hóa ni b cho các đối tượng mã |
|`thread.c`| Lp tru tượng ch đề |
|`context.c`| H tr biến bi cnh |
|`bootstrap_hash.c`| Khi to bí mt băm |

Tên tp tin không ch đơn thun là nhãn. Chúng phn ánh các h thng con thi gian chy sâu.

### Thực thi trình thông dịch

Trình thông dch mã byte tp trung vào vòng đánh giá. Trong lch s điu này gn lin vi`ceval.c`. Trong các phiên bn CPython mi hơn, định nghĩa opcode và các phn thông dch được to có th được chia thành các tp b sung.

Vai trò khái nim:```text
frame enters evaluation
    
bytecode instruction fetched
    
instruction dispatch
    
object operation
    
stack and frame state updated
```### Đường dẫn trình biên dịch

Mã trình biên dch h thp các nút AST thành các đối tượng mã.

Mt đường dn đơn gin:```text
source text
    
tokens
    
parse tree
    
AST
    
symbol table
    
compiler
    
code object
```Các tp tin chính thường là:```text
Parser/
Python/ast.c
Python/symtable.c
Python/compile.c
Objects/codeobject.c
```## 3,5`Parser/`: Hỗ trợ mã thông báo và trình phân tích cú pháp`Parser/`chứa mã thông báo, hỗ trợ trình tạo trình phân tích cú pháp, tệp triển khai trình phân tích cú pháp và mã liên quan đến trình phân tích cú pháp được tạo.

Các lĩnh vc quan trng bao gm:

| Khu vc | Vai trò |
| ---------------------- | ------------------------------------ |
| mã thông báo | Chuyn đổi văn bn ngun thành mã thông báo |
| trình phân tích cú pháp | Xây dng cu trúc cú pháp t mã thông báo |
| máy móc PEG | H tr trình phân tích cú pháp PEG ca Python |
| tp tin phân tích cú pháp được to | Được to ra t các định nghĩa ng pháp |

Công vic ca trình phân tích cú pháp là quyết định xem văn bn ngun có phi là cú pháp Python hp l hay không và xây dng các cu trúc mà sau này tr thành AST.

Ví d:```python
x = 1 + 2
```Trình phân tích cú pháp cn nhn ra:```text
assignment statement
target name x
expression 1 + 2
integer literal 1
integer literal 2
binary addition operator
```Phân tích cú pháp đi trước phân tích ng nghĩa. Trình phân tích cú pháp biết cú pháp. Vic vượt qua bng ký hiu sau đó s quyết định xem tên là biến cc b, toàn cc, min phí hay biến ô.

## 3.6`Grammar/`: Định nghĩa ngữ pháp`Grammar/`chứa các tệp đầu vào ngữ pháp được sử dụng để tạo mã liên quan đến trình phân tích cú pháp.

Ng pháp xác định cú pháp Python  dng được s dng bi công c phân tích cú pháp ca CPython.

Đối vi công vic ni b, nhng thay đổi v ng pháp có tác động ln. Mt s thay đổi cú pháp có th nh hưởng đến:```text
parser generation
AST generation
compiler behavior
error messages
tests
documentation
tools that parse Python
```S thay đổi  cp độ ng pháp thường yêu cu tái to và kim tra mc tiêu.

Quy trình làm vic thông thường là:```text
edit grammar input
regenerate parser files
rebuild CPython
run parser, AST, compiler, and syntax tests
```## 3,7`Modules/`: Mô-đun tích hợp và mở rộng`Modules/`chứa nhiều mô-đun C được gửi cùng với CPython.

Ví d:

| Tp hoc thư mc | Mô-đun |
| ------------------- | ------------------------ |
|`_io/`| Trin khai I/O |
|`_decimal/`| Máy gia tc thp phân |
|`_sqlite/`| Mô-đun SQLite |
|`_ssl.c`| H tr SSL |
|`_hashopenssl.c`| Băm vi OpenSSL |
|`_ctypes/`          | `ctypes`                 |
| `arraymodule.c`     | `array`                  |
| `mathmodule.c`      | `math`                   |
| `itertoolsmodule.c` | `itertools`              |
| `functoolsmodule.c` | `_functools`             |
| `posixmodule.c`     | `os`hot động nn tng |
|`timemodule.c`      | `time`|

Mt s mô-đun thư vin tiêu chun được viết bng Python và s dng b tăng tc C t`Modules/`.

Ví d: mt mô-đun Python công khai có th nm trong`Lib/`, trong khi mt người tr giúp quan trng v hiu sut sng `Modules/`.

Mu này cung cp cho CPython mt API công khai rõ ràng trong khi vn duy trì vic trin khai C nhanh cho các đường dn nóng.

## 3,8`Lib/`: Thư viện chuẩn`Lib/`chứa thư viện chuẩn Python.

Ví d:

| Đường dn | Vai trò |
| -------------------- | -------------------------------- |
|`Lib/os.py`| Lp giao din h điu hành |
|`Lib/pathlib/`| Đường dn hướng đối tượng |
|`Lib/importlib/`| Trin khai h thng nhp khu |
|`Lib/asyncio/`| Khung I/O không đồng b |
|`Lib/collections/`| Tin ích sưu tp |
|`Lib/dataclasses.py`| H tr lp d liu |
|`Lib/typing.py`| H tr đánh máy |
|`Lib/unittest/`| Khung kim th đơn v |
|`Lib/json/`| Trin khai JSON |
|`Lib/concurrent/`| Tương lai và nhóm quy trình/lung |

Nhiu ni dung CPython d hiu hơn bng cách đọc thư vin chun cp Python trước.

Ví d,`importlib`cha phn ln h thng nhp bng mã Python. CPython khi động nó mt cách đặc bit, nhưng phn ln vn có th đọc được dưới dng Python.

## 3,9`Lib/test/`: Kiểm tra hồi quy`Lib/test/`chứa bộ thử nghiệm của CPython.

Thư mc này rt cn thiết cho công vic ni b.

Ví d:

| Tp th nghim | Tp trung |
| ------------------- | -------------------- |
|`test_dict.py`| Hành vi t đin |
|`test_list.py`| Lit kê hành vi |
|`test_gc.py`| Người thu gom rác |
|`test_sys.py`       | `sys`mô-đun |
|`test_dis.py`| Tháo g mã byte |
|`test_compile.py`| Hành vi ca trình biên dch |
|`test_ast.py`| Hành vi AST |
|`test_importlib/`| H thng nhp khu |
|`test_capi/`| Hành vi API C |
|`test_threading.py`| Hành vi phân lung |

Khi nghiên cu mt h thng con, hãy ghép ni tp trin khai vi các th nghim ca nó.

| Thc hin | Kim tra |
| ---------------------- | ----------------------------- |
|`Objects/dictobject.c` | `Lib/test/test_dict.py`     |
| `Objects/listobject.c` | `Lib/test/test_list.py`     |
| `Python/compile.c`     | `Lib/test/test_compile.py`  |
| `Python/symtable.c`    | `Lib/test/test_symtable.py` |
| `Python/sysmodule.c`   | `Lib/test/test_sys.py`      |
| `Modules/mathmodule.c` | `Lib/test/test_math.py`|

Thói quen này ngăn cn vic đọc mã mt cách cô lp. Hành vi ca CPython được xác định bng mã cng vi các bài kim tra cng vi tài liu cng vi các k vng v kh năng tương thích.

## 3.10`Programs/`: Điểm vào có thể thực thi`Programs/`chứa các tệp nguồn cho các chương trình thực thi CPython.

Các tp tin đin hình bao gm:```text
Programs/python.c
Programs/_testembed.c

Programs/python.clà điểm vào trình thông dịch dòng lệnh thông thường.

Đường dẫn khởi động đơn giản hóa trông như sau:```text main() ↓ initialize runtime ↓ configure interpreter ↓ run command, script, module, stdin, or REPL ↓ finalize runtime


## 3.11`Tools/`: Công cụ dành cho nhà phát triển`Tools/`chứa các chương trình trợ giúp để phát triển CPython.

Ví d bao gm các công c dành cho:```text
generated file maintenance
bytecode and opcode metadata
C API inspection
test support
build support
freeze tooling
scripts used by maintainers
```Ni dung chính xác thay đổi theo thi gian. Nguyên tc quan trng là nhiu tp được to trong CPython có đầu vào ngun và công c tái to.`Tools/`thường là nơi nhng công c đó tn ti.

Khi thay đổi ng pháp, khi Phòng khám đối s, định nghĩa opcode hoc siêu d liu được to, hãy kim tra quy trình làm vic ca công c có liên quan trước khi chnh sa đầu ra được to.

## 3.12`Doc/`: Nguồn tài liệu`Doc/`chứa nguồn tài liệu của CPython.

Tài liu bao gm:```text
language reference
library reference
C API reference
extending and embedding
how-to guides
tutorial
installing and using Python
```Đối vi công vic ni b, tài liu rt quan trng vì nhng thay đổi v hành vi thường yêu cu cp nht tài liu.

Thay đổi CPython có th yêu cu chnh sa  mt s nơi:```text
implementation code
tests
documentation
news entry
C API docs
library docs
```Ngun tài liu s dng reStructuredText thay vì Markdown.

## 3.13 Thư mục nền tảng

CPython h tr nhiu nn tng. Mt s thư mc tn ti ch yếu dành cho cu hình và bn dng dành riêng cho nn tng.

| Thư mc | Vai trò nn tng |
| ------------------------------------------ | ------------------------------ |
|`PC/`| Ngun/cu hình dành riêng cho Windows |
|`PCbuild/`| Tp xây dng Visual Studio |
|`Mac/`| h tr macOS |
| tp tin nn tng trong`Python/`Và`Modules/`| Trin khai dành riêng cho h điu hành |

H tr nn tng xut hin xuyên sut cây thông qua quá trình biên dch có điu kin.

Mu ví d:```c
#ifdef MS_WINDOWS
    /* Windows-specific code */
#else
    /* POSIX-like code */
#endif
```Vic đọc ni b thường yêu cu phân bit logic thi gian chy di động vi các nhánh dành riêng cho nn tng.

## 3.14 Đầu vào mã và nguồn được tạo

CPython cha c tp viết tay và tp được to.

Các khu vc được to ph biến bao gm:```text
parser output from grammar
AST-related generated files
opcode metadata and bytecode tables
Argument Clinic output
frozen importlib modules
configuration files
```Tp được to thường có nhn xét  gn đầu gii thích cách to tp.

Trước khi chnh sa khi cơ hc đáng ng, hãy tìm các đim đánh du như:```text
generated by
do not edit
clinic start generated code
autogenerated
```Chnh sa th công đối vi các vùng được to thường b mt trong quá trình tái to.

## 3.15 Đường dẫn đọc qua kho lưu trữ

Con đường đọc đầu tiên tt là:```text
Programs/python.c
    
Python/pylifecycle.c
    
Python/pythonrun.c
    
Python/compile.c
    
Python/ceval.c
    
Objects/object.c
    
Objects/typeobject.c
    
Objects/dictobject.c
    
Objects/listobject.c
```Đường dn này tuân theo quá trình thc thi t quá trình khi động đến hành vi thi gian chy.

Đường dn đọc th hai cho ni b đối tượng:```text
Include/object.h
    
Include/cpython/object.h
    
Objects/object.c
    
Objects/typeobject.c
    
Objects/longobject.c
    
Objects/unicodeobject.c
    
Objects/listobject.c
    
Objects/dictobject.c
```Đường dn th ba cho mã ngun ti mã byte:```text
Grammar/
    
Parser/
    
Python/ast.c
    
Python/symtable.c
    
Python/compile.c
    
Objects/codeobject.c
    
Python/ceval.c
```## 3.16 Cách tìm mã cho tính năng Python

Bt đầu t tính năng Python, sau đó ánh x nó ti mt h thng con.

| Tính năng | Các tp tin đầu tiên để kim tra |
| ------------- | ------------------------------------------ |
|`list.append` | `Objects/listobject.c`                     |
| `dict[key]`   | `Objects/dictobject.c`                     |
| `x.y`         | `Objects/object.c`, `Objects/typeobject.c` |
| `class C:`    | `Objects/typeobject.c`, `Python/compile.c` |
| `try/except`  | `Python/compile.c`, `Python/ceval.c`       |
| `import x`    | `Lib/importlib/`, `Python/import.c`        |
| `async def`   | `Python/compile.c`, `Objects/genobject.c`  |
| `with`        | `Python/compile.c`, `Python/ceval.c`       |
| `len(x)`      | `Python/bltinmodule.c`, loi khe |
|`print(x)`    | `Python/bltinmodule.c`, mô-đun I/O tp |

S dng các bài kim tra để xác nhn hành vi:```bash
./python -m test test_dict
./python -m test test_descr
./python -m test test_importlib
```## 3.17 Bố cục kho lưu trữ dưới dạng kiến trúc

Cu trúc thư mc phn ánh kiến trúc ca CPython.```text
Include/    exposes C interfaces
Objects/    defines runtime values
Python/     executes and manages programs
Parser/     understands syntax
Modules/    provides C-backed modules
Lib/        provides Python-level standard library
Lib/test/   protects behavior
Programs/   starts the executable
Tools/      maintains generated and developer workflows
Doc/        explains public behavior
```B cc này không hoàn ho. Mã cũ hơn, các ràng buc v nn tng, kh năng tương thích ngược và các tp được to s to ra các ngoi l. Tuy nhiên, cu trúc vn đủ mch lc để hướng dn vic đọc ngun.

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

Kho lưu tr CPython là mt h thng làm vic, không phi là tp hp các tp riêng bit.`Objects/`xác định giá tr Python là gì.`Python/`xác định cách chương trình biên dch và thc thi.`Parser/`Và`Grammar/`xác định x lý cú pháp.`Modules/`Và`Lib/`cung cp thư vin chun.`Include/`hin th giao din C.`Lib/test/`xác định phn ln mng lưới an toàn hi quy.

Mt người đọc hiu qu s chuyn đổi gia vic trin khai, kim tra và tài liu. Ni b CPython tr nên d dàng hơn khi mi tp ngun có mt v trí rõ ràng trong kiến ​​trúc thi gian chy.