您的位置 首页 五金机械加工

动态编程语言

动态编程语言 ?   这是AndersHejlsberg(不用?介绍这是谁了吧)在比?利时TechDays20…

动态编程语言

?

  这是AndersHejlsberg(不用?介绍这是谁了吧)在比?利时TechDays2010所做的开场演讲。由于最近我在博客上关于语言的讨论比较多,出于应景,也?打≮算将Anders的?演讲完整地听写出来。在上一部分中,Anders谈及了声¥明式编程的另一个重要组成部分:∑函数式编程,并使用.NET平台上?的函数式编程语言F#进行了演示。在这一部分中?,Anders讨论了动态≠语言及Java∟S/cri‰pt的相关内容,″“∮动态﹢性”也是An⌒ders?眼中编程语言的发展趋势之%一。?

本文引用地址:http://www.e∴ep?w.com.cn/art§ic∪le/201704/?346374.h?tm

  ?如果没有特别说¬明,所有的文字都直接翻译自Anders∫的演讲,并使用我自己的口语习惯表达出来,对于Anders的口误及?反复等?情况?,必%要时在译文中自然也会进行忽略≤。为了方便理?解,我也会将视频中关键部分?进行截图,而某些代码演示则1会直接作为?文章内容发表。

 ? (听写+开?始,接上篇)㎏

  

  我下ml面继×续要讲的?是动态语言,这也是?我之前提到的三∞种趋势之一﹣。

  

÷  我还是尝?试着去找到动态语言的定义,但是你=∽也知道……一般♀地说?,?动态语言?是一些不对编译时和运行时进行严格区?分的语言。这不像一些静态编程语言,比如C#,你先进行编译,然后会得到一些编译期错误,稍后再?执行,而对于动态语言来?说这±两个∈阶段〒便混合在一起了。?我㏒们∏都熟悉一些动态语言,比如JavaScript,≒Python,Ruby,LISP等等。

∩  

  动态语言有一些优势,而静态语㏕言也有着另一些优势,这也是两个阵营争论多年的内容。2老实讲,我认为结果不是两者中的?任意一个,它们都有各自十分重要的优点,而长期来看,我认为结果应该是两者的杂交产物,我认为在语言发展中也可以看到这?样的趋势,这两部分内容正在?合并。

  

 ? 许多人认定动态语言执行起来很慢,也没有类型安全等等。我想在这里观察并比较一下,究竟是什么原因会让静态语言和动态语言在这方面有不同<的性质。这里有一动态编程语言段有趣的代码,它的语法在J∝avaS∶cript和C#里都是正确的,这样我们便能比㎎较两种语言是如何处理这段代码的。

  

  首先我㏑们把它看作是一段C#代码?,它只是用f$?or循环把一堆整数相加,你肯定不会这么做,这只是一个示例。在C#中,当我◎们使用var关键字时,它表示“请为我推断⊕这里的类型?”,所以在这里a和i的类型都是int。

  这断代码在执行的时候,这?两个值都?是32位整数?,而for循环只是简单的使用ADD指令即可,执行¤起来自然效率很高。

  但如果从J?a℡vaS?cript或是动℉态语言的角度来?看……或者说对于动态类型的语言来说,var只代表了“一个值”,它可以是任意类型,我们不知道它究竟是?什么。所以当我们使用vara或vari时,我⊥们只是定义了两个∥值,其中包含了一个“类型”?标记,表明在运?行时它是个什么类型。℃在这里它是一个i£n?t,因此包⊙含了存储inmt值的空间。但有些时候,例如要存储一?个double值,?那么可能便需要更多的空间,还可能是一个字符串,于是便?包含一个引用??。

  所以两者的区别之一便是,表示同样的值在动态语言中会有一些额外的√开销,代价较高。而在如今的CPU中?,“空间”便等?于“速度”,所以较大的值便需要较?长∵时间进行处理,这里便损失了一部分效率。?

  在JavaScript3中,我们如果要处理a加i,那么便不仅*仅是一个ADD指令。首先它必须查看两个变量中的类型标记,然后根据类型选择№合适的相加>操作?。于是再去加载?两个值,然后再进行加法㎜操作。这里还需要进行越界检查∠,因为在JavaScript中一旦越界了便要使用doub?le,等等。很明显在这里也*有许多开销。一般来说,动态语言是使用解释器来执行的,因此还有一些解释器需要的二进制码。你把这些开销全部加起来以后,便会发现执行代码时需要1‖0倍到100倍的开销。?

 ? 不过由?于近几年来出现的一些动态虚拟机或引擎,?目前这些情@况改善了许多。比方说,这是传统的情况(上图左),如在IE6或IE7里使用的非常缓慢的解释器。目·前的情况是,大部分?的Java♂Script引擎使用了JIT编译器(上图中),于?是便?省下了解释器的开销,这′样性能损失便会减小至3到10倍。而在过去的?两三年间?,JI?T编译器也变得越来越高效,浏览器中新一代的适?应性JIT编译器(上图右),如TraceMonkemy,V8,还有 ?如今微软在IE9?中使用的Chakra引擎。这种≌适应性的JIT编译器使用了一部分有?趣的技术,如InlineCaching、TypeSpecialization、Hid?de?nClasseμs、Tracing等等,它们可以﹢将开销降低至2到3倍的范围内,这种效率的×提升可谓十分-神奇。

  在我mol看来?,JavaScript引擎可能已经接近了性能优化的?极限,≡我们在效率o上可以提升的空间已经不¥多。不过我同样认为,如今JavaScript?语言的﹥性能已经足够快了,完全有能力统﹤治Web客户端。

  有人认为,JavaScr?ipt从来不是一种适合进行大规模编程的语言。如3今也有一些有趣的工具,如GoogleWebTookit,在微软NikhilKothari?也创建?了Script#?,让你¢可以编写C#?或Java代码,然后将代码编译成JavaScrip??t,这就像是将JavaSc?r?ipt当作是一种?中?间语言。GoogleWave的所有代码都用G㈱WT写≈成,它的团队坚持认为用JavaScri≯pt不可能完成这样的工作,因为复杂度实在太高了。如今在这方面还有一㎡些有趣的开发成?果,我不清楚什么时候会结束。不过我认为,这些都不算是大规模的Jav∷aScript开发方案,∷而编写C#或≥Ja?va代码再生成JavaScript的方式也不㎞能算是完∨全正确的做?法。我们可以关注这方面的走向。

  在.?NET4?.0的运行时?进行动态编程∧时,我们引入了一个新功能:动态语言?运行时。可以这样理解,CLR的目的是为静态∣类型的编程?语言提供一个统一的框架或编程模型,而DLR便是在.NET平台上为动态⊿语言提供了统一的编程模型。CLR本身已经有一些支持动态编程能力,如?反﹣?射,Emit等等。不过在.NET上实现动态语言的时候,总?会一遍又一遍地去实现某些功能,还有如动°态语言如何与静态语言进行交互,这些都由DLR来提供。DLR的特性包含了,如表达式树、动态分发、CallSite缓?存,这可以提高动态代码的执行效率。

  在.NET4.0=中我们使用了DLR,不仅仅是IronP?ython和Iron㏄Ruby,还有C#4和VB.NET10,它们使用DLR实现动态分发功能。因?此我们共享了语言的动态能力实现方式,于是这些语言之间可以轻松地进行交互。同样我们可以与其他多样性㎝的技术进行交※互,例如使用JavaS?cr?ipt操作Silverlight的DOM,或是与Ruby、Pyth?on代≧码沟通,甚至℅用来控制Office等自动£化服务。

?

关于更多动态编程语言内容,可以收藏本网页。罗雪娟去世 编程语言的发展趋势及未来方向(4):动态语言

动态编程语言动态编程语言
本文来自网络,不代表天津五金网立场,转载请注明出处:http://www.mgnqyz.com/mgnqyz/1441.html

作者: mgnqyz

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部