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

引言

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

写在前边

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

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

编译型语言和解释型语言

定义

编译型语言面试

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

解释型语言bash

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

解析

从程序的运行本质上来说,不管是编译型语言仍是解释型语言,都会通过以下过程函数

源代码->中间代码->机器码->运行获得结果
复制代码

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

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

对于解释型语言来讲,在真正运行前,最多只会进行到生成中间代码这一步,甚至可能连中间代码也不会生成,只有在真正运行时,才会去翻译成机器码,交给底层平台执行,从而获得结果。不难看出,解释型语言能够省略复杂的步骤,只须要将源代码交给代码的执行引擎,全部的修改均可以实时地获得反馈,能够极大的提升开发效率,可是相对的,因为每一次执行都须要通过翻译的过程,因此程序的执行性能会损失很多。典型的有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();
复制代码

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

相关文章
相关标签/搜索