上一篇是分析方舟编译器的准备阶段,这一篇开始正式开扒。 吃饭的时候看到了一篇非常好的博客↓ https://www.zhihu.com/column/c_1187372958643941376 答主ID:小菜叔叔开方舟 看着那么多代码属实不知道从哪里下手,但是看了这个知乎er的专栏感觉有思路了不少(虽然这个大大写的也比较随性,可读性不太连贯)。 简单讲讲程序通过编译器的过程。首先是编译器的前端,包括但不限于词法、句法的分析;然后是后端,包括指令的生成和优化。过一遍这几个“PHASE”后优化过的代码就是方舟编译器的结果。图片来自知乎答主ID:小乖他爹 phase是方舟编译器里的一个独创概念,原意是阶段,时期,段落,这里应该理解为过程步骤的意思。MAPLE IR 就是由一个个的PHASE组成的优化模块。 翻看编译器源码,src/maple_phase源码目录中phase.h、phase_impl.h和phase_manager.h三个类都只有头文件,其他两个都有比较具体的代码。phase中有ModulePhase和MeFuncPhase两个大类,很多小类,包含很多优化模型和方法。 module_phases.def & me_phases.def 这两个文件里记录了所有优化方法,用于管理需要注册的phase方法。 以下摘自小乖他爹的博客《方舟编译器学习笔记12 方舟编译器的phase》↓↓ PhaseManager负责phase的创建、管理和运行。 ModulePhase和MeFuncPhase都有对应的Manager类,分别是ModulePhaseManager和MeFuncPhaseManager。 ModulePhaseManager和MeFuncPhaseManager都是PhaseManager类的子类。 ModulePhaseManager的具体代码在 src/maple_ipa/include/module_phase_manager.h 和src/maple_ipa/src/module_phase_manager.cpp MeFuncPhaseManager的具体代码在 src/maple_me/include/me_phase_manager.h 和src/maple_me/src/me_phase_manager.cpp。 phase的Manager类主要是通过InterleavedManager来创建、管理和运行。 InterleavedManager的源码在src/maple_ipa/include/interleaved_manager.h和src/maple_ipa/src/interleaved_manager.cpp。 所以,总结一下就是InterleavedManager负责phase manager的创建、管理和运行;PhaseManager负责phase的创建、管理和运行。这是一个三级管理机制。 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 这就是三个类与子类之间的关系。蓝色直线带箭头是子类对父类的继承关系;红色折线带箭头是管理关系,箭头指向被管理者(在代码里体现的就是对其具体的对象的调用)。 下一篇继续分析phase类,因为phase体系是基于MAPLE IR进行优化和转换工作的一个模块,跟我的学习重点息息相关。
|