了解编译的过程么?分为哪几个步骤?

了解编译的过程么?分为哪几个步骤?

预编译:主要处理以“#”开始的预编译指令。
编译:

词法分析:将字符序列分割成一系列的记号。
语法分析:根据产生的记号进行语法分析生成语法树。
语义分析:分析语法树的语义,进行类型的匹配、转换、标识等。
中间代码生成:源码级优化器将语法树转换成中间代码,然后进行源码级优化,比如把 1+2 优化为 3。中间代码使得编译器被分为前端和后端,不同的平台可以利用不同的编译器后端将中间代码转换为机器代码,实现跨平台。
目标代码生成:此后的过程属于编译器后端,代码生成器将中间代码转换成目标代码(汇编代码),其后目标代码优化器对目标代码进行优化,比如调整寻址方式、使用位移代替乘法、删除多余指令、调整指令顺序等。

汇编:汇编器将汇编代码转变成机器指令。
静态链接:链接器将各个已经编译成机器指令的目标文件链接起来,经过重定位过后输出一个可执行文件。
装载:装载可执行文件、装载其依赖的共享对象。
动态链接:动态链接器将可执行文件和共享对象中需要重定位的位置进行修正。
最后,进程的控制权转交给程序入口,程序终于运行起来了。

2020面试刷题与技术储备专区

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 总结自书籍《程序员的自我修养—链接、装载与库》 1. Hello World运行中被隐藏的过程 HoelloWor...
    Mr希灵阅读 1,668评论 3 20
  • 前言笔者前端时间在运行一个组内 Swift 项目的时候,发现编译时间比较长。所以查了部分优化项目编译时间的资料(当...
    Lucky_Man阅读 2,652评论 2 5
  • 一、以 Hello World开篇 Hello World对程序员而言肯定是如雷贯耳。但是简单的事物背后往往包含这...
    ZhengYaWei阅读 8,599评论 10 84
  • 编译与链接 代码运行背后的过程 经典C语言程序: Linux下,使用gcc来编译这个程序,进入命令行输入: 可以看...
    Cool_Pomelo阅读 240评论 0 0
  • 那时候总在想,馅料煮熟了,要怎么才能成个团,那样一口咬下去美滋滋的。 经过好多次的尝试,终于知道打水馅才是我需要的...
    木兰花2019阅读 158评论 0 1