Solidity 编译器探究——基于0.8.13版本
2022.04.11
编译器架构
- 词法分析
- 语法分析
- 检查
- 中间代码生成
- 代码优化
- 生成机器码
代码结构与工作流程
- solidity/solc/:程序入口 main.cpp ,solc 命令参数解析,根据参数调用相应方法。
- solidity/libsolidity:编译器的核心。
- solidity/libsolidity/parsing:词法分析,语法分析
- solidity/libsolidity/ast:AST 类包
- solidity/libsolidity/analysis:语义分析,静态分析,类型检查
- solidity/libsolidity/codegen:根据AST节点生成指令集
- solidity/libsolidity/codegen/ir:根据AST节点生成操作码
- solidity/libevmasm/:字节码优化
- solidity/libyul/:中间语言 YUL 相关
- solidity/backends/:YUL 生成操作码
- solidity/optimiser/:YUL 优化器
- 由于中间语言 YUL 是实验阶段,所以有两套主要的工作流程,一套使用 YUL 作为中间语言,并基于YUL 的优化器进行优化,另一套则直接将 AST 转换为操作码,基于操作码做简单优化。生产环境中,都是后者,但是 YUL 是未来方向。
核心代码分析
抽象语法树 AST
词法分析
语法分析
语义分析
代码生成
代码优化
通过 YUL 进行优化
- 主要包含五个组件:
- SSA 转换
- 通用子表达式消除器
- 表达式简化器
- 冗余分配消除器
- 可被内嵌的函数
- 语义不一致
本次组会内容下载链接