编程语言的类别
目前的工作中,已经学习到了三种语言,Java,JS,Python。在说到这些语言时,经常会听到别人对它们的不同称呼,例如说Java是静态语言;Python、JS是脚本语言;Java是强类型而Python、JS是弱类型;Python、JS是解释型语言等。很好奇这些分类到底是怎么划分的,在查阅相关资料后对这些语言类别做了一些整理和归纳。
其实看了一些文章后才知道,这些语言的类型划分并不存在一个严格的定义,大多都是众人口传口的一种说法。所以下文的分析也只能保持一定程度的参考性,只为了更好的理解语言之间的区别。
编译型语言、解释型语言
编译或解释不是语言的特性,而是实现的特性。 所以广义上的编译和解释的区分,在于语言偏向用哪一种方式实现。所以如果你写了一个C语言的解释器的话,也可以让C直接解释执行了。在R大的这篇文章中可以看到编译与解释在一定程度上的区别:采用编译和解释方式实现虚拟机最大的区别就在于是否存下目标代码:编译的话会把输入的源程序以某种单位(例如基本块/函数/方法/trace等)翻译生成为目标代码,并存下来(无论是存在内存中还是磁盘上,无所谓),后续执行可以复用之;解释的话则是把源程序中的指令逐条解释,不生成也不存下目标代码,后续执行没有多少可复用的信息。
静态语言、动态语言
动态语言在运行时进行类型检查,在编写代码的时候可以不指定变量的数据类型,比如Python、JS。而静态语言例如C、Java,它们的数据类型是在编译期确定的,所在声明变量的同时要显式地写清数据类型,这样的好处是可以提前检查出程序中可能出现的类型错误。
强类型、弱类型
强弱类型指的是语言的类型系统对类型检查的严格程度。弱类型允许变量类型的隐式转化,而强类型一般不允许这样做。其实这也是和语言的主流编译器有关系的,Python被称为强类型,因为CPython在运行期检测到类型错误时,程序会中断执行。
脚本语言
脚本语言也是一个常常听到的名词。它给我的感觉就是方便快捷,不一定像一门编程语言一样有复杂的设计、严谨的语法和规则。例如我们在Linux中为了自动化部署程序写的shell脚本,在windows里执行批任务的vbs脚本。脚本语言是最松散的类型定义,完全没有类型声明,并且在运行时进行动态类型检查。脚本语言可以是交互式的,这样完全将编译过程从编辑-编译-运行循环中去掉了。脚本语言在易用性的优势让它的执行速度比系统语言慢了很多。它的代码可以以源代码的方式发布执行,虽然Python也有编译的步骤,但大多数情况直接接受源代码,而不是编译后的文件。
参考:
知乎-弱类型、强类型、动态类型、静态类型语言的区别是什么?
RednaxelaFX-虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩
知乎-Java 是编译型语言还是解释型语言?