动态语言和静态语言_静态语言和动态语言 - CSDN
精华内容
参与话题
  • 通常我们所说的动态语言静态语言指 动态类型语言(Dynamically Typed Language) 静态类型语言Statically Typed Language)。 还有一个 Dynamic Programming Language (动态编程语言),静态编程语言。 ...

    定义 
    通常我们所说的动态语言、静态语言指 动态类型语言(Dynamically Typed Language)和 静态类型语言Statically Typed Language)。
    还有一个 Dynamic Programming Language (动态编程语言),静态编程语言。

    动态类型语言:在运行期间检查数据的类型的语言。用这类语言编程,不会给变量指定类型,而是在附值时得到数据类型。如:Python和ruby就是典型动 态类型语言。很多脚本语言vbscrīpt,javascrīpt也是这类语言。看下面javascrīpt代码:

    function add(a,b){
    return a+b;
    }
    add(1,2);
    add('1',2);



    静态类型语言:相反静态类型语言是在运行前编译时检查类型。在写代码时,没声明一个变量必须指定类型。如:Java,c#,c,c++等等。
    public int add(int a,int b){
    return a+b;
    }
    其实比较一下代码,你很快就会发现,其实区分动态静态类型语言从语法上就够了,语言语法格式基本就可确认动静态类型。

    而Dynamic Programming Language (动态编程语言)指在程序运行过程中可以改变数据类型的结构,对象的函数,变量可以被修改删除。比如:javascrīpt就是这类语言,ruby, python也属于这类语言。而c++,java不属于这类语言。看javascrīpt代码:

    function Person(name){
    this.name=name;
    }
    Person.prototype.getName=function(){
    return this.name;
    }
    var person=new Person("okok");
    alert(person.getName());
    person.getName=function(){return "nono"};
    alert(person.getName());



    当然静态编程语言 是运行时不可改变结构了。

    网上有人说 类型检查和改变结构 是静态语言和动态语言两个区别点。基本概念上应该就这些,是我个人理解,不一定完全正确。个人感觉没必要很清晰分门类,掌握优点、特点就好了。这个话题说开根本不是我能说清楚的。总结思考一下。

    有三个名词容易混淆:

    1. Dynamic Programming Language (动态语言或动态编程语言)
    2. Dynamically Typed Language (动态类型语言)
    3. Statically Typed Language (静态类型语言)

    FantasySoft在他文章中所提到的动态语言与静态语言实际上指的就是动态类型语言与静态类型语言。

    动态语言,准确地说,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的 ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态 语言。

    所谓的动态类型语言,意思就是类型的检查是在运行时做的,比如如下代码是不是合法的要到运行时才判断(注意是运行时的类型判断):

    defsum(a,b): 
     return a + b 

    而静态类型语言的类型判断是在运行前判断(如编译阶段),比如C#就是一个静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继 承、接口,而动态类型语言却不需要,所以一般动态语言都会采用dynamic typing,常出现于脚本语言中。(idior不知道这能不能回答你对动态语言多态的疑问^_^)

    这里我需要明确说明一点,那就是,是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起!

    静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。动态类型 语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。顺便说一下,现在有这样一 种趋势,那就是合并动态类型与静态类型在一种语言中,这样可以在必要的时候取长补短,Boo就是一个很好的试验性例子。^_^

    最后说一下Boo,Boo是一个静态类型语言,虽然用duck typing可以模拟dynamic typing,但是duck并不支持所有类型的操作替代,所以即使完全使用duck typing也不能达到dynamic typing。就像FantasySoft所述,Type Inference不是动态类型语言的特性,所以支持Type Inference不代表这门语言就是dynamically typed。

    再特地为Ninputer 这个VB的fans说一下VB.NET^_^,VB.Net是dynamically typed语言。

    展开全文
  • 动态语言会淘汰静态语言吗?

    万次阅读 热门讨论 2011-01-04 17:54:00
    这并不表示动态语言全面的优于静态语言,更不表示静态语言会被动态语言全面的取代。进一步,这里我简单的说一下,我所认识到的,静态语言相对的优越性,存在意义。这里首先我表达一下我一贯的观点:计算机不会魔法...

    上一篇博客动态语言会导致开发质量下降吗?,尽管没有我想像的那么多争议,但还是如期引发了一些误解。有一些朋友指出动态语言,具体来说是 Python 中的各种问题。这些我认为是大部分是正确的。

    我写上文的用意,在于讨论动态语言使用过程中,关于质量控制的必要性,以及其引发的性价比方面的争议。这并不表示动态语言全面的优于静态语言,更不表示静态语言会被动态语言全面的取代。进一步,这里我简单的说一下,我所认识到的,静态语言相对的优越性,和存在意义。

    这里首先我表达一下我一贯的观点:计算机不会魔法。具体来说两方面,一是离机器越近,性能上越有可能达到更快;二是目前的机器模型,总是以线性方式管理数据的(值得吐槽的是在操作系统以上,文件分区系统也总是这样干的,更底层能否以哪怕是极座标方式,直接在二/三维空间上定位访问,而非扇区、柱面、簇这种形式,我不清楚,有待方家指点)。

    线性管理信息带来的效应就是:基于线性数据结构,或以地址访问信息的编程工具,通常来说会比基于字典结构的更快,至少有更大的优化空间。而静态语言的话,编译时我们已经确定了对象的结构和尺寸(动态尺寸的内容可以通过引用管理),这是动态语言无法做到的。动态语言的对象结构,总是基于字典结构,要兼顾对象结构在运行时发生改变的问题。这使得它的数据管理总是要比直接地址访问要多上那么一层。这也是甚少见到动态语言编译器的原因。流行的动态语言,几乎都是解释/字节码平台,甚至,最常见的 Python/Ruby 等等语言,几乎都有饱受批评的 GIL(Global Interpreter Lock)。以 Python 社区的经验来说,多年来出现的数个无GIL的 C-Python 实现,单核性能都不如现在的官方版本。Jython 和 IronPython 则是得益于 JVM 和 CLR,这两个久经经考验的虚拟机平台,它们的 first-class language 都是静态编译型语言(尽管其主流编译器生成的是字节码,但是通常我们都视Java 和 C#为编译语言)。为 Perl 社区期待多年的 Perl6 ,至今还没有真正的发布(其虚拟机 Parrot 虽然已经发布,但受制于主力语言实现进度,现在还没有得到足够的实战验证)。为动态语言实现一个高性能的,特别是并行的高性能环境,难度之高,可见一斑。

    根本上说,在当前的硬件模型上,想要以非线性的方式管理信息,动态伸缩,动态修改结构,非常的不容易。举一个例子,候捷老师有一个讲座,是以windows 95为例,詳細讲解 malloc/free 的底层实现,有听过的朋友应该对操作系统动态管理内存资源的复杂程度有所体会。类似的内容在很多操作系统之类的技术书籍中都有介绍,有兴趣的朋友可以找来看看,我手边有一本《Unix系统编程》就有相关的内容。

    这类问题涉及比较深入的底层问题,我不是科班出身,这方面比较外行,讲的不是很好,不过有兴趣的朋友可以深究一下,会发现这事儿比看起来要麻烦得多。想要让动态语言达到静态化的性能,是件相当有挑战的事。Google的 Protocol Buffer 协议,也是基于静态模型的。

    现代的静态语言,搞了很好的“伪装”,使它写起来可以非常的有“动感”,例如 C#3,Scala等,但究其本质,它们代码中涉及的类型,仍然是可以编译期确定的。我所接触过的语言中,此类功能最有历史的应该是Haskell,而它是通过一个非常严苛的数学体系来推导类型,在此过程中,还是时有需要程序员显式声明函数类型,才能完成编译。

    静态语言在变得越来越友好敏捷,动态语言在越来越快,但是两者之间的分界,仍然相当的清晰,静态语言更快,更具优化潜力。动态语言更灵活,更具表达能力。这是两者不能被互相取代的根本原因。

    当然,性能问题并不简单,动态语言在宏观上往往没有具部的测试结果看起来那么慢,这是因为要表达复杂的业务逻辑,往往需要复杂的数据结构和访问代码,这些复杂的数据内容,要随着用户的访问不断变化。要实现这一切,如果使用静态语言,就要关注动态数据结构的实现,如果使用的是没有GC的开发技术,还要关注内存资源的回收,确实会出现绕了一大圈儿,结果实现的系统还没有现成的动态语言快的现像(尽管这不是普遍的)。更何况现实中总是以线性读写的IO接口,更严重拉平了不同语言之间的性能差异。所以现在比较得到认可的实现方式往往是以动态语言实现项目,然后,如果有需求,也有这个成本负担,就以静态语言优化性能瓶颈。

    当然,上述的模式往往用在服务器型的项目中,在GUI环境中,要与显示器、鼠标键盘等人机交互环境频繁的互动,这个资源付出非常的大,加上在CPP等静态语言大行的时代,GUI开发已经相当成熟,技术力量沉积的历史原因,这个领域仍然是以静态的、编译型的语言为主力。最多是为了提交二次开发能力,提供动态语言调用的接口,或嵌入一个解释环境,有限的利用。其实即使是服务器环境,随着互联网的发展,性能问题也正在越来越突出。我就遇到过某个简单逻辑的功能,使用Python怎样都无法优化到理想的程度,最终用Objective C写了一个nginx模块。另一方面说Objective C这样的语言已经相当的动态化,使用它的字典结构,要比用C方便的多,在二进制上又可以完全兼容于C,在性能和空间付出上,明显可以观察到比大多C的字典结构,要多付出一些性能代价。计算机没有魔法,人得到便利,总是要付出一些计算资源。把它尽可能的贴近理想,是技术人员的目标。

    越来越多的大型架构,要求我们不仅以模块、连接库和函数接口的层面思考问题,更多的要考虑实际运行时的,运行实例和服务器的行为。我们不但需要附件齐备的运行时环境,也需要可以直达硬件的,高速有效的工具。包括开发一些不那么动态但是更快速的定制服务环境,也成为一个越来越常见的需求。

    虽然编程语言在发展,我们有更多,更强大的方式来表达我们的思维,但是随着用户量、商业模式和服务方式的迅速变化,新的挑战也不断出现。对于职业的IT开发团队,我们在面对更多的挑战。我们需要更为丰富的技术组合,指望一种技术一统天下,即使局限于互联网应用这个领域,也仍然是一个奢望。这十年来动态语言的兴起,其实是在补过去逻辑表达方面不足的功课,这是硬件发展带来的有限的福利,但是硬件资源永远是快速发展,但却不足使用。动态语言和静态语言组合使用,兼顾高效开发与高性能的效果,在目前可以预见的未来,仍然是比较实际的思路。

    展开全文
  • 静态语言和动态语言的区别

    千次阅读 2018-12-12 11:12:16
    我心血来潮就去百度了一番动态语言和静态语言的具体区别,一番百度才发现自己原来的想法不够全面,所以在这里做个笔记。 基本概念 动态类型语言:在运行期进行类型检查的语言,也就是在编写代码的时候可以不指定...

    今天在群里聊天的时候,谈论到python和Java相比居然不用定义变量类型。我心血来潮就去百度了一番动态语言和静态语言的具体区别,一番百度才发现自己原来的想法不够全面,所以在这里做个笔记。

    基本概念

    • 动态类型语言:在运行期进行类型检查的语言,也就是在编写代码的时候可以不指定变量的数据类型,比如Python和Ruby
    • 静态类型语言:它的数据类型是在编译期进行检查的,也就是说变量在使用前要声明变量的数据类型,这样的好处是把类型检查放在编译期,提前检查可能出现的类型错误,典型代表C/C++和Java
    • 强类型语言,一个变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。举个例子:如果你定义了一个double类型变量a,不经过强制类型转换那么程序int b = a无法通过编译。典型代表是Java。
    • 弱类型语言:它与强类型语言定义相反,允许编译器进行隐式的类型转换,典型代表C/C++。


    如果所有程序都是灰的,strongly typed
    否则如果存在红色的程序,weakly typed
    编译时排除红色程序,statically typed
    运行时排除红色程序,dynamically typed

    总结

    上一个图就很清晰了

    preview

    展开全文
  • 编译型解释型的区别 先来看看编译型语言定义: 编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码 (二进制)。 再来看看解释型语言的定义: 解释型语言的源代码不是直接翻译成机器指令,而是...

    探索

    编译型和解释型的区别

    先来看看编译型语言定义:

    编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码 (二进制)。

    再来看看解释型语言的定义:

    解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。

    咋看一眼,还是一脸懵逼。下面打个比方:

    • 编译型相当于用中英文词典(翻译器)将一本英文书一次性翻译(编译)成一本中文书。以后查看直接就是中文了。可想而知,以后读书(运行)会非常非常方便。
    • 解释型相当于用中英文词典(翻译器)将一本英文书读一段翻译一段(解释)中文。以后查看时还是需要重新翻译。这样效率会低一些,必须依赖解释器,但是跨平台性好。

    扩展

    编译型和解释型的定义是对立存在的,但也可以在一个语言中同时存在。比如 java 语言同时兼有编译型和解释型特点。整个流程如下:

    将源代码(.java 文件)编译生成字节码(.class 文件),再通过 JVM(java 虚拟机)运行生成机器指令,由机器运行机器码。注意,此处生成机器语言前的操作是解释型,每次运行都要重新解释。因此,此处表明 java 是解释型
    但是,部分 JVM(java 虚拟机)有一种 JIT(Just in time)机制,能够将部分已经解释翻译的常用机器指令保存。下次不需要解释,直接运行即可。此时 java 是编译型

    因此,现在用编译型和解释型区分语言是行不通的。

    动态语言和静态语言

    我们常说的动态语言和静态语言,其实是指动态类型语言和静态类型语言。先来看看动态类型语言:

    动态类型语言,是指数据类型的检查是在运行时做的。用动态类型语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部记录数据类型。

    再来看看静态类型语言的定义:

    静态类型语言,是指数据类型的检查是在运行前(如编译阶段)做的。

    小结:

    • 动态类型语言的优点是不需要写多种数据类型的代码,代码相对简洁一些,方便代码阅读。缺点是不方便调试,代码命名也容易混淆;
    • 静态类型语言的优点是方便调试,代码相对规范。缺点是需要写很多数据类型相关的代码,代码不够简洁。

    参考资料:

    百度百科:编译型语言
    百度百科:解释型语言
    知乎:Java 是编译型语言还是解释型语言?
    IBM:深入浅出 JIT 编译器
    逛博:编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别

    本文均为作者原创,未经允许和授权,不得转载,违者必究!

    展开全文
  • 动态语言和静态语言的区别

    万次阅读 多人点赞 2017-10-30 11:20:20
    编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。 编译是把源代码编译成机器码, 链接是把...
  • 静态语言: 变量的类型在编译之前就需要确定,在编译的时候需要先编译,将源码转换成目标代码,然后...动态语言:不需要直接指定变量类型,在解释的时候,转换为目标代码运行程序一步到位,比如python。 比较: ...
  • 动态语言和静态语言

    2016-07-05 09:03:31
    原文:xxb2008的专栏 1.动态语言Dynamically Typed Language ...与静态类型定义相反,一种在执行期间才去发现...动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构
  • 动态类型语言和静态类型语言

    千次阅读 2018-05-24 15:54:33
    https://www.cnblogs.com/liuning8023/p/4286044.html  动态类型语言和静态类型语言本文主要说明动态类型语言和静态类型语言。类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行...
  • 动态语言和静态语言
  • 静态语言和动态语言之探索

    千次阅读 2018-05-18 14:30:13
    有三个名词容易混淆:Dynamic Programming Language (动态语言或动态编程语言)Dynamically Typed Language (动态类型语言)Statically Typed Language (静态类型语言)静态类型语言的类型判断是在运行前判断(如编译...
  • 1、动态语言和静态语言通常我们所说的动态语言静态语言是指动态类型语言和静态类型语言。(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也...
  • statically typed language A language in which types are fixed at compile time. Most statically typed languages enforce this by requiring you to declare all variables with their datatypes before u
  • 动态语言静态语言的区别

    千次阅读 2017-08-31 10:15:04
    通常我们所说的动态语言静态语言指 动态类型语言(Dynamically Typed Language) 静态类型语言Statically Typed Language)。 还有一个 Dynamic Programming Language (动态编程语言),静态编程语言。 ...
  • 定义:强类型语言(静态类型语言)是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java/C#/scala/goland弱类型语言(动态类型语言)是指不需要进行变量/对象类型声明的语言,一般情况下不需要...
  • 今天小熙突然想到一个问题,那就是Java到底是动态语言还是静态语言,是强类型还是弱类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧。 二. 图释 小熙碰巧看到一张,完美的区分了以上的问题 如图所示,...
  • 三分钟看懂编译型语言和解释型语言概念、特点、区别,动态语言和静态语言的优缺点 编译型语言和解释型语言: 0.补充: 1.计算机并不能直接识别各种编程语言,需要将各种编程语言转化成机器能够识别的指令集, 2.由于...
  • 动态语言和静态语言 1.动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种...
  • 静态语言:静态语言在程序运行前会进行类型判断,类的成员,方法都会在编译阶段确定好内存地址.类成员只能访问属于自己的方法变量,因此,静态语言的结构更加规范,便于调试,且可以进行多样化的性能优化.常见的静态语言...
1 2 3 4 5 ... 20
收藏数 323,883
精华内容 129,553
关键字:

动态语言和静态语言