LLVM新手入门:万花筒语言解析与实现

需积分: 0 0 下载量 153 浏览量 更新于2024-07-15 收藏 372KB PDF 举报
"20200828-Kaleidoscope(第四期)-孙少策.pdf" 是一份关于Kaleidoscope编程语言的教程,由LLVM项目的一部分——Kaleido语言的新手入门组成。这篇教程主要介绍了如何构建一个简单的语言前端,并通过LLVM进行编译和执行。 在Kaleidoscope语言中,我们看到了一些关键概念和术语: 1. **LLVM**:LLVM是一个开源的、模块化的编译器基础设施项目,设计用于提供静态和动态编程语言的中间表示(IR)和工具。它支持编译器优化,可以用于创建新的编程语言或改进现有语言的编译过程。 2. **LLVM新手入门教程**:这个教程引导读者实现一个简单的语言前端,涵盖了从解析输入代码到生成LLVM IR的全过程。 3. **PLCT-SSC (可能是指Parser-Lexer-Compiler-Target - Simple Syntax Checker)**:这部分可能是指教程中的一个阶段,涉及词法分析、语法解析、编译和简单的语义检查。 4. **Ready命令**:在交互式环境中,`ready>`提示符表示系统准备好接收用户输入,可以执行代码或声明。 5. **extern声明**:`extern printd(x);` 是一个外部函数声明,表明`printd`函数不在当前定义范围内,但可以在其他地方找到。 6. **函数定义**:`def smaller(xy) if x<y then printd(x) else printd(y);` 是Kaleidoscope语言的一个函数定义,使用条件语句来决定调用`printd`的哪个参数。 7. **IR (Intermediate Representation)**:`%cmptmp=fcmpult double%x,%y` 是LLVM IR代码,表示进行浮点比较。`fcmpult`是浮点小于无序测试,用于比较两个双精度浮点数`%x`和`%y`。 8. **控制流图(Control Flow Graph, CFG)**:在`entry:`和`br`指令中,可以看到控制流图的构建,表示程序的执行流程。 9. **函数调用**:`%calltmp=calldouble@printd(double%x)` 和 `%calltmp1=calldouble@printd(double%y)` 是对`printd`函数的调用,分别使用`%x`和`%y`作为参数。 10. **选择结构(Phis Node)**:`%iftmp=phi double[%calltmp,%then],[%calltmp1,%else]` 使用 Phi 节点来处理条件分支的返回值。 11. **return语句**:`retdouble%iftmp` 返回 Phi 节点的结果,结束函数。 这个教程通过Kaleidoscope语言展示了编译器的基础工作原理,包括解析、语义分析、代码生成和LLVM IR的使用,对于想要学习编译器构造和LLVM框架的人来说是一份宝贵的资源。