编译器构造阅读笔记(1)导论入门

116 阅读3分钟

编译器是现代计算技术的基本组成部分,它们担任翻译器的角色,将面向人的程序设计语言转换为面向计算机的机器语言。

它可以被看作为是一个黑箱,执行着如下的转换。

在这里插入图片描述

最早的编译器是 20 世纪 50 年代的 FORTRAN 编译器,他们为用户提供了一个面向问题的编程语言。

第一个 FORTRAN 编译器花费了 18 个人年(注意,人年不是年)

名词:人年
与一般的计算年份月份的方式不一样,人年是一种衡量工作量的单位。
想要理解人年,可以从理解人月入手

假如一个项目团队,在项目的前期,雇佣 3 个人 开发了 4 个月,在项目的中期,雇佣 2 个人开发了 3 个月,而在最后阶段只雇佣 1 个人开发了 1 个月
那么最后的人月就是:3 * 4 + 2 * 3 + 1 * 1 = 17 个人月

人年的计算方式,也与这个差不多

有一本书,叫做《人月神话》,专门就用来描述工作量的管理问题

区别编译器的一个方面在于它们生成的目标机器代码的格式,目标机器格式一共有三种类型。

  • (1)汇编语言格式

以 C语言编译器 gcc 为例,它会将我们的 C语言 代码转换为 汇编语言 代码。

  • (2)可重定位的二进制代码格式

还是以 gcc 为案例,在完成由 C语言 向 汇编代码 的转换之后,它会将我们的汇编语言代码交付汇编器进行构建,而在汇编器处理完成以后,就会生成构建出一个“可重定位二进制为”文件。

按照潘爱民老师的说法,这生成出来的文件,已经与可以正式运行的二进制格式文件,没有结构上的太大区别,有的,只是内存地址的布局与定位(内存地址是逻辑的,因为在现代操作系统上,普通的应用程序不应该直接拥有访问物理地址的权限)

  • (3)内存映像模式

这种模式我还不是很理解,因为我并没有接触过这方面的编译器。
可能 SQL 属于这一类。
所以我计划去询问一番,到 postgres 社区去问。


和编译器形成对比的地方在于,解释器将程序当成了可以任意操作的数据。
换而言之,解释器掌握了关键的一切。
这就意味着:

  1. 在执行过程中可以面向用户程序进行修改,或者面向用户程序添加代码
  2. 对象所代表的类型,可以动态的改变
    这是因为,在编译型的语言之中,我们事先不能知道输入数据的类型,而在解释语言之中,解释器可以实时识别出来
  3. 机器无关性质
    解释器就是某种意义上的具体问题具体分析
  4. 更好的错误诊断信息
    这很自然,亲自在一线作战的解释器,肯定比幕后指挥的编译器能够更多的掌握到一线的信息
  5. 解释器具有更大的性能开销与空间开销