1.2 编译器的高层结构

2024-04-05 04:32
文章标签 结构 编译器 1.2 高层

本文主要是介绍1.2 编译器的高层结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编译器的高层结构

编译器是一个具有非常 模块化 的高层结构。

input---->[C]---->out -->

前端:处理和输入相关部分,比方语言,语法规则约束条件。(词法分析,语法分析
后端:目标机器指令集,约束,前端语法结构怎么映射到指令集。(指令生成,指令优化

input --> [前端 ---> 后端] ---> out

抽象的多个阶段(phase)
编译器可以堪称多个阶段构成的“流水线”结构

input --> [中间语言/阶段]--> [中间语言/阶段]--->[中间语言/阶段] ...out

每个 阶段/中间语言 完成相关的一个任务,把输入翻译成另一个等价的输入。

为什么要分成多个阶段:

  • 现在的高级语言对于机器来说都比较高层,如果要通过一遍,直接到达目标机器码难度会比较大一些,所以通过把这样的过程切分成不同阶段可以使得抽象一层一层向下降,逐步靠近目标机器结构。
  • 任何一个编译器系统在实际当中都可能是规模庞大的复杂。如果把所有功能都写到一个模块种,从功能上来说就比较复杂,所以把它通过阶段划分,使得每一个模块相对来说容易实现和维护。

典型的编译器结构

在这里插入图片描述

因为没有涉及到编译器优化,所以又叫 没有优化的编译器结构。

符号表:在整个过程中,每个模块都需要和符号表进行交互,它是存取了程序编译过程中相关的重要信息,可以对每个阶段进行支持。

更复杂的编译器结构
动作:语法动作。

指令选择:在中间树上做操作,对每一个高层的语法结构选择合适的汇编指令来对它进行实现,是完成语法结构到汇编的一个映射

在这里插入图片描述

小结
编译器由多个阶段组成,每个阶段都要处理不同的问题,在处理这些问题的过程中需要使用不同的理论、数据结构和算法、软件工程的思想等。
编译器设计中最重要的问题是 如何合理的划分组织各个阶段,使得接口清晰,编译器容易实现和维护。

示例
源语言:加法表达式语言Sum
两种语法形式:
整型数据n
加法 e1+e2

1. 3      可以看到 3 是一个整形数据,所以结果就直接是3
2. 3+5    从高层看是加法,3 和 5 也分别是加法表达式,因为3和5都是整型数据,也满足规则1  
3. 3+4+5  这里有个集合性的概念 理论上是  3+4 结合  3+4的结果和+5结合

目标机器:栈式计算机Stack
两条指令:
push n
add

                栈顶
push 3          |  6  |
push 4          |  5  |
push 5          |  4  |
push 6          |  3  | 栈底
add  /|  x = pop
add - |  y = pop|  z = x + y\  push z 此时堆栈 应该 弹出 5,6 然后将 5,6 相加后压入堆栈
--- > 进行了 add 操作后 堆栈变化栈顶
|  11  |
|  4   |
|  3   | 栈底

编译器实现:
任务1: 编译器程序 1+2+3到栈式计算机上

1. 输入: 1 + 2 + 3 
在前端中,进行语法分析
2. 输出: [+]2/   \[+]1   [3]/    \[1]    [2]3.抽象语法树 AST , 核心作用是对这样一个运算的内部结构做一个清晰的表示代码生成:
4.stack: 使用树的后续遍历,先遍历树的左子树节点,然后遍历右子树,最后回到根,遍历根节点1.n   : push n 
2.[+] : add
顺序:
push 1  -> 回到 [+]1
push 2  -> 回到 [+]1
add     -> 回到 [+]1 这个节点遍历完成了,生成 add 指令 
push3   -> 回到 [+]2 节点
add     -> 回到 [+]2 节点遍历完成 生成 add 指令

任务2:
已知:
编译器的构造和具体编译目标相关

--> 前端 --> 中间表示AST --> 后端
接口: 中间表示的语法树
前端: 负责把输入变成语法树
后端:  负责把语法树的数据结构变成目标代码

目标:
增加一个代码优化阶段:

input --> [前端] ---> [中间表示(语法树)]--->[优化]---> 语法树--->后端

代码:
https://download.csdn.net/download/Tiantangbujimo7/12351585

这篇关于1.2 编译器的高层结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877631

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

usaco 1.2 Milking Cows(类hash表)

第一种思路被卡了时间 到第二种思路的时候就觉得第一种思路太坑爹了 代码又长又臭还超时!! 第一种思路:我不知道为什么最后一组数据会被卡 超时超了0.2s左右 大概想法是 快排加一个遍历 先将开始时间按升序排好 然后开始遍历比较 1 若 下一个开始beg[i] 小于 tem_end 则说明本组数据与上组数据是在连续的一个区间 取max( ed[i],tem_end ) 2 反之 这个

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速