编程语言类型


编程语言类型


正文

程序语言有好多种类型,如:编译型语言、解释型语言、动态类型语言、静态类型语言、强类型、弱类型、静态语言、动态语言等, 这些类型的概念和区别是什么,我们下面看一下。

概念定义

编译型语言:需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。

解释型语言:解释性语言的程序不需要编译,在运行程序的时候由解释器逐行翻译成机器码执行。

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

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

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

弱类型:弱类型语言也称为弱类型定义语言。变量会自适应地去匹配数据类型,某种程度上来说可以不关心变量的数据类型。

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

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

区别

强类型、弱类型、动态类型语言、静态类型语言之间,并没有直接的关联关系,看图:

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

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

编译型语言和解释型语言

1、编译型语言

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。 编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码, 不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

2、解释型语言

解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。 灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型语言

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。 比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码, 中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中, 下次直接执行(博友回复指出)。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。

Java先生成字节码再在Java虚拟机中解释执行。

严格来说混合型语言属于解释型语言。C#更接近编译型语言。

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

1、动态类型语言

很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。 动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行时改变结构,说的是代码结构。

动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。

主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、静态类型语言

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

主要语言:C、C++、C#、Java、Object-C。

3、注意:

相当一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。 这个也是错的。swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言。

强类型和弱类型

1、强类型语言:

强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。

主要语言:Java、C#、Python、Object-C、Ruby

2、弱类型语言:

数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。

主要语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)

3、注意:

一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。Python是动态类型语言,是强类型语言。 JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。

静态语言和动态语言

1、动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。 通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。

3、注意:

很多人认为解释型语言都是动态语言,这个观点是错的! Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。 反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。 得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。

C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。

举几个例子:

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();

高级语言和低级语言

最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果。 后来为了方便记忆,就将用0、1序列表示的机器指令都用符号助记,这些与机器指令一一对应的助记符就成了汇编指令,从而诞生了汇编语言。 无论是机器指令还是汇编指令都是面向机器的,统称为低级语言。因为是针对特定机器的机器指令的助记符, 所以汇编语言是无法独立于机器(特定的CPU体系结构)的。但汇编语言也是要经过翻译成机器指令才能执行的, 所以也有将运行在一种机器上的汇编语言翻译成运行在另一种机器上的机器指令的方法,那就是交叉汇编技术。

高级语言是从人类的逻辑思维角度出发的计算机语言,抽象程度大大提高,需要经过编译成特定机器上的目标代码才能执行, 一条高级语言的语句往往需要若干条机器指令来完成。高级语言独立于机器的特性是靠编译器为不同机器生成不同的目标代码(或机器指令)来实现的。 那具体的说,要将高级语言编译到什么程度呢,这又跟编译的技术有关了,既可以编译成直接可执行的目标代码, 也可以编译成一种中间表示,然后拿到不同的机器和系统上去执行,这种情况通常又需要支撑环境,比如解释器或虚拟机的支持, Java程序编译成bytecode,再由不同平台上的虚拟机执行就是很好的例子。所以,说高级语言不依赖于机器, 是指在不同的机器或平台上高级语言的程序本身不变,而通过编译器编译得到的目标代码去适应不同的机器。 从这个意义上来说,通过交叉汇编,一些汇编程序也可以获得不同机器之间的可移植性, 但这种途径获得的移植性远远不如高级语言来的方便和实用性大。






参考资料

解释型语言和编译型语言、弱类型语言和强类型语言、动态语言和静态语言的区别 https://www.cnblogs.com/nyw1983/p/11990488.html

一文理解静态语言、动态语言、解释型语言、编译型语言、强类型语言、弱类型语言… https://blog.csdn.net/weixin_36332394/article/details/115823412

弱类型、强类型、动态类型、静态类型语言的区别是什么? https://www.zhihu.com/question/19918532

编程语言的分类(编译型-解释型;动态类型-静态类型;强类型-弱类型) https://blog.csdn.net/aiming66/article/details/78570784


返回