专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 编程语言的发展趋势及未来方向(4):动态语言 »正文

编程语言的发展趋势及未来方向(4):动态语言

来源: 发布时间:星期三, 2010年5月26日 浏览:0次 评论:0
  这是Anders Hejlsberg(不用介绍这是谁了吧)在比利时TechDays 2010所做开场演讲由于最近我在博客上有关语言讨论比较多出于应景也打算将Anders演讲完整地听写出来在上部分中Anders谈及了声明式编程个重要组成部分:式编程并使用.NET平台上式编程语言F#进行了演示在这部分中Anders讨论了动态语言及JavaScript相关内容“动态性”也是Anders眼中编程语言发展趋势的

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



  我下面继续要讲是动态语言这也是我的前提到 3种趋势的



  我还是尝试着去找到动态语言定义但是你也知道……般地说动态语言是些不对编译时和运行时进行严格区分语言这不像些静态编程语言比如C#你先进行编译然后会得到些编译期稍后再执行而对于动态语言来说这两个阶段便混合在起了我们都熟悉些动态语言比如 JavaScriptPythonRubyLISP等等



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



  许多人认定动态语言执行起来很慢也没有类型安全等等我想在这里观察并比较究竟是什么原因会让静态语言和动态语言在这方面有区别性质这里有段有趣代码语法在JavaScript和C#里都是正确这样我们便能比较两种语言是如何处理这段代码



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



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



  但如果从JavaScript或是动态语言角度来看……或者说对于动态类型语言来说var只代表了“个值”它可以是任意类型我们不知道它究竟是什么所以当我们使用var a或var i时我们只是定义了两个值其中包含了个“类型”标记表明在运行时它是个什么类型在这里它是因此包含了存储空间但有些时候例如要存储个double值那么可能便需要更多空间还可能是于是便包含个引用

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



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



  不过由于近几年来出现些动态虚拟机或引擎目前这些情况改善了许多比方说这是传统情况(上图左)如在IE 6或IE 7里使用非常缓慢解释器目前情况是大部分JavaScript引擎使用了JIT编译器(上图中)于是便省下了解释器开销这样性能损失便会减小至3到10倍而在过去两 3年间JIT编译器也变得越来越高效浏览器中新适应性JIT编译器(上图右)如TraceMonkeyV8还有如今微软在IE 9中使用Chakra引擎这种适应性JIT编译器使用了部分有趣技术如Inline Caching、Type Specialization、Hidden Classes、Tracing等等它们可以将开销降低至2到3倍范围内这种效率提升可谓十分神奇

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

  有人认为JavaScript从来不是种适合进行大规模编程语言如今也有些有趣工具如Google Web Tookit在微软Nikhil Kothari也创建了Script#让你可以编写C#或Java代码然后将代码编译成JavaScript这就像是将JavaScript当作是种中间语言Google Wave所有代码都用GWT写成团队(Team)坚持认为用JavaScript不可能完成这样工作复杂度实在太高了如今在这方面还有些有趣开发成果我不清楚什么时候会结束不过我认为这些都不算是大规模JavaScript开发方案而编写C#或Java代码再生成JavaScript 方式也不能算是完全正确做法我们可以关注这方面走向





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

  在.NET 4.0中我们使用了DLR不仅仅是IronPython和IronRuby还有C# 4和VB.NET 10它们使用DLR实现动态分发功能因此我们共享了语言动态能力实现方式于是这些语言的间可以轻松地进行交互同样我们可以和其他多样性技术进行交互例如使用JavaScript操作SilverlightDOM或是和Ruby、Python代码沟通甚至用来控制Office等自动化服务

  文章来源:http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html



标签:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: