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

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

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 反之 这个