WEB开发网
开发学院软件开发Java Google Dart精粹:应用构建,快照和隔离体 阅读

Google Dart精粹:应用构建,快照和隔离体

 2012-03-16 15:38:28 来源:WEB开发网   
核心提示: 接口通过名称来引用某个工厂,而工厂可以用库的方式进行提供;工厂的不同实现可以存在于它们自己的库当中,Google Dart精粹:应用构建,快照和隔离体(2),且由开发人员决定包含最好的实现,语言Google Dart是一门新型语言,至于Dart能够用在何处仍然有待观察,正如前面所述,但它设计成让多数开发人员看起来

接口通过名称来引用某个工厂,而工厂可以用库的方式进行提供;工厂的不同实现可以存在于它们自己的库当中,且由开发人员决定包含最好的实现。

语言

Google Dart是一门新型语言,但它设计成让多数开发人员看起来很熟悉。Dart语言类似花括号语言,它提供面向对象编程(OOP)并重点关注接口。Dart的面向对象编程系统有着类的概念,这与最近一些其他的语言不大一样,如Clojure(它使用协议(protocols)和类型完成面向对象编程)或者Google Go语言(Go有接口,但是没有类)。 语言内置面向对象编程特性的好处在于可以像Javascript一样,拥有一套新的面向对象系统和范式约定的库。

详细信息请参阅官方的Dart语言规范;如果想要快速了解下的话,可以查看Dart网站上的‘Dart惯用法’(Idiomatic Dart)文章。

模块化

Dart中的命名空间采用了库机制,它不同于Java中仅能使用类名来定义方法或变量命名空间。很重要的一点是:Dart中的库除了包含类之外,还可以包含顶级元素,即类之外的变量和函数。

print函数正是一个例子,因为它是无类的顶级函数。库系统也为名字冲突提供了一种解决方案:库A可以导入另一个库B,为了避免A和B间的命名冲突,所有从库B中导入的名字都会被加上前缀,也就是说,使用#import("foo.dart", "foo") 导入库后,所有其中的可用元素都会拥有前缀"foo."。

可选类型(Optional Typing)

“可选类型”关键在于“可选”。开发人员可以为代码加上类型标注,但这些标注又对代码行为根本没有影响。事实上,Dart中还可以指定一个无意义类型——而同时代码仍然能够正常运行。

在代码中拥有类型可以让各种类型检查器各司其职。Dart附带的编辑器中拥有一种类型检查器,它能够高亮类型错误并将其当做警告。Dart中还有一种检查模式,在该模式中类型标注可用来检查代码,任何违规都会被报告成警告或错误。

实际上可选类型标注在代码中会具有类型信息,这些信息对编制文档会有帮助;使用可选类型不再需要更多的文档来解释某个参数必须实现一个特定的方法才可以接受。接口的存在(即带有方法签名的方法名称集合,以及可选类型标注)可以帮助文档化API。

关键在于,语言总是动态的而且参数也可以被指定为动态的,也就是Dynamic类型。

运行时可扩展性和可变性——暂缺

让我们看看这些:没有猴子补丁(Monekypatching),没有eval,目前没有反射。虽然基于Mirror的系统正在准备阶段(详情请见介绍Mirrorpaper的论文),但是计划里似乎限制了在新隔离体中加入新的代码,因此这些还不在当前运作的进程当中。

noSuchMethod

Dart的noSuchMethod特性,类似于Ruby的method_missing、Smalltalk的DNU或其他一些语言中类似的特性。未来版本的Javascript也应当以动态代理(Dynamic Proxies)的形式提供类似的功能,这个功能正在缓慢的进入到Javascript虚拟机中(如V8)。

闭合类(Closed Classes),没有Eval

像Ruby这样的语言甚至可以允许在运行时对类进行修改,这些类被称为开放类(open class)。然而不具备这种特性会对性能有所帮助:所有的成员在编译期可见,这样可以对代码进行分析以移除没有被引用过的部分。查看下面的‘批评’段落可以了解Dart中该特性的当前状态以及其他语言中当前已有的解决方案。

未来的语言特性

一种async/await风格的扩展正在被考虑用作帮助编写I/O代码。Dart中的多数I/O API都是异步的,因此那些让这项工作变得更加简单的事情都是受欢迎的。不添加像协程(Coroutine)、纤程(Fiber)及其变种等特性的原因是为了避免增加同步的功能。 一旦协程存在于系统中,就有可能要安排和交错它的执行,此外,想要编写正确的代码就有必要同步共享资源。因此,单线程会是重点;并发会则在隔离体中完成:显式会话、无共享和隔离体等都会参与其中。

批评

没什么能比一门新的编程语言更能惹恼开发人员了。下面让我们快速地看下一些常见的批评。

DartC将Dart代码编译成大量的Javascript文件

这个链接展示了一个Dart的“Hello Word”应用程序被编译成了上千行的Javascript代码。对此一个简单的方案是:增加像tree shaking类似的优化,也就是删除不被使用的函数。目前它已经在Google Dart和DartC团队的待办事项列表中。

Dart的某些特质使得这些优化变为可能,尤其是封闭类,这意味着所有的函数在编译期均为已知。缺少eval就意味着编译器知道编译期间哪些函数被使用,更重要的是:知道哪些函数不被使用,从而可以把那些不被使用的函数安全地从输出中移除。

使用Google Closure工具的用户可能知道其中的高级编译功能。Closure为Javascript带来了一套类系统并允许使用信息标注类。在高级模式中,Closure编译器假定开发人员遵循了特定的规则,基于这个假定,如果某个函数在代码中没有被显式的引用的话,就会被丢掉。显然,如果程序员违反了这些规则,如使用eval等其他功能,那么代码将不能工作。

Google Dart并不需要依赖于程序员遵守某些规则,语言本身的限制为编译器提供了必要的保障。

另外一个使用Google Closure高级编译功能的例子是ClojureScript语言(这是一个带'j'的Clojure)。ClojureScript注定也是一门应用程序语言,它没有eval以及其他的动态代码加载特性。它通过使用Google Closure的高级编译工具编译成Javascript代码,以消除未被使用的库函数。

为什么不使用静态类型对运行时进行优化?

为什么类型是可选的?它既然存在,为什么又不用来提高生成的代码?诚然,知道类型为int必然对优化生成的代码有帮助。

事实证明,Dart背后的团队知道这些想法,因为他们过去做出过一到两个的虚拟机,Google V8和Oracle的Hotspot就是两个例子。

出于若干原因,在Dart中使用静态类型信息对于运行时代码并不会有帮助。原因之一在于:开发人员指定的类型对语义毫无影响,事实上,他们 可能完全不正确。如果是这样的话,虽然类型检查器会发出警告,但是程序还是运行得很好。此外,由于给定的类型可能是无意义的,因此虚拟机并不能使用它们进行优化,因为它们并不可靠。也就是说,int相关的代码可能仅仅是因为开发人员错误地进行了指定,如果实际运行时中的对象的真正类型是String的话。

虽然静态类型系统对工具和文档会有帮助,但是它与执行的代码并不相关。

静态类型没法帮助生成优化的代码还有一个原因:Dart是基于接口的。如int中的操作符实际上是方法调用——接口上的方法调用。Dart不是在开玩笑,int事实上是一个接口而非一个类。

调用接口方法就意味着需要基于实际的对象及它的类信息在运行时进行加载。类似动态调用站点(CallSite)的内联缓存(多态)的概念可以帮助消除方法查找的开销。StrongTalk和它的直接派生HotSpot根据优化后的反馈,以找出实际执行的代码并生成优化后的代码。V8最近同样以Crankshaft的方式加入了这些优化。

我最喜欢的语言特性在那里?

Google发布的Dart还处在一个相当早期的阶段。用户很容易被语言规范、集成开发环境、虚拟机、DartC等搞混。Dart团队给出的明确消息是:现在可以尝试一下Dart,并提供一些反馈。Dart的许多功能已经在计划当中,但是有的尚未完成或者有的尚未开始;反射和混合类型已经提到会被当做潜在功能加入未来特性中。

如果某个特性不在Dart的存储库或语言规范中,现在可以提供一些反馈意见并给出针对语言和运行时环境的修复或改动的建议。

结束语

Dart的许多工作已经完成:语言规范、Dart虚拟机、能够将Dart代码编译成Javascript的DartC编译器、基于SWT和Eclipse绑定包的编辑器等等。

然而,最初发布的Dart只是一个技术预览,语言、API和工具包相关的工作还在进行中。现在可以给Dart团队一些反馈,而且有机会能够影响到该语言。语言将会发生改变,包括本文中提及的一些推荐和计划的改动。

有些人已经开始尝试Dart,例如Dart的Java迁移版本JDart项目已经开始了,它大量使用了Java 7 中的invokedynamic功能。

在本文中,我们重点关注了语言以及Dart虚拟机特性。使用DartC可以将Dart代码编译成普通的Javascript文件;简介部分展示的一些样例,包括那个能够运行在iPad上的例子,实际上是Dart应用被编译成Javascript之后运行在标准浏览器中。

虽然Google Dart最初的开发是秘密完成的,但是整个项目、源码、工具及签单系统等等现在都是对外开放的。至于Dart能够用在何处仍然有待观察。正如前面所述,Dart虚拟机提供的功能使得Dart对客户端开发人员以及服务端开发人员都颇具吸引力。

上一页  1 2 

Tags:Google Dart 精粹

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接