编译流水线

TypePHP 的核心入口是 bin/tpc.php,它通过 main() 串起整条流水线:prepare → convert → compile → build → run。本章用一张图和一个阶段表把全链路讲清楚。

Sources: bin/tpc.php · src/compiler.php

总体流程

flowchart TD
    A["main(argc, argv)"] --> B["prepare(argv)\n扫描 PHP 文件 + 预处理"]
    B --> C["convert(files)\nPHP AST → C++ 源文件"]
    C --> D{"--dry?"}
    D -- "是" --> Z["仅输出 C++,结束"]
    D -- "否" --> E["compile(sourceFiles)\nC++ → .o / .obj"]
    E --> F["build(objectFiles)\n链接为二进制 / 库 / 扩展"]
    F --> G{"--run?"}
    G -- "是" --> H["run(binary)\n立即执行"]
    G -- "否" --> Z

.prof 后缀会被切换为 profileAnalyze 模式,调用 pprof --web 做性能剖析。

Sources: src/compiler.php · src/compiler.php

各阶段职责

阶段方法关键工作
准备Translator::prepare()扫描所有 PHP 文件、解析命令行、构建符号表(类/函数/常量/属性)
转换Translator::convert()convertFile()doConvert()对每个 PHP 文件解析 AST,跑 Transform 访客,生成 .cc_arginfo.h
编译Translator::compile()追加 phpx misc 源文件、准备 PCH、单进程或 pcntl 并行编译
构建Translator::build()调用原生链接器把目标文件 + 资源文件链接成最终产物
运行Translator::run()仅在 bin 模式且带 --run 时执行产物

Sources: src/Translator.php · src/Translator.php · src/Translator.php

转换阶段的两趟扫描

doConvert() 内部做了两件事(src/Translator.php):

  1. AST 遍历:用 NodeTraverser 串联 NameResolverTransform\VisitorConstantExpressionValidationVisitorRuntimeAttributeFactoryLowering 四个访客,做名称解析、编译期属性 lowering、常量表达式校验。
  2. 语句分发:遍历顶层语句,按 Stmt_Class / Stmt_Function / Stmt_Const 等类型调用对应的 parseXxx(),最后为每个类、接口、函数生成 C++ 包装代码(genClassWrapper / genFunctionWrapper)。
前端的解析/符号表逻辑在 preprocessortransform 章节展开;C++ 生成细节在 generator

关键文件