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