《邢其正-Koopa-开源的本科生编译实践教学方案_20230328_114018.pdf》由会员分享,可在线阅读,更多相关《邢其正-Koopa-开源的本科生编译实践教学方案_20230328_114018.pdf(58页珍藏版)》请在三个皮匠报告上搜索。
1、邢其正(MaxXing)北京大学Koopa是?KoopaKingBowsera.k.a.库巴/酷霸王KoopaKoopaKoopa面向本科生的编译实践教学方案教学用的编译器构建框架详尽的“手把手”式教程文档开箱即用的Docker实验环境支持C/C+/Rust多种开发语言Koopa全部开源,面向全网开放手把手教你从零开始写一个编译器编译实践在线文档Koopa是怎么诞生的?Koopa的诞生2020年,参加第一届编译系统设计赛Koopa的诞生2020年参加编译赛三件让我印象深刻的事情Koopa的诞生2020年参加编译赛三件让我印象深刻的事情1.第一次完整实现C子集编译器2.其他学校的选手好强啊3.大
2、赛的评测系统很有意思(就是有些测例太难了)Koopa的诞生2020年参加编译赛评测系统很有意思自动编译提交的Git项目运行后台的测试用例给出测试结果(虽然也有一些槽点)Koopa的诞生2020年,入学北大成为编译课助教Koopa的诞生2020年编译课助教完整实现C子集编译器说明你对编译器很了解其他学校的选手好强啊相比比赛,你更适合当助教大赛的评测系统很有意思刚好,给课程加个评测系统Koopa的诞生2020年编译课助教然后我就当了四个学期助教2020年秋季2021年春季2021年秋季2022年春季Koopa的诞生2020年编译课助教从大赛到课程在实践课中引入大赛的SysY语言推出面向课程的在线评
3、测系统在课程中推行Git版本控制引入大赛测试用例和性能评测机制Koopa的诞生2020年编译课助教评测系统很有意思自动编译提交的Git项目运行后台的测试用例给出测试结果(虽然也有一些槽点)Koopa的诞生2020年编译课助教虽然也有一些槽点自动编译提交的Git项目运行后台的测试用例给出测试结果但不支持构建脚本例如Makefile/CMake但无法提供更具体的信息测试结果的划分不适合编译器项目不适合编译器项目Koopa的诞生2020年编译课助教测试结果的划分不适合编译器项目不适合编译器项目普通的项目编译运行检查结果编译器项目编译编译器编译测例运行测例检查结果汇编测例Koopa的诞生2020年编译
4、课助教原先的测试结果改进后的测试结果CE:编译错误TLE:超时RE:运行时错误WA:结果错误AC:结果正确编译编译器:CCE/CCTLE编译测例:CTE/CTTLE汇编测例:AE/ATLE运行测例:RE/RTLE结果:WA/ACKoopa的诞生用同样的思路审视实践教学的安排Koopa的诞生审视实践教学的安排课程阶段划分/难度设置不合理课程使用的中间表示存在设计缺陷缺乏一个足够详细的实验指导书实验环境的配置复杂且耗时Koopa的诞生课程使用的中间表示存在设计缺陷反思旧设计提出新设计见pku-minic/next-gen-ir-proposalKoopa的诞生2021年6月正式开始设计新IR202
5、1年9月Koopa设计基本确定第一代Koopa框架2021年12月引入基本块参数设计Koopa框架重构2022年2月在线文档编写完成新版Koopa框架Koopa IR易用,通用标准化Koopa IR线性IR,显式CFG,强类型支持SSA形式,但也可以不使用类似LLVM IR,更贴近工业界易于分析、优化、阅读和调试提供标准化的框架(C/C+/Rust)Koopa的设计旧版分层IRSysY源文件Eeyore(高层IR)Tigger(底层IR)汇编/执行文件Koopa的设计实验阶段也按此划分SysY第一阶段第二阶段第三阶段SysY到Eeyore的编译器Eeyore到Tigger的编译器Tigger到
6、汇编的编译器Koopa的设计SysY第一阶段第二阶段第三阶段前端的各类细节控制流、函数的翻译构建AST,生成IR几千行代码解析Eeyore寄存器分配(可选)生成IR近千行代码解析Tigger一对一翻译生成汇编几百行代码Koopa的设计第一阶段前端的各类细节控制流、函数的翻译构建AST,生成IR几千行代码第二阶段解析Eeyore寄存器分配(可选)生成IR近千行代码第三阶段解析Tigger一对一翻译生成汇编几百行代码问题#1两种IR,外加汇编同学们要理解三种表示Koopa的设计第一阶段前端的各类细节控制流、函数的翻译构建AST,生成IR几千行代码第二阶段解析Eeyore寄存器分配(可选)生成IR近
7、千行代码第三阶段解析Tigger一对一翻译生成汇编几百行代码问题#2IR只以文本形式出现每个阶段都需要重新解析Koopa的设计第一阶段前端的各类细节控制流、函数的翻译构建AST,生成IR几千行代码第二阶段解析Eeyore寄存器分配(可选)生成IR近千行代码第三阶段解析Tigger一对一翻译生成汇编几百行代码问题#3每个阶段的难度、代码量居然是逐步下降的Koopa的设计问题 分层IR会引入更多理解负担 文本形式IR不易于程序处理 各阶段难度梯度划分不合理Koopa IR 统一的形式,对前后端友好 提供文本/内存形式及相关库 不是IR的问题,暂不讨论Koopa的设计示例:斐波那契Koopa的设计S
8、ysY源程序Koopa IR示例斐波那契Koopa的设计示例斐波那契在栈上分配局部变量的内存并写入初始值Koopa的设计示例斐波那契和LLVM IR类似但简化了写法,便于初学者理解Koopa的设计示例斐波那契判断循环条件执行控制转移操作Koopa的设计示例斐波那契循环体更新变量的值跳转到循环入口Koopa的设计示例斐波那契循环结束读取返回值从函数中返回Koopa的设计示例斐波那契不仅提供文本形式还提供统一的内存形式Koopa的设计示例斐波那契可选的用于操作IR的库koopa(Rust实现)libkoopa(C FFI)Koopa的设计示例斐波那契Koopa支持SSA形式便于在此基础上进一步优化
9、SSA promoteKoopa的设计示例斐波那契使用基本块参数替换传统的Phi函数 更符合直觉,易于理解 控制流优化时无需关心数据流,降低心智负担 SIL、MLIR、Cranelift也在用Koopa IR易用,通用,标准化Koopa IR在线文档实验环境适合教学的中间表示手把手教你写编译器Docker镜像,开箱即用问题 分层IR会引入更多理解负担 文本形式IR不易于程序处理 各阶段难度梯度划分不合理Koopa IR 统一的形式,对前后端友好 提供文本/内存形式及相关库 不是IR的问题,暂不讨论问题分层IR会引入更多理解负担文本形式IR不易于程序处理各阶段难度梯度划分不合理水平划分阶段,所以
10、:每个阶段都要实现语言的所有特性无法很快写出一个完整的编译器处理main函数(IR生成)处理main函数(目标代码生成)处理表达式处理变量和常量处理语句块和作用域处理各类控制流处理函数和数组垂直划分实践阶段逐步实现编译器实验环境基于Docker构建一键配置:docker pull maxxing/compiler-dev全平台适用,开箱即用,用完即删,没有任何残留环境内置自动测试脚本一键测试:autotest path/to/compiler/repo自带130个功能/性能测试用例,支持分阶段测试Koopa开源的本科生编译实践教学方案IR框架/教程/实验环境/自动测试/多语言开发Koopa好评如潮愿我们的编译课越来越好愿每个人都能感受到编译原理的乐趣MaxXingQ&A