您的位置:首页 > 其它

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

2016-02-26 03:25 274 查看
一.动态语言和静态语言
1.

我们常说的动、静态语言,通常是指:

动态类型语言 Dynamically Typed Language

静态类型语言 Statically Typed Language

可能还有:动、静态编程语言 Dynamic\Statically Programming Language

2.
动态类型语言:在运行期间检查数据的类型的语言
例如:Ruby\Python
这类语言编程,不会给变量指定类型,而是在附值时得到数据类型。
Python是动态语言,变量只是对象的引用,变量a和b本身都没有类型,而它们的值有类型。

静态类型语言:数据类型是在编译其间检查
例如:C/C++、Java/C#

Static typing when possible, dynamic typing when needed。

java是静态语言,但是有许多动态特性,比如Reflection、Annotation、Dynamic proxy

3.关于动、静态语言的安全性

本来是动态语言或静态语言与安全性是无关的,但是:
动态语言不支持很多静态检查
安全分析工具不能处理动态语言的一些行为
所以,动态语言有时会被认为不安全。但是从设计思想上,比如:
Python的一个设计哲学是,相信程序员。如果代码有问题,那是你的问题不是Python的问题。所以代码简洁。
Java相反,不相信程序员。需要按部就班的写代码,需要编译器做静态检查。所以代码冗长。

二.编译型语言和解释型语言
1.运行过程
编译型语言:先编译,再执行

最早可以追溯到汇编,就是编译器(Compiler)把源代码转换成可执行代码,这个过程称为编译(Compile)。
如果是多个文件,还有一个链接的过程。链接程序(Linker)-链接(Link)

解释型语言:直接解释执行

例如BASIC,就是只有源代码,没有可执行文件。程序每执行到源程序的某一条指令,由解释器将源代码转换成二进制代码以供执行。并且是一个不断解释不断执行的过程。
优点:不需要编译,直接运行、调试。
缺点:运行速度较慢。并且没有编译期的语法检查。

解释类型语言的移植性由解释器完成,编译类型语言的移植性由编译器完成。

  其实许多语言是编译型还是解释型划分已经很模糊,比如java既有编译器javac,又要由JVM解释执行。

3.
解释型语言运行较慢的一个原因是,相当于将编译的过程放到执行过程中。
动态类型语言运行较慢的一个原因是,在执行的过程中需要判断变量的类型。

三、强类型语言和弱类型语言

通常强类型语言就是在定义变量时,变量的类型是明确的。一旦一个变量被声明为某种类型,除了通过强制类型转换之外,它就永远被当成该类型处理。

这里强\弱类型语言划分,与动\静态语言划分的区别与联系,还可以再深入研究,就先到这里吧。

深入探讨可参考这里:https://www.zhihu.com/question/19918532,看下面的评论有一些争议,我想可能是因为,现代语言在设计上的相互借鉴,使得语言类型的界限变得模糊。了解从不同角度去分析语言类型的差异,以及每一种语言本身的设计思想和特性,才是重要的。

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: