参考网上的一些资料外加自己的理解整理出的有关几种概念的区分。
首先看张图:
一、编译型语言,解释型语言,混合型语言
1、编译型语言
程序源码通过编译器生成机器码,接着通过链接将机器码与依赖库链接起来生成可执行程序。
优点 :
源码只需要通过一次编译生成可执行程序,后续的运行只需要通过可执行程序即可,程序运行效率较高。
缺点
由于源码在进行编译的过程中,生成机器码根据操作系统的不同会不一样,所以编译型语言依赖于编译时的操作系统,更换不同型号的操作系统或者更改源代码时,需要重新编译。程序的可移植性较差。
实例
C、C++、Pascal、Object-C
2、解释型语言
程序源码不需要经过编译,只需要解释器进行翻译即可执行。
优点
源码运行过程中不依赖于平台,程序的可移植性较好,且每次解释器进行解释时都会对代码进行优化。
缺点
源码每次运行时都需要进行一次解释,程序的运行效率差。
实例
JavaScript、Python、Erlang、PHP、Perl、Ruby
3、混合型语言‘
编译型语言与解释型语言有利有弊,那这个时候就出现了一种混合型语言,结合了编译型语言的一次编译的优点与解释型语言的可移植性的优点。源代码通过编译生成中间码(与机器码不同),然后通过解释器将中间码生成可执行程序
实例
Java,C#
二、动态语言、静态语言
1、动态语言
在程序的运行过程中可以进行换源代码结构的修改,例如插入新的对象,类等,或者进行原有代码的删除
实例
Object-C、C#、JavaScript、PHP、Python、Erlang。
2、静态语言
与动态类型相反
实例
Java、C、C++
三、动态类型语言、静态类型语言
1、动态类型语言
程序在运行的过程中进行数据类型检查
实例
Python、Ruby、Erlang、JavaScript、swift、PHP、Perl
2、静态类型语言
程序在编译的过程中进行数据类型的检查
实例
C、C++、C#、Java、Object-C
四、强类型语言、弱类型语言
这个从不同的角度来看是不同的定义,现在网上(我没时间查文献资料)一般分成两种,一种是从数据类型的定义角度来看的,另一种是从程序编译运行时程序的运行错误区分的,主要的争议出现在C/C++,根据不同的角度,是不同类型的语言。下面是两种不同的角度:
从数据类型的角度来看
1、强类型语言
变量的类型在定义阶段即被限定,如果不经过强制数据类型转换,则数据类型不可被更改
实例
Java、C#、Python、Object-C、Ruby
2、弱数据类型
变量的数据类型,而是在变量赋值的过程中进行定义,比如赋予a一个字符类型的值,那么a的数据类型就是字符类型。赋予不同的类型,变量的类型也就因此改变
实例
JavaScript、PHP、C、C++
从编译运行时的出现的错误来区分
在此之前首先区分几个定义
error
1、trapped error:导致程序停止运行的错误
2、untrapped error:出错后程序继续执行,但是会出现奇奇怪怪的结果的错误,例如C语言的溢出,或者寻址错误
3、forbidden behaviors:程序语言进行设计时必须设计一组forbidden error,其中包含所有的untrapped error,也可能包含trapped error。
4、well behaved:程序中不能出现forbidden behaviors
5、ill behaved:程序中可能出现forbidden benhaviors
看图:
1、强类型语言
如果一个编程语言所有的程序均为well behaviors,则即为强类型语言
实例
Java、C#、Python、Object-C、Ruby、C/C++
2、弱类型语言
如果一个编程语言会出现ill behaviors,则为弱类型语言
实例
JavaScript、PHP、C、C++