【51CTO 10月12号外电头条】Lars Bak——这位来自谷歌的工程师曾经凭借其V8 JavaScript解释程序颠覆了火狐浏览器的速度神话。如今根据他的说法,谷歌推出的全新Web开发语言Dart很可能与Smalltalk存在着种种相似之处。不过它似乎同时也在将Web发展引向一条与此前截然不同的另类道路。在今天于丹麦举行的Web开发者大会上,来自谷歌及其旗下Chromium开源开发团队的成员们终于揭开了全新语言Dart的神秘面纱,谷歌同时承诺该语言将为Web编码工作带来全新的构造方式。
要让Dart正常运作,我们需要部署一套全新的虚拟机,这种要求无形中使其与Java、Adobe Flash以及微软Silverlight天然形成了竞争关系。不过从体系结构角度而言,Dart就目前来看将更多地依托于浏览器。
谷歌的计划是意欲将Dart虚拟机打造为对浏览器现有JavaScript引擎的一种补充。换句话来说,它将把Dart代码加以重组并生成功能相同的JavaScript代码。尽管谷歌一直在回避讨论Dart嵌入全部浏览器之中的可能性,但在今早发布的博文中,Bak明确指出在将Dart虚拟机整合到谷歌Chrome浏览器方面,“我们已经有计划探索这一方案。”
终于,我们迎来了类
Dart语言存在的意义是为JavaScript提供辅助功能,因为后者随着时间的推移,其在“开放式Web”中的分布式应用程序方面已经无法胜任功能上的核心角色。比起结构化更彻底、面向对象特性更明确的C#及Java,JavaScript工作起来总会带来一些无法清除的累赘因素。而与诸如Python、Ruby以及D之类更为智能化的动态语言相比,JavaScript又显得比较啰嗦,无法迅速切入主题。
随着Dart语言首部教程的问世,Bak及其架构团队以JavaScript的基础为起点,向其中加入了大量关键性Java要素,并通过对翻译程序潜在条件的改进大大优化了语言的整体简洁性。
对于JavaScript而言,实际上存在着一些能够使其更偏面向对象的类函数,而这些类函数所使用的正是关键字函数。我们可以对那些恰好具备属性的函数进行声明,而该函数将作为一种类函数嵌入其中。不过这种处理方式的问题在于,该类函数本身并没有得到重复调用,而是每次都以重新创建的形式出现,因此将该类函数以绑定的方式添加至函数原型中才是上佳的解决办法。当然,我们也可以对通用实例进行加值以实现对某种对象的声明,这可能需要利用常量对内部结构加以定义。接下来,从常量中选取一个,进而为函数赋值的做法也就使得该函数在某种意义上具备了变量值。或者我们也可以对加值进行声明,并使用整个函数的结果为其赋值,这就相当于假设该函数是对象的惟一组成部分。
以上方法都不是特别理想。在V8以及Mozilla出品的TraceMonkey这些最新一代JavaScript引擎中,大部分的工作负载都是在将那些由不理想的指令所带来的“垃圾代码”转化为少些混乱、多些严谨的有序代码。
所以从理论角度出发,运行有Dart虚拟机的浏览器也许可以摆脱性能表现低下的噩梦,因为JS翻译程序所要处理的代码已经更为有序且易于理解。当然这只是理论。
Dart重新将类的概念以Java程序员们最为熟悉的方式引入。其中几项调整使得定义工作更为简洁;举例来说,反向指针可能会被用于成员函数的声明(例如用 Ball.throw (this.distance)代替 Ball.throw (distance); this.distance = distance;)。而接口也将为那些通用于多个类的属性及函数提供支持;一个类启用一个接口,这不正是大家一直以来所期望的结果么。
至今仍不明确:事件的触发
对那些始终关注Dart项目的JS开发人员们来说,其中一大戏剧性结构变化也许会激起他们的广泛反对。JavaScript函数通常是被粘贴于整个页面当中的,而且尽管其中某部分充当的是main()函数,大多数函数仍然是由浏览器事件所触发,包括window.onload。而在Dart中,每个 <script>元素本身都是个自成一体的环境。类成员以及变量在默认情况下都是公有的(在Dart语言中没有“public”这一关键字),尽管Dart的本意并不是将公有属性推广到整个页面——而只是在脚本内部。
“在JavaScript当中,跨多个脚本标签的声明都在同一个命名空间内被结合在一起,”Sigmund Cherem与Vijay Menon今早在文章中声称。“但在Dart中,同一个脚本标签中的代码无法直接访问被定义在另一个标签中的代码。如果某个脚本需要读取来自不同URL的代码,它必须通过#import方能实现。每个脚本标签要想运行都必须定义自己的main()接入点才行。
main()函数是DOMContentLoaded事件的事件句柄。否则我们也不会看到早期的说明文档中提到任何关于Dart代码如何像JavaScript代码那样响应浏览器事件的声明。如果Dart根本没有做出任何变化,那么可以预见的是在DOM载入前不会有任何代码付诸运行;main()函数也就可以直接留空,而让其它函数负责响应事件——这跟原先JavaScript所做的混蛋事完全没有区别。
不过想想就知道,上述计划将会为多线程处理带来相当简单而直接的处理方法:同一个页面可以拥有多个脚本,而虚拟机也能够使其并行运行…再次强调,这只是根据早期说明文档进行的理论层面分析。浏览器目前还不具备多线程翻译程序,而Dart也还没有明确指出其JS翻译程序中拥有如此猛料。综上所述,断言Dart能够调用这一目前尚不存在的功能实在是为时尚早。
然而,从结构角度来看,Dart已然具备了诸多优势,因此我们有足够的理由相信它很可能将支持多款浏览器,甚至包括IE。目前还有待观察的是Dart将如何冲击浏览器上的HTML 5应用程序或者是“本机应用程序”。我们将继续关注本周从谷歌自家的开发者大会上所传出的新消息。
原文链接:http://www.readwriteweb.com/hack/2011/10/dart-is-to-javascript-as-c-is.php
【编辑推荐】