Compiler Language

2022-06-29
5分钟阅读时长

计算机系统层次结构

  1. 微程序级 本级的语言是微指令集,使用微指令编写微程序,由硬件执行。微命令→微指令→微程序
  2. 传统机器级 本级的语言是指令集,可以使用微程序翻译并运行程序。
  3. 操作系统级 管理软硬件资源,提供用户与系统交互的接口。
  4. 汇编语言级 本级的语言是汇编语言,完成汇编语言在不同平台的具体翻译与实现工作。
  5. 高级语言级 本级的语言是高级语言,使用编译或解释程序完成翻译工作。

高级编程语言

高级语言特性

  • 指令更加抽象而不具体(封装)
  • 程序可移植性得到提高(编译器跨平台,目标机对应的编译器的帮助下完成移植)
  • 面向过程、面向对象、面向切面(编程思想)

语言理念与特点

计算机语言处理两个概念,数据和算法。

  1. C 结构化编程技术反应了过程性编程的思想,开发模块完成各个任务。便于编写和阅读,便于修改与维护,提高了可靠性,保证了质量。 自顶向下规划,结构化编程,模块化设计。 面向过程,强调算法。
  2. C++ 面向对象编程试图让语言满足问题的要求,即设计与问题本质特性相对应的数据格式。 面向对象,强调数据,信息隐藏。
  3. C/C++与其他高级语言相比的优点

    1. 高效性,程序运行速度快
    2. 粒度细,提供了相当程度的自定义性和控制,涉及指针、内存管理,需要承担更多的责任

软件过程

翻译程序与解释程序

翻译是将一种语言(源语言)翻译成等价的,用另一种语言(目标语言)编写的程序。若指代的是从高级语言向机器语言翻译,则称为编译。 解释是通过直接利用用户的输入执行源程序中的指定操作,特点是一边解释一边执行。

编译型语言与解释型语言

编译型语言

使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。即一次编译,终身执行。

解释型语言

使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。即每次运行,每次解释。

主要区别

前者源程序编译后即可在该平台运行,后者是在运行期间才编译。 编译程序 运行速度快 ,解释程序跨平台性好, 错误诊断效果好

应用举例

编译型语言:由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用前者; 解释型语言:网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言。 例如,C语言是编译型语言;Python 则是解释型语言。

编译程序

编译阶段包括三部分:编译,汇编,链接

  1. 编译的任务 是高级语言转换为汇编语言 其可细分为:编译预处理、词法分析、语法分析、语义分析、中间代码产生、机器无关与相关优化、目标代码产生等。 主要是进行词法分析和语法分析。
  2. 汇编的任务 是将汇编语言转换为机器语言
  3. 链接的任务 是将源文件中用到的*库函数*与汇编生成的*目标文件*合并,同时将多个目标文件链接生成可执行文件。

静态链接与动态链接

静态链接

链接器在链接时将库文件或目标文件的内容加入到可执行程序中的做法。 优点:

  1. 代码装载速度快,运行略快;
  2. 静态依赖包含在发布的二进制程序中,不需要额外环境;

缺点: 生成的可执行文件体积较大,包含相同的公共代码,造成浪费。

动态链接

动态链接将链接的过程推迟到了运行时再进行。 优点:

  1. 生成的可执行文件小;
  2. 适合大规模软件开发,开发耦合度小;
  3. 链接库可以相互共享,链接库与可执行文件独立,提高可维护性和可扩展性;

缺点:

  1. 需要依赖外部动态链接库;
  2. 速度较慢;

程序开发

  1. 定义程序的目标 类似软件过程中的 需求分析 ,明确程序目的,输入,算法,输出。
  2. 设计程序 类似软件过程中的 概要设计 ,执行逻辑、数据处理、界面显示等
  3. 编写代码 类似软件过程中的 详细设计 与编码,把设计的内容翻译成 C 语言。
  4. 编译 该步是文件由代码变成程序最重要的一步。
  5. 运行
  6. 测试与调试 类似软件过程中的测试,测试可以理解为设计提供的输入并分析得到的输出;调试则是在分析测试过程中代码段的内在逻辑和数据的变化规律等。
  7. 维护及修改 类似软件过程中的维护与再工程。

术语提要

  1. 源代码文件 就是用户编写的代码文件;
  2. 可执行文件 就是最终生成的程序;
  3. 中间代码文件 即 C 源代码文件转换为最终可执行文件过程中生成的代码文件,或称为过程文件;
  4. 目标代码文件 即编译器编译后得到的代码文件,注意:<u>中间代码文件包括目标代码文件</u>,当然也包括其他的一些文件,即目标代码文件是中间代码的子集(大部分情况下是真子集);
  5. 库文件 是 C 语言提供的一些提前准备好的代码文件,库文件包含许多现成可用的代码。库文件包括静态链接库和动态链接库,静态链接库的文件会被包含在最终生成的可执行文件中;动态链接库文件则只会在执行时与可执行文件进行链接。 C 编程的基本策略是把 源代码文件 转换为 可执行文件 。如前所述,典型的 C 通过编译、链接完成这个过程(汇编可以看作编译的一部分)。
  6. 编译器 的作用是把 源代码 转换成 中间代码 。 C 使用上述这种分而治之的办法以对程序实现模块化,例如可以独立编译单独的模块,稍后用链接器合并已编译的所有模块。通过这种方式的优点在于如果只更改某个模块,不必因此重新编译其他的模块。
  7. 中间代码 或者说中间文件,具有很多种形式,最普遍的形式,即把源代码转换得到的机器语言代码,并把转换的结果放在目标代码文件中。此时中间代码指代 目标代码文件
  8. 目标代码文件缺失 启动代码 。启动代码充当着程序和操作系统之间的接口。
  9. 目标代码文件也许还缺失 库函数 ,几乎所有的 C 程序都需要使用 C 标准库中的函数,部分程序还需要非标准库中的库函数。库文件中包含许多函数的目标代码(当然也包括它们的源代码)。
  10. 链接器 的作用是把中间代码和其他代码还有预编译的库代码合并成为可执行文件。