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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态语言和静态语言编译型语言和解释型语言强类型语言和弱类型语言的分析相关的知识,希望对你有一定的参考价值。

一.动态语言和静态语言
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

以上是关于动态语言和静态语言编译型语言和解释型语言强类型语言和弱类型语言的分析的主要内容,如果未能解决你的问题,请参考以下文章

解释型语言和编译型语言弱类型语言和强类型语言动态语言和静态语言的区别

python——静态语言动态语言强类型语言弱类型语言脚本语言解释型语言编译型语言

强类型语言/弱类型语言动态语言/静态语言编译型语言/解释型语言(整理)

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

Python动态强类型解释型语言

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