在很多技术文档、官方介绍,以及各种各样的编程书籍中,都免不了对编程语言做一些介绍,介绍语言的背景、发展历程,设计理念等一大堆开篇立论,在这一大堆理论中,介绍语言类型时往往会有这么几个词显得有些很不一样,比如:动态类型、静态类型、强类型,弱类型、解释型、编译型。
那么这几个类型是什么意思呢,现在市场上流行、曾经流行的编程语言又分别是哪个类型的呢,接下来就来一一看看。
动态类型
动态类型语言,是指在 运行期间 才做数据类型检查的语言。
此类型的编程语言,变量、属性、方法的参数的数据类型以及方法的返回值类型都可以不用指定,他们的数据类型会在首次赋值时被记录下来。此类型的语言有 JavaScript、Perl、PHP、Ruby、Python
和VB
等等。
静态类型
静态类型语言,在 编译阶段 就做数据类型检查的语言,这点与动态类型语言刚好相反;也就是说这种类型的语言,声明变量时在就要明确指定变量的数据类型;如果没有明确指定,程序就无法通过编译,更加无法运行。
比如:C、C++、C#、Java
以及运行 JVM
的其他语言都是静态类型语言的典型代表。
强类型
强类型语言 ,也称为 强类型定义语言 ,是一种 强制数据类型定义的语言。此类语言的变量的数据类型一旦确定,除非发生类型强制转换,否则其数据类型永远不会发生改变。所以,强类型定义语言也是类型安全的语言。
并且还要求 所有的变量、属性必须先声明并初始化后才能使用 ,而且变量、属性、方法的参数以及方法的返回值必须明确指定数据类型,而且即便不同类型的变量之间的类型转换也要严格按照转换规则来执行。如Java、C#
和 Python、C、C++
等都是强类型的语言。
虽然强类型定义语言运行速度上比起弱类型语言稍稍逊色一些,但加以优化,也并非不能克服;强类型定义语言由于明确指定数据类型,所有会更加严谨,从而能避免很懂逻辑和语法上的错误。
弱类型
弱类型语言,数据类型可以被忽略的语言,这点与强类型定义语言相反;一个变量可以被赋不同数据类型的值。
在定义变量时可以只使用 变量修饰符 标识其是一个变量即可,而不用考虑其时什么数据类型;同时,一个变量可以赋不同数据类型的值,且不需要明确的数据类型。比如:变量 a 首次赋值的数据类型是字符串类型,但在后期根据需要可以把数字类型的值赋给变量 a。
弱类型语言如 VB、PHP、JavaScript
等。
解释型
解释型语言的源代码 会在执行到的那一刻才会被语言解释器转换为计算机可执行文件并执行,整个的运行过程会不断的解释,执行;解释,执行 …… 即便新的一次运行到已经解释过的程序,解释器也依然还会再次解释,并执行。
这个过程好比,你买了本纯英文的书,但你看不懂,然后去找了英文翻译来辅助你阅读,你想看哪行,他给你翻译哪行;如果你想回头去看之前的内容,他也依然会重新翻译一次,并给到你。
在解释型程序中,程序总是以源代码的形式出现;那么只要有解释器,一个解释型的程序就能很轻易的移植到另一个平台上。还有程序的修改也很方便,因为其是实时解释的,能够实时查看改动的效果。但也会因程序的不断扩大,减慢程序解释的响应速度,往往对计算机性能有一定的要求。
比如:Java
、JavaScript、VBScript、Perl、Python
等都是解释型语言。Java
因其 JVM
的跨平台特性,所以Java
也可算是解释型语言。
编译型
是指语言的源码需要经过编译器编译,生成计算机(操作系统)的可执行文件,或者计算机指令,才能够被计算机识别,并执行。完成的过程就是:程序员根据需求写出项目源代码,然后把源代码交由编译器 将所有源码文件一次性编译,得到可执行文件,这时,就可以把可执行文件通过操作系统运行起来,就能看到实际的运行效果了。
如果用英文书的例子来说明,就是:英文翻译会将整本书翻译后给到你,那么即便想回头去看之前看过的内容,也只需要自行查阅就可以了。
由于程序要经过编译后才能运行,所以其运行速度会比解释型语言要快上不少;编译过程中会进行一些必要的检查,因此也能避免不少错误的发生;但也是因为其运行机制,小小的改动也要重新编译执行,必定会浪费一定的时间。
比如:C、C++、Java,C#、Pascal/Object Pascal(Delphi)、VB
等语言都可视为编译型语言。
一些常见的编程语言的类型
- 无类型:汇编
- 弱类型、静态类型:
C、C++
- 弱类型、动态类型检查:
Perl、PHP、JavaScript
- 强类型、静态类型检查:
Java、C#
- 强类型、动态类型检查:
Python, Scheme
- 静态显式类型:
Java、C
- 静态隐式类型:
Ocaml、Haskell
完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。