什么是解释型语言?

什么是解释型语言?

看清解释,编译和语言的本质。解释和编译都只是程序从源码到运行时的一种动作,跟语言本身无关。

C语言,Java,Python等等这些编程语言本质上是一种抽象的定义,包括但不限于符号,语法,输入,输出的定义等等。

有了定义之后具体怎么实现,那就是百花齐放了。举几个例子。

C语言在很多人印象中就是编译型语言,而实际上TCC却可以解释运行C语言。

Orcale Java是将Java源码先编译成Java的字节码,也就是.class文件,这里有个编译的动作,然后将字节码装载到JVM中,逐条解释执行。

CPython同样也是如此,先将Python源码编译成字节码,有可能存到.pyc的字节码文件中,然后由解释器来解释执行字节码。

JavaScript早期则是将源码编译成语法树,然后直接执行语法树。

所以,首先,讨论执行动作应该针对具体的实现。

假如我要写个Python或者JavaScript的实现,会经过一个叫语法解析的阶段,这个阶段将语言的源码,转换成语法树。

其实这个过程也可以说是一个编译动作,将源码编译成语法树,JavaScript早期就是编译成语法树,然后直接解释语法树了,但直接解释语法树并不高效。

有的语言将语法树又编译成目标机器的机器码,比如C语言。

有的语言将语法书编译成虚拟机的字节码,从而获得跨平台的效果。比如Java和Python。

机器码基本上就可以一条一条的执行了,而字节码需要装载到虚拟机中,有的会直接解释执行,而有的也会部分编译成机器码保存起来(又是一个编译动作),比如JIT。

所以,其次,运行过程中动作其实很多,有的是编译动作,有的是解释动作。

通常来说,编译动作的翻译结果与用户写的源码想要的结果无关,是一个中间过程。对一段程序,在放入最终运行环境之前的翻译操作,都可以称为编译动作,比如编译成语法树,字节码,机器码。

虚拟机或者解释器启动之后,创建好了运行环境,然后逐条读入字节码,执行字节码,得到一个结果,最终输出就是源码想要得到的输出。

最后,用解释型或者编译型来分类一个语言,是完全不正确的。用来分类一个具体实现,也不完全合理。

---------- update -----------

对语言进行分类参考以下几个角度

Python是动态类型/强类型/脚本型/通用语言

C是静态类型/弱类型/非脚本型/通用语言

Java是静态类型/强类型/非脚本型/通用语言

JavaScript是动态类型/弱类型/脚本型/通用语言

Go是静态类型/强类型/非脚本型/通用语言

SQL是领域专用语言