编译 VS 解释

392 阅读3分钟

计算机如何看懂代码

这涉及到编译器的知识,大学学过的基本上都忘了,但只需要知道,我们写的代码都是人类看得懂的,全都是什么function、 if、for、等等,那计算机如何看得懂呢?这就需要一个翻译,将人类写的高级语言(人类能看懂的语言)翻译成计算机能看懂的机器代码(Machine code),完成这个任务的就是编译器。

下面就是编译器的工作流程:

源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(linker)→ 可执行文件(executables),最后打包好的文件就可以给电脑去判读运行了。

更轻便的语言——脚本

传统上的编程语言,例如C、C++、C# 、Java等的编写和运行过程都是十分繁琐,而脚本语言则不同。 看看维基百科对脚本语言的描述:

脚本语言(英语:Scripting language)是为了缩短传统的“编写、编译、链接、运行”(edit-compile-link-run)过程而创建的计算机编程语言。一个脚本通常是解释运行而非编译。—— 维基百科

脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。想想JavaScript不就是这样吗?写完后直接扔给浏览器就可以运行看到结果。

脚本语言是不需要显示编译步骤的编程语言。一般情况下,非脚本语言必须先经过编译,然后再执行,例如C语言。而脚本语言通常在运行前是不需要编译的,直接解释运行。

编译 VS 解释

脚本语言通常是解释运行的,而不需要通过编译,那么编译和解释到底有什么区别呢?

  • 编译: 代码要运行在机器上,必须经过编译器编译生成可执行的目标文件。例如C语言经过编译生成可执行的目标文件,这个目标文件是直接针对底层的,会被CPU直接读取执行的。所以,如果这个程序需要在另外一种CPU上面运行,这个代码就必须重新编译。

  • 解释:对于一些非编译型语言(例如JS),同样也可能存在某种编译过程,但他们编译生成的通常是一种『平台无关』的中间代码,这种代码一般不是针对特定的CPU平台,他们是在运行过程中才被翻译成目标 CPU 指令的。

小结:

编译型语言在编译过程中生成目标平台的指令

解释型语言在运行过程中才生成目标平台的指令。

Javascript 是脚本语言?

看看MDN上是怎么说的:

JavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。

是不是很迷,那他到底是什么语言? 我觉得,纠结这些概念本身是不重要的,概念是人给出的概括性的表达,而语言也是一直在发展中的。 在现在,脚本语言和非脚本语言之间其实并没有明确的界限,V8是谷歌Chrome中的JavaScript引擎,并且在浏览器之外也经常使用,它实际上将JavaScript代码动态编译成机器代码,而不是解释它。编译型和解释型语言的不同指出只是在于,这些过程发生的时机不一样。