OC编译器编译源代码的一般流程是:接收源文件,然后将它们转换为能够在目标平台上执行的文件
包括:词法分析、语法分析、生成代码和优化、汇编与链接,最终生成二进制文件
词法分析:源代码被拆分为多个记号,每个记号都是一个独立的元素
语法分析:会检查正确语法的记号,并检查它们所构成表达式的合法性,
目的是:通过记号创建抽象语法树(AST)或层次分析树
生成代码和优化:AST用于生成输出语言代码,输出语言可能是机器语言,也可能是中间语言表示(IR)
优化后代码的功能不会改变,但性能更好,体积更小
汇编阶段:会接收上一处理阶段生成的代码,并将它们转换为在目标平台上可执行的机器代码
链接阶段:汇编程序输出的一段或多段代码会被合并成 为一个独立的可执行程序
预处理器是在词法分析阶段发挥作用的。
预处理器根据一系列预定义的规则,使用一些字符串序列替换输入的字符序列
操作顺序如下:
- 文本翻译:预处理器会先将输入的源文件拆分成代码行、使用单个字符替换三字母组合。将被断开的连续行合并为较长的代码行和使用单个空格替换注释。(三字母组合是指c语言中用来代表单个字符的三字符序列)
- 记号替换:预处理器将上一步骤处理过的代码转换为记号序列
- 基于与处理器语言的转换:如果记号序列中含有预处理语言元素,就会根据这些记号进行转换
前两个操作是自动的,后一个是由添加到源文件中的预处理器语言函数执行的。
预处理器语言:定义了预处理器指令和宏展开
预处理器指令:
头文件包含:#include 、#import
区别:#import可以确保头文件仅在源文件中被包含一次,因而能够防止递归包含
条件编译:#if、#else、#elif、#endif、#ifdef、#ifndef
诊断:#error、#warning、#line
- #error “错误消息”:
通常用于处理条件编译错误,例如:
#ifndef INPUT_ARGS
#error “No input arguments provided"
#endif
- #warning:指令可以生成编译时警告信息,但允许编译器继续进行编译
- #line:指令可以在编译器消息中添加行号。当编译出错时,编译器会显示含有出错文件名称和相应行号
#progma指令
使用#progma指令可以设置超出OC语言范畴的、额外的编译器选项。
宏
宏是指:有名称的代码段,当在源代码中使用某个名称时,其代表的代码段就会替换它。