Google

过去五年出现了很多新程序语言,其中 Google 的 Go 语言和 Dart 语言备受瞩目,除了 Go 和 Dart 外,这些语言还包括了:基于函数语言 Qi 的 Shen 语言,自动定理证明程序语言 Agda 2,Pure,动态、强类型、基于原型的语言 Ioke,OMeta,CoffeeScript,Clojure,Scratch,Fortress,Arc,Potion,Mirah 等等。

谷歌工程师拉尔斯·巴克(Lars Bak)的 V8 JavaScript 解释器颠覆了 Firefox 所宣称的速度这一背景之下,我们有理由相信,谷歌新的网络开发语言很可能与 Smalltalk 类似。但是这可能会引领网络走向一个截然不同的方向。在今天丹麦举行的网络开发者大会上,谷歌和 Chromium 开源开发团队的成员揭开了谷歌寄予厚望的新的、更为结构化的网络编程方法——Dart 的神秘面纱。Dart 的正常运行需要一个新的虚拟机,这就使得 Dart 处于与 Java、Adobe Flash 以及 Microsoft、Silverlight 竞争的地位。但是从结构上说,至少是现在,Dart 将会更依赖于浏览器。

谷歌计划使 Dart 虚拟机作为浏览器现在使用的 JavaScript 引擎的补充。也就是说,它可以把 Dart 代码转变成 JavaScript 代码。谷歌尽量去回避关于 Dart 被嵌入所有的浏览器的可能性,不过在今天早上发表的一篇博文里,拉尔斯·巴克提及关于将 Dart 虚拟机整合到谷歌浏览器的问题,并明确表示:“我们将计划去探索这个项目。”

终于有了类

与 C# 和 java 等更加结构化、面向对象的语言相比,JavaScript 往往会有很多累赘;与 Python、Ruby 以及D等更加智能化的动态语言相比,JavaScript 又显得比较冗长,无法快速地切入主题。因此随着时间的推移,JavaScript 在“开放式网络”的分布式应用程序功能上的统治地位似乎有所动摇。而 Dart 的存在似乎正是为了弥补 JavaScript 的这些不足。

随着第一部 Dart 教程的问世,拉尔斯·巴克和他的开发团队从 JavaScript 的基础做起,加入了一些关键的 java 元素并提高了解释器的潜在假设能力来使其变得更为简洁。另外非常关键的补充就是使用了真正的类结构以及 java 开发人员所熟悉的类关键字。

JavaScript 中有一些使用关键字函数的方法来使其偏向于面向对象。例如,我们可以声明一个恰好具有属性的函数,并且它的功能是作为一种方法嵌入其中,但问题是方法本身并不会得到重载而是每次都要重新创建,所以就要把方法作为一种附加方式添加到函数原型。或者,我们可以声明一个使用通用实例的对象,它可能要用常量来定义内部结构,然后我们可以选择一个常量来为这个函数赋值,以使其具备变量的特征。或者我们可以假定该函数是对象的唯一组成部分,然后声明一个变量,把函数值赋给它。

但是这些方法并不够完美。许多由最新一代的 JavaScript 引擎例如 V8 和 Mozilla 的 TraceMonkey 等执行的任务,事实上就是把压缩了的繁琐的“垃圾代码”转变成相对简洁精确的代码。所以从理论上说,由浏览器运行 Dart 虚拟机所导致的性能下降问题可以在代码方面得到补偿,因为这些代码对于 JavaScript 解释器来说更容易分析。但这仅仅是理论上。

Dart 以一种大多数 java 程序员所熟悉的方式再次引入了类。并且其中的一些调整使得定义更加简洁;例如自反指示符 this 会被用在声明用户方法的内部(例如用 Ball.throw (this.distance);而不用 Ball.throw (distance); this.distance = distance;)。同时接口也支持创建用户属性和多个类的公用方法;还有如人们所期待的那样一个类实现一个接口。

仍是未知:事件的触发

有些 JavaScript 开发者反对的一个显著的结构变化是关系到上下文。JavaScript 函数往往是粘贴在整个页面上的,尽管其中有些地方它应该是一个 main ()函数,但是大多数函数是由浏览器事件触发的,包括 window.onload。在 Dart 中,每一个<script>元素都是一个自包含的上下文。类成员和变量被默认为是公有的(在 Dart 中没有“public”这个关键字),尽管对于 Dart 来说“public” 仅仅是脚本,而并非一个涵盖整个页面的作用域。

“在 JavaScript 中,跨多个脚本标签的声明在同一个命名空间里被组合在一起,”Sigmund Cherem 和 Vijay Menon 在今天早上写道,“在 Dart 中,在一个脚本标签中的代码无法直接访问定义在另一个中的代码。如果一个脚本希望从另一个不同的 URL 加载代码,那么它必须通过#import 来导入。每个脚本标签必须定义自己的 main ()入口才能运行。

main ()函数是 DOMContentLoaded 事件的事件处理程序。否则,我们不会从早期文档编制中看到任何关于 Dart 代码如何以 JavaScript 代码的方式回应浏览器事件的迹象。如果 Dart 没有做出任何改变的话,那么我们可以预见,在 DOM 加载前什么都不会运行,main ()函数也就可以写为空的,而其它函数对事件做出响应——这和 JavaScript 所产生的情况一样糟糕。

但是可以想象,这个方案将会使多线程处理变得异常简单和直接:一个页面可以有多个脚本,而且虚拟机可以并行运行它们……再次强调,这仅仅是根据早期文档编制,从理论上来讲。目前浏览器尚未具备多线程解释器,Dart 也并没有强大到包括 JavaScript 虚拟机,因此很难想像 Dart 将如何调用一个事实上并不存在的功能。

然而,从结构的角度来讲,关于 Dart 还有很多是值得期待的,并且我们有理由相信它将会支持甚至包括 Internet Explorer 在内的诸多浏览器。因此 Dart 将会如何冲击浏览器的 HTML5 应用程序(或者说是“本机应用程序”)仍有待观察。我们这周将密切关注来自开发者大会及谷歌的消息。