dmd结构
原文在此
github的raw数据与渲染出来数据不一样.简直太搞笑.
目录 | 结构 |
|---|
dmd/ | 驱动和前端 |
dmd/backend/ | x86/x86-64生成代码,同dmc共享.但不与ldc/gdc共享 |
dmd/root/ | 仅dmd使用的工具库 |
DMD结构平坦,本节按编译过程划分组,方便浏览.
驱动
| 文件 | 目的 |
|---|
mars.d | 入口,定义主. |
cli.d | 命令行接口. |
globals.d | 存储命令行选项. |
dinifile.d | 从sc.ini或dmd.conf解析配置 |
vsoptions.d | 检查微软工具链/链接. |
frontend.d | 把dmd当库的接口. |
errors.d | 错误报告 |
target.d | 对ldc/gdc,为交叉编译管理目标相关参数 |
compiler.d | 描述后端编译器并实现相关编译器动作 |
词法/解析
文件 | 目的 |
|---|
lexer.d | 源码至令牌 |
entity.d | 定义"\&Entity;"用来转义 |
tokens.d | 定义令牌 |
parse.d | 转换为语法树 |
语义分析,符号和声明
文件 | 目的 |
|---|
dsymbol.d | d符号基类,如变量,函数,模块,枚举等. |
identifier.d | 表d符号名. |
id.d | 预定义标识符串,如sizeof,string |
dscope.d | 定义可查找符号的域 |
dtemplate.d | 模板声明或实例 |
dmodule.d | 定义包和模块 |
mtype.d | 定义表达式类型,如int,char,void function. |
arraytypes.d | 对T声明,提供Array!T别名 |
declaration.d | 杂项,声明alias,变量,类型元组,类信息等 |
denum.d | 定义枚举声明和成员 |
attrib.d | 声明private, pragma, immutable, @UDA, align, extern等属性. |
func.d | 定义函数声明,如函数字面,不变,单元测试 |
dversion.d | 定义版本符号如version = ident,debug = ident |
语法树结点
文件 | 目的 |
|---|
ast_node.d | 定义语法树节点 |
astbase.d | 解析器可生成语法树节点的名字空间 |
astcodegen.d | 可生成代码语法树名字空间. |
expression.d | 定义表达式语法树节点 |
statement.d | 定义语句语法树节点 |
staticassert.d | 定义静断语法树节点 |
aggregate.d | 定义聚集… |
dclass.d | 定义类 |
dstruct.d | 定义构/联 |
init.d | 定义变量初化器. |
语法树访问者
文件 | 目的 |
|---|
parsetimevisitor.d | 语法树节点通用访问者 |
permissivevisitor.d | 宽松访问者,在未实现节点,不断定(0).上面通用的子类. |
strictvisitor.d | 严格访问者,要求子类必须对每个可能节点实现访问函数, |
visitor.d | 对编译器所有节点实现访问的访问者 |
transitivevisitor.d | 对通用用访问方法提供插件模板 |
apply.d | 深先表达式访问者 |
sapply.d | 深先语句访问者 |
statement_rewrite_walker.d | 允许替换当前访问节点的语句访问者. |
语义
文件 | 目的 |
|---|
dsymbolsem.d | 符号标识符/类型,第1趟 |
semantic2.d | 初化符号,第2趟. |
semantic3.d | 函数体,第3趟. |
inline.d | 前端内联优化 |
inlinecost.d | 计算内联函数调用成本 |
expressionsem.d | 分析表达式语义 |
statementsem.d | 分析语句语义 |
initsem.d | 分析初化器语义 |
templateparamsem.d | 分析模板语义 |
typesem.d | 分析类型语义 |
语义帮助
文件 | 目的 |
|---|
opover.d | 重载操作符 |
clone.d | 对构自动生成opEquals,opAssign和构造器. |
blockexit.d | 找退出控制流方式 |
ctorflow.d | 构造器中控制流 |
constfold.d | 算术表达式常量折叠 |
optimize.d | 更通用常量折叠 |
dcast.d | 隐显转,提升整等 |
impcnvtab.d | 对基本类型定义隐式转换表 |
sideeffect.d | 对一些降级表达式提取副作用 |
编译时执行函数
文件 | 目的 |
|---|
dinterpret.d | 入口点 |
ctfeexpr.d | 包含指针/切片/连接数组表达式的编译时执行 |
builtin.d | 如core.math,std.math和core.bitop等外部函数的编译时执行 |
检查属性
文件 | 目的 |
|---|
nogc.d | 对@无垃集. |
safe.d | 安全 |
canthrow.d | 可抛 |
escape.d | 域 |
access.d | 公/私 |
ob.d | @活. |
内联汇编
文件 | 目的 |
|---|
iasm.d | 内联汇编依赖编译器 |
iasmdmd.d | dmd的 |
iasmgcc.d | gdc的 |
其他
文件 | 目的 |
|---|
aliasthis.d | 对alias X this解析隐式转换 |
traits.d | __traits() |
lambdacomp.d | __traits(isSame, x => y, z => w) |
cond.d | 求值静如,版本,调试 |
staticcond.d | 对静如,静断和模板限制懒求值静态条件 |
delegatize.d | 对懒,转换式至闭包. |
eh.d | 异常处理 |
nspace.d | 外(C++,模块)的名字空间 |
intrange.d | 传播值区间 |
dimport.d | 重命名导入 |
arrayop.d | a[] = b[] + c[]数组操作 |
typinf.d | 为typeid及内部生成类型信息 |
chkformat.d | 对printf / scanf等检查格式 |
imphint.d | 当不能解析写行时,给出如导入标.标io等提示. |
库文件
文件 | 目的 |
|---|
lib.d | 抽象库类 |
libelf.d | 联操elf格式 |
libmach.d | 马操O格式 |
libmscoff.d | 微软coff格式(32/64) |
libomf.d | omf格式 |
scanelf.d | 从elf中取符号名 |
scanmach.d | 从O中取 |
scanmscoff.d | 从coff中取 |
scanomf.d | 从omf中取 |
生成代码/后端接口
文件 | 目的 |
|---|
dmsc.d | 配置和初化后端 |
toobj.d | 把通过语义后语法树转为目标. |
toir.d | 转换d符号中间表示 |
e2ir.d | 表达式->中间 |
s2ir.d | 语句->中间 |
stmtstate.d | 语句至流图 |
toctype.d | d类型->后端理解的类型 |
tocsym.d | d符号=>链接器理解符号 |
argtypes_x86.d | 对x86转换d类型=>简单寄 |
argtypes_sysv_x64.d | x86_64位的 |
argtypes_aarch64.d | AArch64的 |
glue.d | 对函数声明生成目标文件 |
gluelayer.d | 前端调用后端函数的声明 |
todt.d | 转换初化器为后端将加的段数据结构 |
tocvdebug.d | 按cv4格式生成调试信息 |
objc.d | 目标c接口 |
objc_glue.d | 目标c胶水 |
混杂名字
文件 | 目的 |
|---|
cppmangle.d | c++混杂名 |
cppmanglewin.d | 窗口下c++混杂名 |
dmangle.d | d混杂名 |
链接
特殊输出
文件 | 目的 |
|---|
doc.d | 生成文档 |
dmacro.d | 处理ddoc宏 |
hdrgen.d | 将语法生成树转为di格式d头文件或用-vcg-ast |
json.d | 按json格式或用-X描述模块 |
dtoh.d | 从d源码生成c++头. |
工具
许多其他工具在dmd/根里面.
文件 | 目的 |
|---|
env.d | 修改环境变量 |
console.d | 按彩色打印错误消息 |
utf.d | 变长码 |
filecache.d | 在内存保存文件 |
utils.d | 文件/路径工具 |
complex.d | 复数类型 |
asttypename.d | 为调试打印语法树内部名 |
printast.d | 打印语法树结构 |
foreachvar.d | 在ob.d中用来迭代表达式中所有变量. |