Flash 与 ActionScript

Macromedia 公司的 Flashg(后来被 Adobe 收购)在 2000 年代初问世,成为了人们在构造富互联网应用时,对 Java 和 JavaScript 的流行替代品。Flash 最初是一个基于时间轴的动画产品,建立在 Jonathan Gay [2006] 工作的基础上。Flash 附带了视觉创作工具,它能将基于动画的应用编译为二进制文件,这些文件由 Flash Player 解释执行。播放器组件可以通过浏览器的插件扩展 API 集成到浏览器中。在巅峰时期,几乎所有浏览器用户都安装了 Flash 播放器 [Adobe 2013]。

最初的 Flash 创作主要是偏视觉化的,但它的功能还包括编写简短的文本「动作」(action),以定义对各种时间轴事件的响应。在 1999 年 5 月发布的 Flash 4 中,Gary Grossman 将 Flash 动作演变成了一种简单的动态类型脚本语言,其语法与 JavaScript 相似。随着 2000 年 Flash 5 的发布,这门脚本语言成为了 ECMAScript 3 的方言,并被命名为「ActionScript」。ActionScriptg 1.0 支持大多数 ES3 语句和基于原型的对象,但缺乏对正则表达式的支持,具有非标准的 eval 函数,这种 eval 只能求值一组受限的变量访问表达式,此外还有各种其他细微的语义差异。由于 ActionScript 代码被编译为仅在 Flash Player 环境中运行,因此并不必严格遵守 ECMAScript 规范的语义。例如在 ActionScript 1.0 中,var 声明的作用域是最接近它的封闭块,而非整个封闭函数。

在 2003 年,ActionScript 2.0 作为 Flash MX 开发环境和 Flash Player 6 的组件发布。它扩展了 ActionScript 1.0,支持类声明、接口声明、声明中的类型注解,以及用于访问其他脚本中定义的类的 import 语句。其中,类的类型注解、类声明和接口声明的语法大致遵循了初版 ES4 与 JS2 规范草案中使用的语法,但语义则大大简化。对类型注解的使用是可选的。类型检查属于仅限编译期的特性 [Macromedia 2003]。如果提供了类型注解,语言会在编译时执行类似 Java 的名义化类型检查。但在生成代码前,类型信息会被擦除。ActionScript 2.0 使用了与 ActionScript 1.0 相同的虚拟机,并执行基本的运行时安全检查。程序可以按违反名义化类型系统规则的方式来动态修改对象,只要这些更改不会触发任何运行时安全检查即可。

在 2003 年,Flash 在 Web 开发中获得了广泛的应用,这带来了复杂的大型 ActionScript 应用,其中有一些遇到了性能问题。与当时的大多数 ECMAScript 语言设计者和实现者一样,Macromedia 团队认为61动态类型(尤其是原始类型)导致了主要的性能瓶颈,并且正在探索向 ActionScript 运行时添加静态类型的方法。大约在同一时间,自 1998 年以来一直担任 TC39 代表的 Jeff Dyer 加入了 Macromedia。Dyer 确认了 TC39 对静态类型持有相同的观点。这种在基于虚拟机的语言中应用静态类型的观点广为流传,受到了对静态类型 Java 虚拟机(JVM)设计的强烈影响。Macromedia 的 Jonathan Gay 和 Lee Thornason 研发了实验性的 Maelstrom 项目,旨在研究 JVM 是否可以集成到 Flash 中,并用作静态类型版 ActionScript 的运行时。这个实验非常成功,以至于 Macromedia 向 Sun 就有关将 Java 2 Micro Edition(J2ME)版本 JVM 用于 Flash 的许可进行了洽谈。他们想使用 J2ME 的理由,是因为标准版 Java 运行时太大,无法嵌入 Flash Web 下载。但是 Macromedia 这项对使用 Java Micro Edition 技术的提议,与 Sun 的 Java 许可策略并不相符。于是 Edwin Smith 经过大量工作,创建了一系列概念验证性的虚拟机。这些虚拟机帮助 Macromedia 构建了自己的静态类型 JVM 式虚拟机 AVM2 [Adobe 2007],并在其上运行了新版本的 ActionScript。这种新语言是由 Gary Grossman,Jeff Dyer 和 Edwin Smith 设计的,它受到了 Horwat 的初版 ES4 / JS2 规范草案的重度影响。但是与 JScript .NET 一样,ActionScript 3.0 是初版 ES4 设计的简化。它不像 JS2 那样动态,并且与 JScript .NET 不同的是,它不受 .NET 类型模型的约束。另外 ActionScript 3.0 与 JScript .NET 还有一点相似之处,那就是它们都不会重度受制于旧版的兼容性问题。Flash 会同时附带用于支持 ActionScript 3.0 的 AVM2,以及用于支持 ActionScript 1.0 和 2.0 的 AVM1。这项创建新版 ActionScript 和新虚拟机的工作耗时三年才得以完成,相应产物在 2006 年作为 Flash Player 9 的组件而发布,最终于 2007 年交付。在工作完成之际,Adobe 收购了 Macromedia,而 Flash 则成为了 Adobe Flash。