为什么需要编译?
编译器的作用便是把我们的高级编程语言通过一系列的操作转化成可被计算机执行的机器语言
编译器和解释器
编译器是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的形式被称为目标代码(object code)。
解释器是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,并不会把源代码预编译成机器码。
编译器在语言处理的位置
预处理器:把存储在不同文件中的源程序聚合在一起。 把宏的缩写语句替换为源程序。
可重定位:汇编生成的机器代码,在内存中放的起始位置L 不固定.代码中的所有地址都是相对于L的相对地址。起始位置+相对地址= 绝对地址。
加载器:修改可重定位地址,将修改后的指令和数据放到内存中适当的位置
链接器:链接其他编译好的库文件或可重定位的目标程序,生成可执行代码。(外部内存地址的问题)
编译系统的结构
人工翻译语言的过程
人工英汉翻译:
语义分析
识别出句子短语
语法分析
语法分析,识别出句子短语,得到句子结构
词法分析
确定词性
1、分析源语言
语义分析
分析核心的谓语动词 broke 入手(打,谁打,为什么打、打谁、打的结果等等)。 这些信息可以分析broke的上下文获得。找到 主语 he 动作的实施者,宾语window动作的受施。with a hammer 补语。 in the room,状语。
(四个实体与核心谓语动词的关系)
根据图的中间表示
中间表示不仅适应英语。所有语言都可以用这个中间表示来分析。
语义分析:1、划分句子成分 (语法分析)(主语&宾语 一般由名词短语构成 、状语&补语:介词短语构成) 2、识别短语 通过词性(词法分析)。(冠词a、名词window =>名词短语 ,介词with 、冠词a 、名词hummer =>名词短语 )
词法分析(确定词性)----> 语法分析(识别各类短语,得到句子的结构) ----> 语义分析(根据短语确定句子成分,各成分与谓语动词语义关系)
句子分析过程: 词法分析 --> 语法分 --> 语义分析
2、生成标语言,目标语言说出句子。
翻译成汉语 ==> 在房间里,他用锤子砸了一扇窗户。
编译器分析过程
在编译器的实现过程多个阶段可能放在一起实现。 语法制导翻译 (Syntax Directed Translation) :语法分析 和 语义分析结合在一起。
Xcode编译器发展简史
Xcode3 :以前: GCC;
Xcode3: 增加LLVM,GCC(前端) + LLVM(后端);
Xcode4.2: 出现Clang - LLVM 3.0成为默认编译器;
Xcode4.6: LLVM 升级到4.2版本;
Xcode5: GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成
LLVM 编译器
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由美国UIUC(伊利诺伊)大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。
LLVM 是一个总括项目,承载并开发了一组紧密结合的低级工具链组件(例如,汇编器,编译器,调试器等),这些组件被设计为兼容的。
尽管LLVM提供了一些独特的功能,并且以其一些出色的工具而闻名(例如,Clang编译器,C / C ++ / Objective-C编译器,它比GCC编译器具有许多优势),但它是LLVM与其他编译器不同的是其内部体系结构。
经典编译器设计
传统静态编译器(如大多数C编译器)最受欢迎的设计是三相设计,其主要组件是前端,优化器和后端
优化器负责进行各种转换以尝试改善代码的运行时间,例如消除冗余计算,并且通常或多或少地独立于语言和目标。然后,后端(也称为代码生成器)将代码映射到目标指令集。除了编写正确的代码外,它还负责生成利用受支持体系结构异常功能的良好代码。编译器后端的常见部分包括指令选择,寄存器分配和指令调度。
该模型同样适用于解释器和JIT编译器。Java虚拟机