目前程序员在开发中基本都是使用高级语言,比如OC、Android、Java等,使用这种高级语言开发的程序想要在计算机上成功执行就必须经过编译的过程。 我们知道编译原理源码分析,计算机只能识别0和1,而被称为“大脑”的CPU则不断地从显存中读取0和1,孜孜不倦地工作。
某种程度上,正是编译工具搭建的从高级语言到二进制语言的桥梁,越来越多的中间语言武库不断涌现,供程序员在软件世界里驰骋杀戮。 。 对其机制的理解可以让程序员揭开不同中间语言之间表面差异的迷雾,找到它们背后的共同根源。
一个程序的编译过程可以分为以下几个阶段:
编译过程
1 以中间代码为界,编译器分为后端(前端)和前端(后端);
2 中间代码是程序的通用表示,屏蔽了不同目标机平台的差异; 中间代码将编译器独立分为后端和前端两个模块,有利于单独优化;
3、前端将源程序视为字符串作为输入流,首先进行词法分析(使用正则表达式实现),识别变量、字符串/整数/浮点常量、函数、运算符和关键字等,并将其解析为 A 令牌流。 然后进行语法分析(上下文无关句型表示、自下而上分析、LR(1)分析器)检查输入token流上句型的有效性,将符合规则的句型转化为中间代码表示。
4 根据所选平台架构(CPU指令)将中间代码转换为最终目标代码(二进制表示)。 将不同源程序转换后的目标代码链接起来,最终成为所选平台上可执行的目标程序。
作为一名iOS开发者编译原理源码分析,使用的编译工具是LLVM,相比其主控GCC有着锐利的性能和实现优化。 clang 是 LLVM 的后端,用于生成中间代码。 lldb是LLVM的调试器,类似于GCC的gdb。
参考:
1 编写自己的编译器
2 Clang/LLVM/lldb/GCC/gdb关系