动态语言 静态语言 编译型语言 解释型语言

。。。

造成这种差异和误解的根本原因是JAVA是一门静态语言,而Python是一门动态语言。而恰好,JAVA又是一门编译型的语言,而Python是一个用解释器执行的解释型语言。于是有人告诉我,编译型语言就是静态语言,而解释型语言就是动态语言。
事实果真如此么?我们一起来梳理下面几个概念!

编译型语言

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

  • 优点:一次编译,重复可用,不需要每次执行时再编译一遍,由于编译后生成的是能直接被机器执行的机器码,所以通常情况下执行效率会更高。
  • 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件(比如Windows上的.exe文件,CentOS上的.rpm文件)。
  • 代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

解释型语言

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

  • 优点:可以在任何安装了解释器(虚拟机)的机器上运行,不用关心用了什么操作系统。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
  • 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
  • 代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

混合型语言

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行。Java先生成字节码再在Java虚拟机中解释执行。严格来说混合型语言属于解释型语言。C#更接近编译型语言。

动态语言和静态语言

动态语言

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

静态语言

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

走出误区

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

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

为了不混淆动态语言和动态类型语言,下面还补充说明以下几个概念

动态类型语言

很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。
动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。
主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

静态类型语言

静态语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。
主要语言:C、C++、C#、Java、Object-C。

注意

解释型语言并不都是动态类型语言,编译型语言也不全是静态类型语言。swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言,虽然它们看作解释型语言,但是它们也有编译过程,会在编译过程中做数据类型的检查
所以,动态类型语言是数据类型检查的动态(运行时检查),而不是像动态语言一样代码逻辑结构的在运行时可变更,静态则相反。

强类型语言和弱类型语言

说到数据类型,就不得不提从数据类型是否严格定义的角度产生的另外两个概念:强类型语言和弱类型语言

强类型语言:

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

弱类型语言:

数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。
主要语言:JavaScript、PHP

3、注意:

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

附录概念对照表

概念 划分角度 特点
编译型语言 执行方式 将源代码编译为机器码给机器执行
解释型语言 执行方式 将源代码交由解释器解释为机器码执行
混合型语言 执行方式 将源代码编译为“中间码”,再交由解释器(虚拟机)解释为机器码执行
动态语言 代码逻辑结构是否可以在运行时改变 可以改变
静态语言 代码逻辑结构是否可以在运行时改变 不可改变
动态类型语言 代码的数据类型何时检查 运行时检查
静态类型语言 代码的数据类型何时检查 运行时不检查
强类型语言 变量定义后是否可以随意改变数据类型 不可以
弱类型语言 变量定义后是否可以随意改变数据类型 可以
(0)

相关推荐