Dart 准备好了吗

阅读数:1701 2012 年 10 月 18 日

话题:Google语言 & 开发架构文化 & 方法

一年前,Google 发布了一门新的编程语言——Dart,试图弥补 Javascript 的不足,Google 希望 Dart 最终能够取代 JavaScript 成为 Web 开发的主流语言。当时,Google 只是提供了一些技术预览,大家的关注主要集中在 Dart 语言本身,而不是如何用它来做实际开发。原因在于想要成为一门主流的编程语言,Dart 需要有一套完成的开发工具包。在 Dart 一周岁生日之际,Google 发布了面向开发人员的Dart SDK 第一版,对于 Web 开发人员来说值得关注。

Dart SDK 提供的关键特性包括:

  • 更快的 Dart 虚拟机,甚至在某些测试上超过 V8
  • 新的 Dart-JavaScript 的转换器,可以生成快速、压缩的代码
  • 能够透明的运行在现代浏览器上的 HTML 库
  • 与 Javascript 代码的交互库
  • 易用的编辑器
  • 新的打包工具——Pub
  • Dartium——原生支持 Dart 的 Chromium 构建(Dartium 是集成 Dart 虚拟机的 Chromium 浏览器,过去要想在浏览器中运行 Dart 代码,只能将 Dart 代码编译为 Javascript,但是现在有了 Dartium, Dart 代码可以真正地在浏览器里的 Dart 虚拟机中运行了。 Dartium 支持一些的基本开发工具,如调试等。如果你对 Dartium 开发工具感兴趣,可以观看 Seth Ladd 博客中关于Dartium 中的开发工具的视频演示。)
  • 服务器端 IO 库
  • 描述 Dart 语法和新特性的语言规范

Dart 语言存在许多出色的特性,其中包括模块化和可选类型:

  • 模块化——Dart 中的命名空间采用了库机制,它不同于 Java 中仅能使用类名来定义方法或变量命名空间。很重要的一点是:Dart 中的库除了包含类之外,还可以包含顶级元素,即类之外的变量和函数。print函数正是一个例子,因为它是无类的顶级函数。库系统也为名字冲突提供了一种解决方案:库 A 可以导入另一个库 B,为了避免 A 和 B 间的命名冲突,所有从库 B 中导入的名字都会被加上前缀,也就是说,使用#import("foo.dart", "foo") 导入库后,所有其中的可用元素都会拥有前缀"foo."。

  • 可选类型 (Optional Typing)——“可选类型”关键在于“可选”。开发人员可以为代码加上类型标注,但这些标注又对代码行为根本没有影响。事实上,Dart 中还可以指定一个无意义类型——而同时代码仍然能够正常运行。在代码中拥有类型可以让各种类型检查器各司其职。Dart 附带的编辑器中拥有一种类型检查器,它能够高亮类型错误并将其当做警告。Dart 中还有一种检查模式,在该模式中类型标注可用来检查代码,任何违规都会被报告成警告或错误。实际上可选类型标注在代码中会具有类型信息,这些信息对编制文档会有帮助;使用可选类型不再需要更多的文档来解释某个参数必须实现一个特定的方法才可以接受。接口的存在(即带有方法签名的方法名称集合,以及可选类型标注)可以帮助文档化 API。关键在于,语言总是动态的而且参数也可以被指定为动态的,也就是Dynamic类型。

针对 Dart SDK 的发布和 Dart 的前景,开发社区展开了热烈的讨论,大家发表了各自的看法。

ColinABQ:Dart 从一出生就注定是“Javascript 的转换器”和“Javascript 代码的交互库”,Google 知道它面临多大的障碍,大家认为 Dart 不可能获得真正的应用。如果其他转换器被禁用,那么 Dart 也会消失。不过我想知道 Dart 是否在 Google 公司内部使用,处理一些开发问题。

Deekthesqueak:我对 Web 新技术非常感兴趣,但是坦白的说,在应用新技术之前,我们需要考虑如何处理低版本的浏览器。我们需要想办法强制用户升级 IE、Chrome、Firefox 等等。作为一名曾经为 IE 7-9、Firefox 和 Chrome 开发过 Web 应用的过来人,我不得不考虑最小支持集合,这严重影响了应用可以具备的特性。

Dilbert:我认为 Dart 还没有准备好。Google 需要浏览器来支持 Dart 语言。你不能把内建 Dart 虚拟机的 Chromium 构建用于普通的上网,其他浏览器厂商还没有支持 Dart,而且 Google 也是 Javascript 标准化进程的一员,它还在招聘大量的 Javascript 开发人员……我认为,Lars Bak 想要开发 Dart,因此 Google 投入了相应的资源,这就像 Rob Pike 和 Ken Thompson 想要开发 Go 语言一样,Google 也提供了支持。Google 公司的一些员工认为 Javacript 很糟糕,希望完全抛弃它,但是很显然更多的人不支持。

Desverger:我个人认为 Javascript 是一门很糟糕的语言,原因有很多。因此,我会尽力避开 web 开发。那些从事 Web 开发的人正是那些真正喜欢 Javascript 的人。我对 Dart 了解不多,但是我相信相比 Javascript,我会更享受 Dart。作为一名开发人员,我希望能够使用 Dart 开发网站,应该会满足我的需求。我猜 Dart 会吸引更多的人从事 Web 开发。

PervertRyan:为何我们要花时间学习一种新语言?我们应该做的是为统一的字节码和虚拟机制定一个 Web 标准。只要 JVM 或者 CLR 没有把我们绑定到某一种特定的语言上,我们就可以选择。Dart 可能比 Javascript 更好(希望如此),但是这并不意味着它就是银弹。如果我们创建标准化的字节码,那么具体的语言我们就不必关心了。 这就是我想要的。我希望能够选择动态类型还是静态类型,低性能还是高性能。我们已经做了不少 Javascript 的替代品(CoffeeScript、TypeScript、ScriptSharp、GWT 等等),但是它们本质上都利用 Javascript 作为底层的字节码。

xxgreg(回复 PervertRyan):字节码存在一系列问题——1. 验证,你需要验证字节码是否安全。这个过程会像解析源代码一样缓慢。更糟糕的是,难以确保安全。2. 缺少 AST,虚拟机经常额外的修改源代码的初始 AST,从而可以进行运行时优化。字节码经常会导致源代码中的有用信息丢失。3. 尺寸,字节码通常不比源代码小,可能会创建一个压缩的二进制 AST。字节码和虚拟机必须经常做出优化决定。对于虚拟机上的所有语言,虚拟机很难公平对待。

cletus:坦白说,我依然看不到 Dart 的意义,它做出了一些奇怪的选择,比如可选类型。代码在服务器端和客户端共享是 GWT 吹嘘的想法,但最终失败。Dart 看起来又要重蹈覆辙,我对它的成功不太乐观。不过从另一方面讲,Dart 也可能会有不错的前景,它所包含的不少特性我都很喜欢。我认为 Javascript 就像是编程语言界的电子邮件——它无处不在,但是大家都觉得它存在问题,而且这些问题的修补特别复杂。

读者朋友是否看好 Dart 的前景?欢迎发表自己的看法。