Mslxl's Blog

Integrate Life

编译原理:绪论 —— 中间代码生成和编译器后端

发布于 # Compiler

中间代码生成 源程序的中间代码表现可以有多种形式,常见的是 三地址码 (Three-address Code) 和 语法结构树 (Syntax Trees),语法结构树简称语法树。在这里我们只介绍一下三地址码。 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数 (operand),因此叫三地址码。 常用的三地址指令 序号 指令类型 指令形式 1 赋值指令 x = y op z<br/>x = op z 2 复制指令 x = y 3 条件跳转 if x relop y goto n 4 非条件跳转 goto n 5 参数传递 param x 6 过程调用 call p , n 7 过程返回 return x 8 数组引用 x = y[i] 9 数组赋值 x[i] = y 10 地址<br/>及<b

编译原理:绪论 —— 语义分析

发布于 # Compiler

语义分析 语义分析的任务 语义分析是编译过程的第三个阶段,高级语言中的语句大多数分为两类,一类是声明语句,一类是可执行语句,在声明语句中会声明一些数据对象或过程,并且为他们分别起一个名字 标识符 (id),对于声明语句来说,语义分析的主要任务就是收集标识符的属性信息,一般有这些属性信息 对声明语句语义分析的任务 种属 (Kind) : 它说明了这个标识符对应的是简单变量,还是一个复合变量(数组、记录、...),还是过程、... 类型 (Type) : 这个我相信都不用说了把 储存位置、长度 : 比如说我们写了一个对象或过程,我们都要在内存中给他分配一段空间,这样存储位置和所占用的空间的大小(长度)就成为标识符重要的属性 值 作用域 关于 3 举个例子: begin real x[8] integer i,j; ... end 首先声明了一个实型数组x ,因此

编译原理:绪论 —— 语法分析

发布于 # Compiler

语法分析 (Parsing) 语法分析是编译的第二个阶段,它的主要任务是从词法分析器输出的 Token序列中 识别出各类短语,并构造语法分析树 (parse tree),语法分析树描述了句子的语法结构。 Example 1 先来看一个赋值语句的分析 position = initial + rate * 60; 经过词法扫描后会得到这样的一个 Token 序列: <id,position> <=> <id,initial> <+> <id,rate> <*> <num,60> <;> 它对应的分析树应该就是这样的: <pre class="mermaid"> graph TD 赋值语句---A["标识符 (position)"] 赋值语句---B["="] 赋值语句---C["表

编译原理:绪论

发布于 # Compiler

最近在学习编译原理,把笔记整理一下写在上面 什么是编译? 编译是将一种语言翻译为另外一种语言,将被翻译的语言叫做源程序,而翻译之后的语言叫做目标语言一般来说,编译是将高级语言翻译为低级语言,例如 GCC 等 C++ 编译器就是将 C++ 翻译为机器语言或中间语言。 高级语言(High Level Language)符合人的表达习惯且易于学习和记忆,常见的就是 C++ 、Java。 低级语言则相反,并且与运行的机器密切相关,比如汇编语言(Assembly Language)和机器语言(Machine Language)。 下面分别是 C++ 、汇编语言和机器语言的画风: x = 1 MOV X,2 C706 0000 0002 通过上面几个例子,我们就知道了什么是编译以及为什么要编译。 编译器在语言处理中的位置 在变异中,除了编译器,我们还需要其他的一些东西。 首先,我们需要预处理器

编译原理:绪论 —— 词法分析

发布于 # Compiler

词法分析 (Scanning) 词法分析是编译的第一个阶段。词法分析器的主要任务是从左向右逐行扫描 (Scanning) 源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示——词法单元 (token) 形式。 token: <种别码,属性值> token 是一个二元组,其中第一个分量种别码用来表示单词的种别,就比如人说的自然语言中都有词性,程序设计语言也有这些东西,他们大体可分为五类: | | 单词类型 | 种别 | 种别码 | | :-: | :------: | :---------------------------------------------------------------: | :------

moe-counter

统计自 2024 年 9 月