解释型和编译型语言的区别

语言之间因为不同的导向有了区别,及其建立在这种区别上的优劣势

有了优劣势就又会有使用环境的差别

啥是编译,啥是解释

  1. 编译就是翻译,就像很多英语著作被翻译成汉语一样,其目的是让中国的阅读者理解;此时看不见的第三方就是编译程序

    以c语言为例,其编译过程就是将c语言翻译成汇编语言,这一能够被机器识别的底层语言,再由机器转换成二进制。

    以下内容拷贝自《C+Primer+plus》:

    典型的C实现通过编译和链接两个步骤来 完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。

    中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码, 但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代 码,这还不是一个完整的程序。 目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。例如,可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是Windows和 Linux所需的启动代码不同,因为这些系统处理程序的方式不同。

    目标代码还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。例如,concrete.c中就使用了 printf()函数。目标代码文件并不包含该函数的代码,它只包含了使用 printf()函数的指令。printf()函数真正的代码储存 在另一个被称为库的文件中。库文件中有许多函数的目标代码。 链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码这 3 部分合并成一个件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来。

    简而言之,目标文件和可执行文件都由机器语言指令组成的。然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。

  2. 解释就像面对面说话一样,是及时性的,说话的过程中予以解释。此时的第三方就是解释程序

    以phton为例:Python首先先把代码(.py文件)编译成半成品的字节码,然后将其交给虚拟机,虚拟机一条一条将字节码指令翻译成cpu可识别的机器指令交由CPU执行,从而完成程序的执行。

    字节码:字节码是一种中间状态(中间码)的二进制代码,就是将数据类型,数据结构,方法等按照规则进行编译。不能直接被CPU执行,需要直译器转译后才能成为机器码。

    执行步骤:

    第一步:python解释器启动,此时就相当于启动了一个文本编辑器
    第二步:从硬盘上将test.py的文件内容读入到内存中并翻译为字节码
       注意:解释器只关心文件内容,不关心文件后缀名
    第三步:python解释器解释执行刚刚加载到内存中test.py的代码

优缺点

很明显,这两种类型划分,就是因为从代码到机器码的转换方式不同

编译型语言:

​ 程序只要经过编译器编译之后,每次运行程序都可以直接运行,不需要再次’翻译’
  优点:执行速度快,编译后的目标文件(保密性高)
  缺点:可移植性差,修改不便

解释型语言
解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行,即解释一条代码,执行一条
  优点:可移植好,便于程序员改错
  缺点:执行一次翻译一次

可执行文件

可执行文件有两个部分,一个是文件头,记录可执行文件的一些相关的资料;另一部分是内存影像,就是CPU可以直接执行的二进制指令,绝对不是中间代码。

脚本

脚本(Script),是使用一种特定的描述性语言,依据一定的格式编写的可执行文件

脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解释或者编译。

建立在各种编程语言之上,各种后缀名的文件都能被称之为脚本,在我看来脚本的之所以被称之为脚本而不是程序,就是因为它所具有的特点或者说实现的功能,或者说脚本就是程序的一个子集。

一般的特性:

  1. 脚本是普通的文本文件,是批处理文件

  2. 脚本导演了一个序列事件的发生

  3. 脚本让一个例行任务效率大幅提升

高级语言为什么不直接编译成机器码,而编译成汇编代码?

1.一般的编译器,是先将高级语言转换成汇编语言(中间代码),然后在汇编的基础上优化生成OBJ目标代码,最后Link成可执行文件。

2.高级语言为什么不直接编译成机器码,而编译成汇编代码?

1)其中有一个好处是方便优化和调试,因为编译器也是工具,也是机器,毕竟是机器生成的程序,不可以非常完美的,而汇编是机器指令的助记 符,一个汇编指令就对应一条机器指令(特殊指令除外),调试起来肯定会比机器指令方便的方便,这样优化起来也方便。

2)高级语言只需要编译成汇编代码就可以了,汇编代码到机器码的转换是由硬件实现即可,有必要用软件实现这样分层可以有效地减弱编译器编写的复杂性,提高了效率.就像网络通 讯的实现需要分成很多层一样,主要目的就是为了从人脑可分析的粒度来减弱复杂性。

3)如果把高级语言的源代码直接编译成机器码的话,那要做高级语言到机器码之间的映射,如果这样做的话,每个写编译器的都必须熟练机 器码。这个不是在做重复劳动么?