编译型和解释型的区别
先来看看编译型语言定义:
编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。
再来看看解释型语言的定义:
解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。
咋看一眼,还是一脸懵逼。下面打个比方:
编译型和解释型的定义是对立存在的,但也可以在一个语言中同时存在。比如 java 语言同时兼有编译型和解释型特点。整个流程如下:
将源代码(.java 文件)编译生成字节码(.class 文件),再通过 JVM(java 虚拟机)运行生成机器指令,由机器运行机器码。注意,此处生成机器语言前的操作是解释型,每次运行都要重新解释。因此,此处表明 java 是解释型。
但是,部分 JVM(java 虚拟机)有一种 JIT(Just in time)机制,能够将部分已经解释翻译的常用机器指令保存。下次不需要解释,直接运行即可。此时 java 是编译型。
因此,现在用编译型和解释型区分语言是行不通的。
我们常说的动态语言和静态语言,其实是指动态类型语言和静态类型语言。先来看看动态类型语言:
动态类型语言,是指数据类型的检查是在运行时做的。用动态类型语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部记录数据类型。
再来看看静态类型语言的定义:
静态类型语言,是指数据类型的检查是在运行前(如编译阶段)做的。