编程语言分类

编程语言分类


根据运行模式区分

1.编译型语言(Compiled language)

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译把源代码编译成机器码,链接把各个模块的机器码和依赖库串连起来生成可执行文件。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
代表语言:C、C++、Pascal、Objective-C、Swift。

2.解释型语言(Interpreted language)

利用解释器,在运行期,动态将代码逐句解释(interpret)为机器代码,或是运行预先编译为机器代码的的子程序,之后再运行。
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby。

3.动态编译语言(即时编译器)

动态编译语言一句一句编译源代码,同时将翻译过的代码缓存起来以降低性能损耗。相对于普通的静态编译型语言,动态编译语言的代码可以处理延迟绑定并增强安全性。即时编译器有两种类型,一是字节码翻译,二是动态编译翻译。微软的.NET Framework,还有绝大多数的Java实现,都依赖即时编译器以提供高速的代码执行。
JAVA将源代码编译生成字节码(.class 文件),再通过JVM(java 虚拟机)运行生成机器指令,由机器运行机器码(解释型)。JVM有一种JIT(Just in time)机制,能够将部分已经解释翻译的常用机器指令保存。下次不需要解释,直接运行即可(编译型)。
C#在编译的时候不是直接编译成机器码而是中间代码(Microsoft Intermediate Language),然后通过语言运行库(.NET Framework虚拟机)执行。在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
代表语言:Java,C#。


根据运行时代码状态区分

1.动态语言(Dynamic Programming Language)

是在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。
代表语言:Objective-C、JavaScript、PHP、Python、Erlang、Ruby、C#(4.0+)。

2.静态语言

与动态语言相对应的,还有一些运行时结构不可变的语言。
代表语言:Java、C、C++、Scala。

注意:

类型检查可发生在编译时期(静态检查)或运行时期(动态检查)。
动态语言不完全是解释型语言,C#、Objective-C是动态语言,同时是编译型语言,即时编译语言。
动态语言不完全是动态类型类型语言(TypeScript)。
静态语言完全是静态类型语言。


根据数据(变量)类型检查时机区分

1.动态类型语言(Dynamically Typed Language )

运行时才去做数据类型检查和数据类型绑定的语言。
动态类型语言在运行时,经由运行路径、变量被赋予的值,通过推断类型机制(鸭子类型,Duck typing),调度变量获得不同的类型标记。
代表语言:Swift、PHP、Python、Ruby、Erlang、JavaScript、Perl。

2.静态类型语言(Statically Typed Language)

运行前(如编译阶段)做数据类型检查的语言。
编写代码的时候要明确变量的数据类型,一个静态类型的编程语言,是在运行时期和编译时期之间的处理阶段下重视这些区别的(crash在编译和运行之间)。
但是,大多数的静态类型语言都有强制类型转换的语言后门(宣告类型(强制转换))可用。
代表语言:C、C++、C#、Java、Objective-C。

3.依存类型语言

如果一个编程语言破坏了阶段的区别,因而类型检查需要测试运行时期的表达式的等价性,该语言即为依存类型的。
代表语言:Idris。

注意:

动态类型语言是一类关注、捕捉运行时类型错误的语言。
解释型语言不都是动态类型语言,Swift是编译型语言但是它也是动态类型语言。
编译型语言不都是静态类型语言,C#和Java是解释型语言也是静态类型语言。


根据数据类型严格程度区分

1.强类型语言:

强类型语言禁止错误类型的变量继续参与运行。
一旦一个变量被指定了某个数据类型,如果不经过显式转换类型(宣告类型(强制转换)),那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。
代表语言:Java、C#、Python、Objective-C、Ruby。

2.弱类型语言:

弱类型意指一个语言可以隐式转换类型(或直接宣告类型(强制转换))。
一个变量可以赋不同数据类型的值,若给整型变量A赋一个字符串值,那么A就变成字符类型。
代表语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)。
注意:一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。

你可能感兴趣的:(编程语言分类)