目录标题

  • 词法分析
  • 语法分析
  • 从语法树到中间代码再到目标代码
  • 链接与载入
  • 总结

源程序是给人看的,本质上就是文本文件,可以用Linux中的vi或Windows中的记事本之类的文本编辑程序打开、编写,但计算机无法直接执行源程序,需要通过一个专门的程序将源程序编译为计算机可执行程序,这个专门的程序就是编译器。

编译过程主要分为词法分析、语法分析、中间代码生成、目标代码生成(忽略预处理、语义分析、优化等)。

词法分析

词法分析的作用是从连续的字符中识别出标识符、关键字、数字、运算符并存储为符号(token)流(分割读取各个文本符号)

语法分析

语法分析的作用就是从词法分析识别出的符号流中识别出符合C语言语法的语句(识别文本符号进行语法匹配)

以案例中“int fun(int a,int b);”这条函数声明语句为例描述这个过程,它与语句模板的匹配情景如图


这段token流最终与函数声明模板相匹配,在匹配成功后,计算机就认为此语句为函数声明语句,并以语法树的形式在内存中记录下来,情景如图

从语法树到中间代码再到目标代码

如果希望一步到位,从语法树转换为目标代码,理论上和实际上都是可行的。但计算机存在多种CPU硬件平台,考虑到程序在不同CPU之间的可移植性,先转换成一个通用的、抽象的“CPU指令”,这就是中间代码最初的设计思想。然后根据具体选定的CPU,将中间代码落实到具体CPU的目标代码。

语法树是个二维结构,中间代码是准一维结构,语法树到中间代码的转换过程,本质上是将二维结构转换为准一维结构的过程。中间代码特别是RTL已经可以和运行时结构一一对应了。如图


选定具体的CPU、操作系统后,中间代码就可以转换为目标代码——汇编代码(我们配置的是AT&T汇编),这时操作系统的影响还比较小。然后由汇编器依照选定操作系统的目标文件格式,将.s文件转换为具体的目标文件,对于Linux而言是.o文件,对于Windows而言是.obj文件。目标文件中已经是选定的CPU的机器指令了。

链接与载入

最后链接器把一个或多个目标文件(库文件本质上也是目标文件)链接成符合选定操作系统指定格式的可执行文件。

通过操作系统,可执行程序就可以被载入内存执行

总结

编译原理——程序编译的基本流程相关推荐

  1. python编译原理_编译原理实战课 带你吃透编译技术核心概念与算法

    编译原理实战课,我们到底要学些什么? 在这门课程里,宫老师精选出了Java.Java JIT.Python.JavaScript.Julia.Go.MySQL这7种真实编程语言的编译器,带你阅读它们的 ...

  2. 计算机编译原理ppt,编译原理课件.ppt

    文档介绍: 高级语言 汇编语言 SOURCE PROGRAM Assemble PROGRAM ?翻译程序? TRANSLATER 为什么要学****编译原理 程序设计语言是计算机软件专业的重要核心 ...

  3. 【编译原理】编译原理系统学习与实践系列文章汇总目录(持续更新中)

    本文属于「编译原理」系列文章的汇总目录,这一系列正式开始于2021/10/22,着重于「编译原理的学习与实践」.众所周知,编译原理难学难精,因此本系列将至少持续到作者本人「精通编译原理」为止(笑).由 ...

  4. linux gcc 静态编译,GCC 程序编译的静态链接和动态链接

    (给Linux爱好者加星标,提升Linux技能)转自:Mr_Bluyee 在链接阶段中,所有对应于源文件的 .o 文件.'-l' 选项指定的库文件.无法识别的文件名(包括指定的.o目标文件和.a库文件 ...

  5. [编译原理]吉林大学编译原理csf课件下载(1-64) 主讲:康辉 (附破解补丁)

    下载地址: http://dec-vod.jlu.net.cn/csmedia/计算机科学与技术专业(高起本)/编译原理/第01讲.csf?tod_key=lvqdt1QZ8OldtWBRjvNxUY ...

  6. 终端编译opengl程序编译运行_ubuntu编译opengl和demo之二(glfw版本)

    [TOC] 1.安装GL和glut等 sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev sudo apt-ge ...

  7. Linux底层驱动编译原理 ,编译过程 以及 装载(树莓派)

    一.用户支配驱动工作的过程 上层应用调用open,read,write等标准C库函数 触发软中断:0x80 ,由用户态进入到内核态,发生系统调用 系统调用syscall,文件子系统会调用相应的syso ...

  8. linux系统的编译原理,GCC编译原理_Linux编程_Linux公社-Linux系统门户网站

    一.编译过程 使用gcc编译程序时,编译过程可被细分为四个阶段: (1)预处理 (2)编译 (3)汇编 (4)链接 例如hello.c程序 hello.c: #include int main(voi ...

  9. 程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言

    高级程序设计语言 一.语言概述 1.1 语法 v.s. 语义 程序本质上是一定字符集上的字符串 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序 定义了程序的形式结构 定义语 ...

最新文章

  1. 才知道百度也提供了智能DNS服务 - 加速乐
  2. PMCAFF产品经理第一课 | 杭州站 现场集锦
  3. Leetcode-169 Majority Element
  4. 【会议】2008-10-27
  5. python做图片浏览器_python操作浏览器及截图小结
  6. python输入hello输出olleh_Python小试牛刀(经典例题)[连载中]
  7. oracle 密码管理,【转载】Oracle密码管理五大要点(一)
  8. rust 手动关闭子线程_Rust入坑指南:齐头并进(上)
  9. 【批处理DOS-CMD命令-汇总和小结】-输出/显示命令——echo
  10. 微信小游戏跳一跳外挂辅助程序
  11. ffmpeg截取视频
  12. 图片的后缀是什么意思
  13. 华为机试练习(十二)叠积木
  14. 为什么很多人选择bgp机房托管
  15. qemu教程_QEMU实例教程
  16. java端口扫描器 demo_java端口扫描器
  17. 上云利器,K8S应用编排设计器之快到极致
  18. 记录徒手解决cranberry病毒的过程
  19. buck电路闭环pi控制matlab图,BUCK电路闭环控制系统的MATLAB仿真
  20. frame与bounds的区别比较

热门文章

  1. 计算机系技能大赛策划案,计算机基本技能大赛”活动策划书
  2. Java实验06-GUI文件加解密软件,ScrollPanel嵌套Boxlayout,DES分组加密算法,进度条控制
  3. IEEE Transactions on Image Processing文献跟踪11月
  4. matlab某分子由25个原子组成,清华大学数学实验实验7无约束优化1
  5. 全国计算机自考应用题,近几年度自考管理系统中计算机硬应用题汇总.doc
  6. 视频H265格式压缩,软件压缩方法,硬件的没有条件,没法测试。
  7. 上周热点回顾(8.20-8.26)
  8. TMS320F28377S 学习笔记1 GPIO及学习资料
  9. 一个简单的SpringBoot项目 demo
  10. 城市交通的5D模式 | 不同尺度下研究的城市交通