编译型语言、解释型语言、静态类型语言、动态类型语言 概念与区别

最近在研究Python和Erlang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里作一个总结。程序员

编译型语言和解释型语言

一、编译型语言

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

优势:  编译器通常会有预编译的过程对代码进行优化。
        由于编译只作一次,运行时不须要编译,
        因此编译型语言的程序执行效率高。能够脱离语言环境独立运行。

缺点:  编译以后若是须要修改就须要整个模块从新编译。
        编译的时候根据对应的运行环境生成机器码,
        不一样的操做系统之间移植就会有问题,
        须要根据运行的操做系统环境编译不一样的可执行文件。
复制代码

表明语言:C、C++、Pascal、Object-C、swift编程

二、解释型语言

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

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

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

表明语言:JavaScript、Python、Erlang、PHP、Perl、Rubyswift

三、混合型语言

既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,
取其精华去其糟粕。就出现了半编译型语言。
好比C#,C#在编译的时候不是直接编译成机器码而是中间码,
复制代码

.NET平台提供了中间语言运行库运行中间码, 中间语言运行库相似于Java虚拟机。 .net在编译成IL代码后,保存在dll中, 首次运行时由JIT在编译成机器码缓存在内存中, 下次直接执行(博友回复指出)。 我我的认为抛开一切的偏见C#是这个星球上最好的编程语言。 惋惜微软的政策限制了C#的推广。缓存

Java先生成字节码再在Java虚拟机中解释执行。 严格来讲混合型语言属于解释型语言。C#更接近编译型语言。bash

动态语言和静态语言

一、动态语言

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

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

二、静态语言

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

三、注意:

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

C#也是动态语言,经过C#的反射机制能够动态的插入一段代码执行。函数

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

一、动态类型语言

不少网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。
动态类型语言和动态语言是彻底不一样的两个概念。
动态类型语言是指在运行期间才去作数据类型检查的语言,
说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。
复制代码

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

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

二、静态类型语言

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

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

三、注意:

至关一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,
编译型语言都是静态类型语言。这个也是错的。
swift是编译型语言可是它也是动态类型语言。
C#和Java是解释型语言也是静态类型语言。
复制代码

强类型语言和弱类型语言

一、强类型语言:

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

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

二、弱类型语言:

数据类型能够被忽略,一个变量能够赋不一样数据类型的值。
一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。
复制代码

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

三、注意:

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

若是个人理解有误,请在回复中不吝指出,谢谢。

相关文章
相关标签/搜索