从 Java 开发者的角度看 ActionScript 虚拟机

阅读数:1038 2007 年 11 月 14 日

话题:JavaRuby开源架构DevOps语言 & 开发

ActionScript Virtual Machine 2(AVM2)在 Flash Player 9 运行时环境中执行 ActionScript 3.0(AS3)字节码。ActionScript 3 是一种面向对象编程语言,用于在 Adobe Flex 和 AIR 中构建 Flash 应用程序。AS3 完全符合ECMAScript 标准第 3 版。

对 Java 开发者来说,虚拟机的概念并不新鲜,但 AVM2 中还是有好些特性值得一观。Per Olesen 上周发表了一篇博客文章讨论 AVM2 中若干值得注意的特性,包括:强类型、方法闭包、即时(JIT)编译器和垃圾收集。

类型信息

AS3 支持强类型,Olesen 说:

在 AS3 之前,代码编译后所有类型信息都会被剥除。在运行时,所有东西都只是动态类型的小原子。从 AS3 起,类型信息会一直保留到运行时。

……使用类型明确的变量可以提高性能表现和降低内存消耗。

方法闭包

AS3 支持方法闭包,Olesen 说:

AS3 给我们提供了方法闭包,也就是说我们可以创建实为函数的变量,并四处传递它,而该函数仍然保持着它被创建之时的上下文环境(也就是说“this”仍然是定义函数时的那个“this”)。

在 Gary Grossman 和 Emmy Huang 的文章《Action Script 3.0 概观》中,他们描述了方法闭包的主要用途:

由于方法闭包,ActionScript 3.0 中的事件处理得以提供内建的事件委托,从而得到了简化。

myButton.addEventListener("click", someMethod);

即时(JIT)编译器

JIT 编译这种技术将字节码转换成原生机器码来提高性能。Adobe 的文档《ActionScript Virtual Machine 2 (AVM2) Overview》详细解说了它对开发者的影响:

在实践中,AVM2 可经由 JIT 在运行时转换代码,但这并不会影响程序执行的语义,只会影响性能。

Olesen 指出了开发者应当注意的一个影响:

AVM2 的 JIT 有一个地方应该注意:构造器是不被 JIT 的,因此如果你的一个类里有严重影响性能的代码,把它移出构造器。

垃圾收集

Olesen 从大框架上描绘了 AVM2 中的垃圾收集:

内存管理和垃圾收集器属于 MMgc 子项目。它采用了一种延迟引用计数(Deferred Reference Counting,DRC)机制,并结合一个增量的、保守的标记 / 清除收集器。当然,垃圾收集器实现已经为达到最佳的客户机性能作了优化,它使用小尺度(30ms)的时间片。

如果读者想查阅更多资料来源,Farata Systems 有一篇文章详细比较了 Java 5 和 ActionScript 3 的语法异同。另外,在Mozilla Tamarin Project的资料中可以找到 AVM2 的更多信息。(译注:Tamarin是 Adobe 将 AVM2 捐献给 Mozilla 之后的产物,目标是构建一个高效、开源的 ECMAScript 4 实现。)Tamarin 是 Flash Player 9 和 AIR 平台使用的 AVM2 实现。另外,Adobe 有一个专门为 Java 开发者服务的 Flex 社区网站:http://flex.org/java/

对于 Java 开发者来说,ActionScript 的语法以及虚拟机架构与 Java 都有不少相似之处,这应当会让学习过程变得轻松一些。

查看英文原文:Understanding the ActionScript Virtual Machine for Java Developers