编译器是现代计算技术的基本组成部分,它们担任翻译器的角色,将面向人的程序设计语言转换为面向计算机的机器语言。
它可以被看作为是一个黑箱,执行着如下的转换。
最早的编译器是 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 社区去问。
和编译器形成对比的地方在于,解释器将程序当成了可以任意操作的数据。
换而言之,解释器掌握了关键的一切。
这就意味着:
- 在执行过程中可以面向用户程序进行修改,或者面向用户程序添加代码
- 对象所代表的类型,可以动态的改变
这是因为,在编译型的语言之中,我们事先不能知道输入数据的类型,而在解释语言之中,解释器可以实时识别出来 - 机器无关性质
解释器就是某种意义上的具体问题具体分析 - 更好的错误诊断信息
这很自然,亲自在一线作战的解释器,肯定比幕后指挥的编译器能够更多的掌握到一线的信息 - 解释器具有更大的性能开销与空间开销