1.方舟编译器学习笔记3 方舟可执行文件简介
2.方舟编译器学习笔记22 MAPLE IR和LLVM IR中module层面的信息对比
方舟编译器学习笔记3 方舟可执行文件简介
探讨方舟编译器生成的可执行文件,包含四个主要部分:java2jar、jbc2mpl、maple和mplcg。java2jar整合了编译和打包功能,用于将Java源文件转换为.class文件并封装成.jar。变更管理系统 源码在测试过程中,发现bootclasspath配置问题导致的执行异常,通过将配置更改为sourcepath得以解决。进一步尝试中,java2jar虽能成功打包某些文件,但未能正确处理所有输入文件。jbc2mpl则负责将.class或.jar文件转换为mpl或mplt格式,尝试使用时遇到了未知的错误信息,推测可能与源码未开源有关。maple作为中间表示语言工具,用于对方舟编译器的qq音乐电脑源码中间语言进行操作,但在本地测试中未能成功运行,主要原因是缺乏合适的mpl格式测试用例。mplcg则用于将mpl格式文件转换为后端汇编代码,同样由于未获得mpl文件而无法验证其功能。总体而言,这些工具构成了一个完整的编译流程链,但当前开源部分主要集中在maple相关代码上。
方舟编译器学习笔记 MAPLE IR和LLVM IR中module层面的源码来源和加密信息对比
对比了MAPLE IR和LLVM IR的模块层面信息,二者虽然都包含模块概念,对应单一编译单元,但呈现不同。
MAPLE IR在`MapleIRDesign.md`中有“Module Declaration”专门介绍模块层面信息,包括id、entryfunc、import、importpath、国际服美化源码numfuncs等。
LLVM IR则将这些信息分散在“High Level Structure”文档中,具体包括源文件名、目标三元组、数据布局、模块级内联汇编等。
对比分析如下:
1. MAPLE IR的id提供模块唯一标识,LLVM IR通过源文件名实现。掌控小程序源码虽然LLVM IR能对应源码文件,MAPLE IR的id是否对应文件需进一步验证。
2. MAPLE IR的entryfunc明确入口函数名称,而LLVM IR默认使用main函数。这一差异可能与方舟支持Java和dex输入相关。
3. MAPLE IR引入import和importpath功能,允许导入类型文件和指定搜索目录,LLVM IR未提供类似功能。
4. MAPLE IR显示模块内函数数量,LLVM IR缺少类似信息,但在实际需求时可统计,过多信息可能造成冗余。
5. MAPLE IR中globalXXX信息在模块层面显式声明,原因尚不明晰。LLVM IR未包含类似细节。
6. MAPLE IR未提供类似LLVM IR的Data Layout和Target Triple信息,可能因当前方舟仅支持ARM。
7. 通过HelloWorld.mpl等测试用例分析,发现id在特定目录下具有唯一性,但文档描述可能有局限性。
整体来看,MAPLE IR在模块层面信息描述上更为清晰,但文档可能过于偏向当前支持的前端和后端,需要适应未来多样性的需求进行调整。
更新:年9月日,添加了对测试用例mpl文件的分析,以验证文档对比分析结果。原有内容保持不变。
致谢:感谢@NJU-范伟杰 的提醒,补充了对测试用例mpl文件分析的内容。