首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自己动手写编译器:中间代码生成1

我们到了简单编译器开发的最后一个阶段,也就是生成中间代码。...我们的计划是这样,首先完成比较简单的代码的中间代码生成,然后不断提升目标代码的复杂度,然后生成更加复杂的中间代码。...中间代码生成将非常依赖于语法解析树,因此我们需要在语法解析过程中构造出相应的树结构,然后再通过遍历语法树每个节点,然后根据节点的数据依次生成中间代码,下面我们先介绍节点的定义以及不同节点之间的继承关系...= nil { /*调用子节点的Gen函数,让子节点先生成中间代码, 子节点生成中间代码后会返回一个Expr节点,然后这里将返回的节点赋值给 一个临时寄存器变量...Op节点,同时创建对应的子Arith节点,在生成中间代码时,先调用Arith的Gen函数生成代码字符串” a + b” 或是 “a - b”,然后创建一个临时寄存器变量t,最后生成中间代码: t = a

63010

第七-八章 语法制导翻译和中间代码生成

许多编译程序采用的独立于机器的、复杂性界于源语言和机器语言之间语言源程序的一种内部表示:中间代码 用中间语言过渡的好处: 便于进行与机器无关的优化工作 使编译程序改变目标机容易,便于移植...emit(x ':=' y '+' z)将生成的三地址代码x:=y+z发送到输出文件。 newtemp 每调用一次,生成一个临时变量。 属性设置: 存储位置 place。...举例: if a<b or c<d and e<f then x:=y+z else x:=y-z 翻译过程: 首先按照自下而上的方式归约,每次归约句柄得到1-7步的中间代码...在产生中间代码的过程中,每个四元式的转移目标可能未知,将其链接起来。...3.4.3 翻译模式 使用上面这些翻译模式就可以让计算机自动进行中间代码(四元式)的生成,并且使用了拉链回填技术。注意,中间代码生成是在语法分析时进行的,所以所有翻译模式都是在归约时进行。

1.8K40
您找到你想要的搜索结果了吗?
是的
没有找到

自己动手写编译器:实现else语句块的中间代码生成

前面几节我们完成了if语句以及判断条件成立时代码对应的中间代码生成,这次我们完成最后一笔,那就是针对else部分代码完成相应的中间代码生成。...本质上这一步比较简单,它会在原来if语句中间代码的基础上稍作修改即可,我们先看看这次我们要编译的代码内容: `{int a; int b; int c; int d; int...if条件判断中代码 e.stmt1.Gen(label1, end) //生成if成立后大括号里面代码的中间代码 e.Emit("goto L" + strconv.Itoa(int(end...))) //增加goto语句跳过else部分代码 e.EmitLabel(label2) e.stmt2.Gen(label2, end) //生成else里面代码对应中间代码 }...if成立时语句块的中间代码,最重要的是它在if语句块里面的代码完成生成后加入一条goto语句,这个goto语句的作用是越过else部分的代码。

39810

自己动手写编译器:while,for,do等循环语句的中间代码生成

我们的简易编译器完成了一大部分,但还有一些关键的语法结构没有处理,那就是for, while, do..while等循环语句对应的中间代码还没有生成,本节我们就针对这些语法结构进行相应的中间代码生成。...my_lexer) parser.Parse() } 代码运行后输出结果如下: 我们简单分析一下输出结果,从L4开始就是while循环体输出的代码,L4对应的语句就是while后面条件判断对应的中间代码...,它表明如果a >= 0 , b <= 4 这两个条件只要有一个不成立 ,那么就跳转到L5,注意到L5正好对应while循环体出去后的第一条语句,因此生成中间代码其逻辑符合我们在main.go中给定代码的意图...break语句对应的中间代码就需要记录它所在循环体外边接下来第一条语句的标号。...L4, 当然这条语句其实是冗余,在后面生成代码优化时我们再处理。

1.1K10

自己动手写编译器:实现if判断中“||“和“&&“条件判断的中间代码生成

上一节我们完成了if条件判断语句的中间代码生成,我们看到针对if语句的生成代码,我们针对if 条件满足时所要执行的代码赋予了一个跳转标签,同时对if(){…} 右边大括号后面的代码也赋予一个跳转标签,这样我们就能根据...假设我们给定的表达式为”a || b”,那么expr1对应符号a,expr2对应符号b,假设执行Jumping接口调用时输入参数为1,2,那么o.expr1.Jumping(label, 0) 就会生成中间代码...上面代码中Gen函数的实现逻辑有点诡异,if条件判断语句除了生成跳转代码外,它还能生成其他代码,后面我们在调试代码时会看到它的作用,在这里我们先放一放对它的理解。...lexer.NewLexer(source) parser := simple_parser.NewSimpleParser(my_lexer) parser.Parse() } 执行后生成中间代码如下...(test string, t uint32, l uint32) { a.logic.EmitJumps(test, t, l) } 它的逻辑与前面or.go差不多,只是Jumping函数生成中间代码时有所不同

68210

自己动手写编译器:通过语法编译构建语法树并实现中间代码生成

上一节我们手动构造了语法树,然后调用各个节点实现中间代码生成。语法树的构建由语法解析完成,本节我们要完成语法解析逻辑,在语法解析过程中构造语法树,然后再像上一节那样实现中间代码生成。...Expression) Gen(start uint32, end uint32) { e.expr.Gen() } 它的逻辑很简单,就是封装了ExprInterface接口对象,它对应的Gen接口用于生成语句对应的中间代码...return inter.NewSeq(s.lexer.Line, s.stmt(), s.stmts()) Seq节点也是继承自stmt的子节点,它的作用是把一系列语句连成队列,这样就能实现一连串中间代码生成...字段可以看做是队列的next指针,指向下一个Seq节点,stmt1节点指向Expression节点,里面又包含了相应的ExprInterface节点,当执行语法解析时,我们从头结点开始依次执行,当末尾节点也完成其对应的中间代码生成后...,所有代码的中间代码生成就完成了。

76410

编译原理:第一章 编译原理引论

png 1.4 高级语言程序的处理过程 image-20210903105656311.png 二、编译过程和编译程序的结构(重点) 2.1 编译过程概述 词法分析-> 语法分析 -> 语义分析+中间代码生成...-> 中间代码优化 -> 目标代码生成 -> 目标代码 2.1.1 词法分析 输入源程序(看成字符串) 根据语言的词法规则对构成源程序的字符串进行扫描和分解 识别出一个个的单词(token...语法分析 输入单词符号串 根据语言的语法规则对单词符号串进行扫描和分解 识别出各类语法单位 语法单位内部表示:语法树 image-20210903113603090.png 2.1.3 语义分析+中间代码生成...输入各类语法范畴 根据语言的语义规则,分析其含义,并进行初步翻译 产生中间代码 以下列代码为例,生成中间代码: int main( ) { float sum,first,count...有时二者不能同时达到,需根据实际情况取舍 例子: image-20210903115708593.png 2.1.5 目标代码生成 输入优化后的中间代码

52610

编译阶段完成的任务

中间代码生成 中间代码生成器根据语义分析器的输出生成中间代码中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。...中间代码优化 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成中间代码往往在时间和空间上有很大浪费。...当需要生成高效目标代码时,就必须进行优化。 目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。...编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。

36110

Go 语言编译过程概述

目录 编译原理概述 词法和语法分析器 类型检查 中间代码生成 机器码生成 预备知识 想要深入了解 Go 语言的编译过程,需要提前了解一下编译过程中涉及的一些术语和专业知识。...,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标『机器』能够运行的机器码。...中间代码生成 当我们将源文件转换成了抽象语法树、对整棵树的语法进行解析并进行类型检查之后,就可以认为当前文件中的代码基本上不存在无法编译或者语法错误的问题了,Go 语言的编译器就会将输入的 AST 转换成中间代码...中间代码生成 这一章节会详细介绍中间代码生成过程并简单介绍 Golang 是如何在中间代码中使用 SSA 的特性的,在这里就不展开介绍其他的内容了。...机器码生成 一节会详细介绍将中间代码翻译到不同目标机器的过程,在这个章节中也会简单介绍不同的指令集架构的区别。

1.4K40

了解Go语言编译器原理和实现

Go语言编译器简介 作用:将Go源码编译成机器代码 组成:词法分析、语法分析、中间代码生成、代码优化、目标代码生成 词法分析阶段 将源代码分割成词法单元(token),比如关键字、标识符、符号等 使用正则表达式匹配源代码进行词法分析...语法分析阶段 将词法单元流组合成语法单元 检查语法的正确性,生成抽象语法树(AST) 中间代码生成阶段 为后续的代码优化生成中间代码(比如GIMPLE) 代码优化阶段 对中间代码进行各种优化(比如死代码删除...、内联函数等) 优化目标是生成更高效的代码 目标代码生成阶段 根据CPU目标平台,生成特定的机器代码 包含指令选择、寄存器分配、二进制编码等步骤 总结: Go语言编译器将源代码转化为机器可以执行的二进制码

16920

【愚公系列】软考中级-软件设计师 011-程序设计语言基础知识(考点简介)

编译程序是将整个高级语言程序一次性地转化为机器语言代码,生成可执行文件。编译过程包括词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成等多个阶段。...编译程序是将整个高级语言程序一次性地转化为机器语言代码,生成可执行文件。编译过程包括词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成等多个阶段。...中间代码生成(Intermediate Code Generation):将语法树转化为中间代码(intermediate code),中间代码是一种类似于汇编语言的抽象表示,比源代码更接近机器语言。...代码优化(Code Optimization):对中间代码进行优化,使得生成的机器代码更高效、更快速。代码生成(Code Generation):将中间代码翻译成特定机器的机器代码,生成可执行文件。...中间代码生成:解释程序会将抽象语法树转换为中间代码,也就是一种与机器无关的中间表示形式。中间代码类似于汇编语言,但更高级,更易于优化和转换。

19321

LLVM简介

他们的作用如下: 前端:词法分析、语法分析、语义分析、生成中间代码。 优化器:中间代码作为输入,优化中间代码(与架构无关的代码优化),使代码运行更快,体积更小。...后端:生成机器码(根据不同架构x86、x64等生成不同架构的机器码) LLVM架构 ?...Clang生成的AST(抽象语法树)所占用的内存是GCC的五分之一左右 模块化设计。Clang作为LLVM项目下的一个子项目,采用基于库的模块化设计,易于IDE的集成及其他用途的重用。...Clang作为LLVM的前端,负责词法分析、语法分析、语义分析,然后生成中间代码。接下来把中间代码转交给优化器,优化器会对中间代码进行与架构无关的代码优化,优化后的代码体积更小、运行速度更快。...最终LLVM后端会把优化后的中间代码转化为机器码。流程如下: image.png 虽然Clang是LLVM的前端,但是LLVM的前端不只是Clang。

9.7K11

hiphop原理分析1

编译原理引入 1.1 编译器结构 1.2 hiphop 编译器结构 1.3 词法分析器 1.4 语法分析器 1.5 语义分析器 1.6 中间代码生成器 1.7 代码优化器 1.8 代码生成器...这是一个简单的语义分析,hphp中会复杂的多,如c是一个float而60是一个int,所以这里将60转换为float,但是语义不仅仅这么简单 中间代码生成中间代码生成,是解析语法树,然后生成中间代码...:代码优化分析 Code generate:中间代码生成部分 后端: G++ 1.3....中间代码生成器  中间代码可用多种方式表示包括抽象语法树和三地址代码,其中抽象语法树方式能够对结构体进行遍历,而三地址方式则能进行控制流并方便的进行重组。  抽象语法树: ?...代码优化器和代码生产器 1.7代码优化器 代码优化器是对中间代码进行优化使它生成更少的指令。有两种方法:①减少拷贝指令的数目。

1.4K70

编译原理学习笔记-1:引论

编译与解释的不同: 编译和解释都可以将高级语言翻译为机器语言,不同之处在于: image.png 编译是将源代码经过分析后生成语法树,再优化生成中间代码,最后生成机器码。...编译的结果是生成一个可执行的二进制文件; 而解释也是将源代码经过分析后生成语法树,只不过此后它是基于语法树生成字节码,再根据字节码去执行程序。它并不会生成目标文件,更多的是一个结果。...语义分析与中间代码生成:语义分析与中间代码生成器基于语义规则,对语法树进行语义分析(变量是否定义,类型是否正确)和中间代码生成(三元式、四元式等)。...3.2 优化器 中间代码优化:包括分析和转换(数据流分析、相关性分析)两个过程 3.3 后端 指令选择:将每个 IR 操作映射为一个或多个实际的目标机操作 寄存器分配:将指令选择阶段使用的虚拟寄存器映射到实际的目标机寄存器

48320

编译程序的任务

整个编译过程一般可以划分为 5 个阶段:词法分析、语法分析、语义分析及中间代码生成中间代码优化和目标代码生成。我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。...语义分析及中间代码生成定义一种语言除了要求定义语法外,还要求定义其语义,即对语言的各种语法单位赋予具体的意义。...中间代码优化中间代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,节省时间和空间的目标代码。...目标代码生成目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。 表格管理 & 错误处理在编译程序的各个阶段中,都要涉及表格管理和错误处理。...编译程序编译过程的这 5 个阶段的任务分别由 5 个程序完成,这 5 个程序分别称为词法分析程序、语法分析程序、语义分析及中间代码生成程序、中间代码优化程序和目标代码生成程序,另外再加上表格管理程序和出错处理程序

18820

iOS编译简析

编译器前端(FrontEnd): 词法分析,语法分析,语义分析,将源代码抽象为语法树 AST,继而生成中间代码 IR。 优化器(Optimizer): 对得到的中间代码 IR 进行优化....编译器后端(BackEnd): 将得到的中间代码转化为各平台的机器码,如 x86,ARM 等。 从 GCC 到 LLVM 以及大部分编译器都是这种结构。...由 Clang 中 Parser 和 Sema 配合完成; 静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误; 中间代码生成(Code Generation):开始...IR 中间代码生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR。...-fsyntax-only LLVMOC.m // 生成IR中间代码 clang -S -emit-llvm LLVMOC.m -o LLVMOC.ll // 生成IR中间代码并优化, clang

1.3K20

iOS编译原理

编译原理-语言的分类 三、编译器LLVM与CLang 1.编译器 概念:把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序; 大多数编译器都分前端和后端两部分: 前端:负责词法分析、语法分析、生成中间代码...; 后端:以中间代码作为输入,进行与架构无关的代码优化,接着针对不同架构生成不同的机器码; 补充: 前后端以中间代码作为媒介,使得前后端可以独立的变化,互不影响; 这样的好处在于:新增一门语言只需要修改前端...IR(中间代码); 3.静态分析(Static Analysis) 主要功能:对AST树进行遍历分析,包括类型检查、方法实现检查,会及时提示错误; 4.生成中间代码(Code Generation) 主要功能...; 对于iOS系统来说,IR中间代码生成的就是Mach-O可执行文件; IR是前端的输出,后端的输入; 七、汇编(Assembly) 输出中间代码标志着前端工作的完成,接下来将进入后端的处理流程。...1.LLVM优化中间代码 中间代码IR进入后端,LLVM会对其进行优化: Optimization Level bitcode 2.生成汇编代码 LLVM对IR进行优化后,会针对不同架构生成不同汇编代码

1.5K20
领券