TypePHP 编译器 https://swoole.com/aot/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

51 lines
2.5 KiB

<blog>
# 生成器总览
`doConvert()` 收集完一个文件的语句后,调用各 `genXxx` 方法把 PHP 构造发射为 C++。所有发射逻辑分两类:**声明头文件生成**(`*.h`)与 **实现单元生成**(`*.cc`)。`src/Generator/` 下是一组辅助生成器,负责闭包、匿名类、参数、资源文件等专项结构。
Sources: [src/Translator.php](src/Translator.php#L2477-L2536) · [src/Generator/](src/Generator/)
## 主发射方法(在 Translator / CompilerBase)
| 方法 | 产物 |
|---|---|
| `genFunctionDeclarations()` | `php_<target>_func_decl.h`:所有函数前向声明 |
| `genDataDeclarations()` | `php_<target>_data_decl.h`:全局变量 / 常量 / 类映射表声明 |
| `genExtension()` | `extension-<target>.cc`:模块入口(MINIT/RINIT/RSHUTDOWN) |
| `genClassWrapper()` | 单个类/接口的 C++ 实现 |
| `genFunctionWrapper()` | 单个函数的 C++ 实现 |
| `genClassPropertyInit()` | 属性默认值与 create_object 初始化块 |
Sources: [src/Translator.php](src/Translator.php#L1728-L1786) · [src/Translator.php](src/Translator.php#L692-L737) · [src/Translator.php](src/Translator.php#L739-L1105)
## 专项生成器(src/Generator/)
| 生成器 | 负责 |
|---|---|
| `ClosureGenerator` | 匿名函数 / 闭包 → C++ lambda 包装 |
| `AnonClassGenerator` | 匿名类 |
| `CallArgumentGenerator` | 调用实参的默认值/展开处理 |
| `DefaultArgumentGenerator` | 默认参数 helper(`genDefaultArgumentHelper*`) |
| `FiberGenerator` | 协程 / Fiber 生成 |
| `PropertyPromotion` | 构造函数属性提升 |
| `ResourceFileGenerator` | Windows `.rc` 资源文件 |
| `LibraryImportStubGenerator` | 跨库导入桩 `<target>.stub.php` |
| `TypeCheckGenerator` | 运行时类型检查代码 |
| `Symbol` | 符号名转义工具 |
Sources: [src/Generator/](src/Generator/)
## 头文件依赖与增量缓存
每个生成的 `.cc``#include` 项目级 `func_decl.h` / `data_decl.h` 与各自的 `_arginfo.h`。这些共享头文件的内容指纹正是 [增量编译缓存](incremental-cache) 判定是否重编译的依据——任一头变化都会让依赖它的 `.cc` 失效。
Sources: [src/Translator.php](src/Translator.php#L1253-L1270) · [src/Translator.php](src/Translator.php#L1880-L1892)
## 相关阅读
- 函数与类如何逐个生成 → [函数与类生成](gen-functions-classes)
- 模块入口如何拼装 → [扩展模块生成](gen-extension)
- 翻译前的 AST 改写 → [AST 转换](transform)
</blog>