一文理解静态语言、动态语言、解释型语言、编译型语言、强类型语言、弱类型语言

3,582 阅读6分钟

引言

想必在面试过程中,大家都会被问起,xxx语言,是强类型还是弱类型?是静态语言还是动态语言?是编译型语言还是解释型语言?我猜绝大多数同学,都是通过死记硬背来回答这道题的。其实,要理解这些概念并不困难,对于熟悉的语言,结合平时工作中的经验,就能很快的确定语言分类。废话不多说,且听我一一道来。

写在前边

如果笔者的理解与释义有错误或者误解的地方,请各位在评论中指出,笔者一定及时更正。

ps:没有找到特别好的定义来源,所以一部分定义引自百度百科,一部分定义取自网络释义,笔者加入了一定的个人理解,各位看官参考就好。

编译型语言和解释型语言

定义

编译型语言

编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。

解释型语言

解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。

解析

从程序的运行本质上来讲,无论是编译型语言还是解释型语言,都会经过如下过程

源代码->中间代码->机器码->运行得到结果

而编译型语言和解释型语言两者的区别,只是在于这些过程发生的时机不同。

对于编译型语言来说,在真正运行前,就已经翻译出了底层平台可以运行的机器码,真正运行时,只需要把翻译产物交给底层平台运行即可,非常直观。这样带来的缺点很明显,每更换一个平台,每次代码逻辑的修改,就需要重新编译一份机器码,未免显得过于繁琐。但同时带来的优点也不容忽视,机器码的执行效率非常高,可以极大地提高程序的运行速度。典型的有C、golang等。

对于解释型语言来说,在真正运行前,最多只会进行到生成中间代码这一步,甚至可能连中间代码也不会生成,只有在真正运行时,才会去翻译成机器码,交给底层平台执行,从而得到结果。不难看出,解释型语言可以省略复杂的步骤,只需要将源代码交给代码的执行引擎,所有的修改都可以实时地得到反馈,可以极大的提高开发效率,但是相对的,由于每一次执行都需要经过翻译的过程,所以程序的执行性能会损失不少。典型的有PHP、js、python等。

举一个之前某个大神总结的通俗易懂的例子:

  • 编译型语言就像做一桌子菜然后再吃。
  • 解释型语言就像吃火锅,原料准备好后,边做边吃。

已经做好的一桌子菜,可以很快地食用,但是想再做加工的话就比较困难了。火锅吃起来就随意得多,想吃什么菜,想用什么锅底,想蘸什么料,可以随时调整,但是相应的,需要等待更长的时间。

强类型语言和弱类型语言

定义

强类型语言

强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。

弱类型语言

弱类型语言也称为弱类型定义语言。与强类型定义相反。

解析

强类型,简单来说就是,一个已经被指定了数据类型的变量,除非是经过强制类型转换,否则无法被赋值为其他类型的数据。弱类型则相反,变量会自适应地去匹配数据类型,某种程度上来说可以不关心变量的数据类型。

强弱类型与下一节的内容放在一起,对比说明效果会更好,所以这里不再做过多赘述.

动态类型语言和静态类型语言

其实目前我们日常所说的动态语言、静态语言,全称应该是动态类型语言、静态类型语言,只不过在知识传递的过程中,叫法出现了一些偏差,导致叫法变得不严谨,各位一定要注意,这里如果在面试过程中可以进行说明,相信会给面试官留下一个很好的印象。实际上,动态语言、静态语言是有其本身的定义的,我们稍后做出说明。

定义

动态类型语言

动态类型语言是指在运行期间才去做数据类型检查的语言,把类型绑定延后到了运行阶段。

静态类型语言

静态类型语言的数据类型是在编译期间确定的,或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。

解析

定义其实已经解释得比较清楚了,用一句话总结一下

Static typing when possible, dynamic typing when needed。

这里想结合强弱类型说明一下,很多同学会很自然地认为强类型语言即为静态类型语言,反过来,弱类型语言即为动态类型语言,其实这个理解是错误的,直接上图:

四种类型对比
从图中可以很明显地看出,强类型、弱类型、动态类型、静态类型之间,并没有直接的关联关系,具体语言要根据特性具体分析。

其实还有一种误区,关于编译型语言、解释型语言、静态语言、动态语言,部分同学会认为编译型语言都是静态语言,解释型语言都是动态语言。简单举几个例子,swift是编译型、动态类型、强类型语言,C#是解释型、静态类型、强类型语言。

所以不难看出,数据类型间并没有什么绝对的关联关系,这里大家需要注意。

动态语言和静态语言

定义

动态语言

程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等,在结构上的变化。

静态语言

与动态语言相对,在程序运行时,结构不能发生改变。

解析

这里举几个例子就可以理解了,主要是帮助大家区分动态语言、动态类型语言、静态语言、静态类型语言之间的区别。

PHP

<?php
    $a = new A;
    $a->test = function() {};
    $a->test();

JS

person = new Person();

person.hello = function(){
  alert('hello world');
}
person.hello();

//删除方法
delete person.hello;
person.hello();

动态语言、静态语言,指的是代码结构,动态类型语言、静态类型语言,指的是数据类型。