-
Notifications
You must be signed in to change notification settings - Fork 17
Open
Description
graph TD
Start([源代码文件]) --> Parse[词法与语法分析 Parse]
Parse --> Tokenize[标记化 Tokenization]
Tokenize --> |UTF-8 字节流| TokenStream[Token 流<br/>零拷贝切片引用]
TokenStream --> ASTBuild[构建 AST]
ASTBuild --> AST[(抽象语法树 AST<br/>结构数组 SoA)]
AST --> |紧凑内存布局<br/>主节点数组+额外数据数组| AstGen
subgraph AstGen_Phase [AST 降级阶段 AstGen]
AstGen[AST 降级 AstGen]
AstGen --> ResultLoc{结果位置语义<br/>ResultLoc}
ResultLoc --> |None/Discard| NoStore[不生成存储指令]
ResultLoc --> |Return| ReturnOpt[直接返回优化]
ResultLoc --> |Instruction| TempValue[临时值引用]
ResultLoc --> |Block| BlockEnd[写入块末尾]
NoStore --> ZIRGen[生成 ZIR 指令]
ReturnOpt --> ZIRGen
TempValue --> ZIRGen
BlockEnd --> ZIRGen
end
ZIRGen --> ZIR[(Zig 中间表示 ZIR<br/>无类型指令序列)]
ZIR --> |文件级缓存<br/>语法结构抽象| CheckCache{检查 ZIR 缓存}
CheckCache --> |缓存命中| LoadCache[加载缓存的 ZIR]
CheckCache --> |缓存未命中| GenerateZIR[生成新 ZIR]
LoadCache --> Sema
GenerateZIR --> Sema
subgraph InternPool_System [统一存储系统]
InternPool[(InternPool<br/>类型与值统一存储)]
InternPool --> |去重 Interning| UniqueIndex[结构唯一性索引]
InternPool --> |类型即值| TypeAsValue[Type 类型本身也是 Value]
InternPool --> |轻量级比较| U32Compare[u32 索引比较]
end
Sema[语义分析 Sema<br/>ZIR 虚拟机+解释器] --> |访问| InternPool
subgraph Sema_Phase [语义分析阶段 Sema]
Sema --> ParseOperand[操作数解析]
ParseOperand --> TypeInfer[类型推导与检查]
TypeInfer --> Coloring{着色与分流}
Coloring --> |所有操作数都是常量| ComptimePath[编译期路径 Comptime]
Coloring --> |包含运行时变量或副作用| RuntimePath[运行时路径 Runtime]
ComptimePath --> VMExecute[虚拟机中直接计算]
VMExecute --> StoreValue[结果存入 InternPool]
StoreValue --> InstMapConst[inst_map 记录为常量]
RuntimePath --> EmitAIR[发射 AIR 指令]
EmitAIR --> InstMapAIR[inst_map 记录为 AIR 引用]
InstMapConst --> CheckDep{检查依赖}
InstMapAIR --> CheckDep
CheckDep --> |发现未分析函数| SuspendTask[挂起当前任务]
SuspendTask --> AnalyzeDep[分析依赖函数]
AnalyzeDep --> ResumeTask[恢复当前任务]
CheckDep --> |遇到泛型调用| Monomorphize{单态化检查}
Monomorphize --> |已有实例| ReuseInstance[重用已生成实例]
Monomorphize --> |新类型参数| CloneZIR[克隆 ZIR]
CloneZIR --> BindType[绑定类型参数]
BindType --> GenerateSpecialized[生成专门化 AIR]
end
ResumeTask --> AIR
ReuseInstance --> AIR
GenerateSpecialized --> AIR
AIR[(分析后中间表示 AIR<br/>全类型+SSA 形式)]
AIR --> |显式控制流<br/>defer/errdefer/try 降级| Liveness
Liveness[活跃度分析<br/>Liveness Analysis]
Liveness --> Tombstone[生成墓碑表<br/>标记死亡点]
Tombstone --> OptimizeResource[资源优化<br/>寄存器/栈槽重用]
OptimizeResource --> BackendSelect{后端选择}
subgraph CodeGen_Phase [代码生成阶段]
BackendSelect --> |Debug 模式| SelfHosted[自举后端<br/>x86_64/ARM64/WASM]
BackendSelect --> |Release 模式| LLVM[LLVM 后端]
BackendSelect --> |跨平台| CBackend[C 后端]
SelfHosted --> |直接生成| MachineCode1[机器码]
LLVM --> ConvertLLVMIR[转换为 LLVM IR]
ConvertLLVMIR --> OptimizePipeline[LLVM 优化管线<br/>循环展开/向量化/内联]
OptimizePipeline --> MachineCode2[机器码]
CBackend --> GenerateC[生成 C 代码]
GenerateC --> CCompile[C 编译器编译]
CCompile --> MachineCode3[机器码]
MachineCode1 --> ImmediateRelease[即时释放 AIR 内存]
MachineCode2 --> ImmediateRelease
MachineCode3 --> ImmediateRelease
end
ImmediateRelease --> Link[链接阶段 Linking]
subgraph Link_Phase [链接阶段]
Link --> IncrementalCheck{增量编译检查}
IncrementalCheck --> |有变化| CalculateSize{计算新代码大小}
IncrementalCheck --> |无变化| SkipLink[跳过链接]
CalculateSize --> |新代码 <= 旧空间| InPlace[原地覆盖]
CalculateSize --> |新代码 > 旧空间| Append[追加到文件末尾<br/>修改跳转指令]
InPlace --> UpdateBinary[更新二进制文件]
Append --> UpdateBinary
UpdateBinary --> CrossCompile{交叉编译}
CrossCompile --> |根据 Target Triple| LoadConfig[加载平台配置]
LoadConfig --> LinkLibc[链接 libc 和依赖]
end
SkipLink --> Output
LinkLibc --> Output
Output([可执行文件])
style Parse fill:#e1f5ff
style AST fill:#fff4e1
style ZIR fill:#ffe1f5
style Sema fill:#f5e1ff
style InternPool fill:#e1ffe1
style AIR fill:#fff4e1
style BackendSelect fill:#e1f5ff
style Link fill:#ffe1e1
style Output fill:#90EE90
style ComptimePath fill:#FFD700
style RuntimePath fill:#FF6347
style InternPool fill:#00CED1
目前如果 mermaid 里面有 <br/> 时,Zine 会报错 html_elements_cant_self_close
Originally posted by @jiacai2050 in #103 (comment)
Metadata
Metadata
Assignees
Labels
No labels