TinyC编译器4—编译器基本流程

news2024/9/22 23:32:37

1.什么是编译器,为什么要开发编译器

编译器:将一种程序语言翻译为另一种程序语言的计算机程序。一般来说,源程序为高级语言,而目标语言则是汇编语言或者机器码。

一开始的程序员是用机器码写程序,非常容易出错,后来开始使用汇编语言开始写,但是依旧不高效,后来在50-60年代,有人发明了高级语言及编译器,这就导致写程序就像写数学公式推理一样,方便了很多。所以开发编译器是很重要的。

2.编译器的工作流程

  • 对源文件进行扫描,将源文件的字符流拆解成一个个的词(记号),此为词法分析
  • 根据语法规则,将这些记号构造成语法树,此为语法分析
  • 对语法树各个结点之间的关系进行检查,检查语义规则是否被违背,同时对语法树进行必要的优化,此为语义分析
  • 遍历语法树的结点,将各个结点转换成中间代码,并按照特定的顺序拼装起来,此为中间代码生成
  • 对中间代码进行优化
  • 将中间代码转换成目标代码
  • 对目标代码进行优化,生成最终的目标程序

2.1词法分析

编译器扫描源文件的字符流,过滤掉字符流中的空格、注释等,并将其分割成一个个的词(记号、token)。

a = value + sum(5, 123);

将被拆分为11个 token :

a           标识符
=           赋值运算符
value       标识符
+           加号
sum         标识符
(           左括号
5           整数
,           逗号
123         整数
)           右括号
;           分号

2.2语法分析

词法分析完成后,上面的字符流就被转换为 token 流了:

ID<a> '=' ID<value> '+' ID<sum> '(' NUM<5> ',' NUM<123> ')' ';'

上面的 ID<a> 表示这一个标识符类型的 token ,其内容为 a。其他的赋值符号等全都用‘’

其实不难看出,语法分析其实就是不断拆解一个语句,形成一个语法树。

2.3语义分析

就是在遍历语法树的过程中,遇到变量声明和函数声明时,则将变量名——类型、函数名——返回类型——参数数量及类型等信息保存到符号表里,当遇到使用变量和函数的地方,则根据名称在符号表中查找和检查,查找该名称是否被声明过,该名称的类型是否被正确的使用等等。

其实本质就是一个检查防止错误的过程。

2.4中间代码生成

  • 中间代码不仅有一些高级语言的特性,也有接近机器语言的部分,所以相当于一个中间过渡态。这样就可以实现从高级语言代码->中间代码->目标代码,而且这比高级语言代码->目标代码简单很多。
  • 增加编译器的模块化、可移植性和可扩展性。一般来说,中间代码既独立于任何高级语言,也独立于任何目标机器架构,这就为开发出适应性广泛的编译器提供了媒介。

如下图中,可以通过编写 m + n 个编译模块而获得 m * n 种编译器。

2.5中间代码优化

编译器对中间代码进行优化,尝试生成体积最小、最快、最有效率的代码。

  • 去除永远都不会被执行的代码区
  • 去掉未被使用到的变量
  • 优化循环体,将每次循环中的运行结果不变的语句移到循环的最外面
  • 算术表达式优化,将乘 1 和 加 0 等操作去掉,将乘 2 优化成左移 1 位等

2.6编译过程的错误检查

词法、语法和语义分析的过程中,都伴随着错误检查,词法错误主要是字符错误(如非法字符、未结束的注释、未结束的字符串等),语法错误主要是格式错误(如语句后未加分号、不匹配的括号等),最常发生的是语义错误(如变量名错误、表达式类型错误、函数参数不匹配等)。编译器不仅检查错误,还需要精确定位出错误发生的位置,协助编程人员修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5中制作箭头滑动转场

通过程序化的方式&#xff0c;可以制作一些特殊的转场效果&#xff0c;如箭头划过的转场&#xff1a; 1.制作思路 我们知道向量点积可以拿来做投影&#xff0c;因此可以把UV空间想象成向量坐标&#xff0c;绘制结果就是在某个向量上的投影&#xff1a; 绘制结果似乎是倾斜方…

【ISAC】Federated Edge Learning With Misaligned Over-The-Air Computation

[1]-Tse, David, and Pramod Viswanath. Fundamentals of wireless communication. Cambridge university press, 2005. 文章目录 1-综述2-系统模型 1-综述 misaligned OAC&#xff1a;预编码矩阵&#xff08;含噪声&#xff09; 没同步好 2-系统模型 θ ∈ R d \theta \in\m…

云计算实训31——playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排

playbook(剧本): 是ansible⽤于配置,部署,和管理被控节点的剧本。⽤ 于ansible操作的编排。 使⽤的格式为yaml格式 一、YMAL格式 以.yaml或.yml结尾 ⽂件的第⼀⾏以 "---"开始&#xff0c;表明YMAL⽂件的开始(可选的) 以#号开头为注释 列表中的所有成员都开始于…

耐氟化氢PFA蒸馏冷凝装置PFA烧瓶应用于氟化工半导体行业领域

氟化氢&#xff0c;化学式为 HF&#xff0c;是一种无色、有刺激性气味的气体&#xff0c;它在空气中会形成白色的雾。氟化氢具有很强的腐蚀性&#xff0c;能够侵蚀许多金属和非金属材料。这种腐蚀性使得氟化氢在工业上被用于蚀刻玻璃、清洗半导体器件以及加工金属等领域。 氟化…

Ubuntu | 更换 Solc 版本

目录 第一步&#xff1a;安装 pip3第二步&#xff1a;安装 solc-select第三步&#xff1a;查看可安装版本第四步&#xff1a;安装指定版本第五步&#xff1a;使用指定版本 前言&#xff1a;部署智能合约时报错&#xff0c;发现是 Solc 版本太高。 参考博客&#xff1a;Solc 安…

Spring Boot整合Quartz框架

说明&#xff1a;Quartz是一个定时器框架&#xff0c;可以实现定时任务&#xff0c;本文介绍如何在Spring Boot项目中整合Quartz框架&#xff0c;Quartz介绍参看下面这篇文章&#xff1a; 【Quartz】Quartz定时任务框架 创建Demo 首先&#xff0c;创建一个Spring Boot项目&a…

Qt Creator安装配置指南

1.官网下载在线安装包 官网地址&#xff1a; https://www.qt.io/download-dev#eval-form-modal 2.双击在线安装包按引导流程安装qt 3.选择自己要配置的qt环境版本 3.1如果要选中低版本的qt环境我这里安装的是qt5.15.2的(其他低版本也一样的)&#xff0c;要勾选上Archive(存…

拓展销售网络:立即领取企元数智小程序合规分销系统!

"拓展销售网络&#xff1a;立即领取企元数智小程序合规分销系统&#xff01;"企业的销售网络是企业成长和发展的关键&#xff0c;而企元数智小程序合规分销系统能帮助您快速拓展销售网络&#xff0c;实现销售业绩的持续增长。 通过领取企元数智小程序合规分销系统&am…

2024软件测试八股文【答案解析+文档】

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师…

Go语言导入gin包

访问https://pkg.go.dev/页面,输入gin 点击README&#xff0c;点击Getting started&#xff0c;点击Getting Gin。 以VSCode通过mod命令导入gin包为例 安装第三方库 go mod init go mod tidy运行成功创建go.mod文件 go get -u github.com/gin-gonic/gin创建Go项目&#xf…

养猫换毛季总结,希喂、小米宠物空气净化器功能测评,真实PK

猫咪作为小家中的一员&#xff0c;陪伴我们度过了非常多时光。而养猫一定会面临换毛季的问题&#xff0c;在换毛季期间&#xff0c;宠物会大量掉毛&#xff0c;不仅破坏家里的整洁&#xff0c;而且还可能被猫咪误吞&#xff0c;导致毛球症。这需要我们铲屎官选找到有效的清理毛…

Spring cloud alibaba(二)RibbonLoadBalance

一、负载均衡 其含义就是将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff1b;&#xff08;就是客户端调用服务提供方时的如何调用多个实例的策略&#xff09; 1、主流负载均衡的方案 集中式负载均衡&#xff1a;在消费者和服务提供方中…

使用excalidraw搭建自己的中文手写画板

使用excalidraw搭建自己的中文手写画板 成品预览地址&#xff1a;https://guizimo.github.io/excalidraw/ 原excalidraw提供了英文的手写体&#xff0c;但中文还是正正方方的&#xff0c;感觉不搭。希望中文也可以有那样一种手写风格。 本文使用的是excalidraw&#xff0c;它…

ArchWsl 运行图形界面程序

最新的WSL2已经支持图形界面&#xff08;wslg&#xff09;了&#xff0c;这里教大家运行GUI应用&#xff08;桌面环境同理&#xff0c;但是我建议大家不要安装桌面环境&#xff0c;没有桌面环境也可以单独运行GUI应用&#xff09; 更新WSL 建议更新到最新版本&#xff0c;早期…

web实现drag拖拽布局

这种拖拽布局功能其实在电脑操作系统或者桌面应用里面是经常使用的基础功能&#xff0c;只是有时候在进行web开发的时候&#xff0c;对这个功能需求量不够明显&#xff0c;但却是很好用&#xff0c;也很实用。能够让用户自己拖拽布局&#xff0c;方便查看某个区域更多内容&…

【教学类-72-02】20240819建筑对称图纸02(图案最大化)

背景需求 【教学类-72-01】20240803建筑对称图纸01-CSDN博客文章浏览阅读423次&#xff0c;点赞13次&#xff0c;收藏5次。【教学类-72-01】20240803建筑对称图纸01https://blog.csdn.net/reasonsummer/article/details/140893003 我感觉房子有大有小&#xff0c;有大量空白&…

2、目标识别(颜色识别)

一、根据所使用的视觉模块的官方网站或软件&#xff0c;获取相应颜色的阈值 blue [(23, 74, -119, 19, -125, -29)] #蓝紫色 [(0, 53, -128, 127, -128, -8)] red [(0, 44, 40, 62, 16, 127)] #红色 [(0, 44, 40, 62, 16, 127)] org [(44, 100, 13, 126, 2…

【多线程开发 6】spring中的注解/API的线程问题

【多线程开发 6】spring中的注解/API的线程问题 2024年8月14日 文章目录 【多线程开发 6】spring中的注解/API的线程问题1 Future和CompletableFuture2 hutool的异步任务3 Async4 Schedule5 stream Parallel6 ForkJoinPool7 Transactional 除了Java自带默认线程池&#xff0c;…

mac本地搭建docker+k8s步骤

概览&#xff1a; * kubectl安装 * minikube安装 * dashboard安装 主机配置&#xff1a; * mac M2 &#xff08;arm架构&#xff09; 服务及版本概览&#xff1a; 服务名称版本 kubectl v1.29.2 Kubernetes v1.30.0 kicbase v0.0.44 dashboard v2.7.0 docker 26.…

Linux:进程概念

文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识 进程概念 1、冯诺依曼体系结构 目前我们认识的计算机中&#xff0c;都是由一个个硬件构成 输入单元&#xff1…