ActionScript 版本:AS1、AS2、AS3 与两代虚拟机
AS1、AS2、AS3 到底差在哪?顺着 AVM1、AVM2 和 SWF 里的脚本标签,拆开作品页上的版本标记。
Flash 保存计划 · 最近整理于 2026年7月30日
本文目录 · 9 节
ActionScript 是 Flash 用来控制时间轴、响应输入、编写游戏规则和访问网络的一族语言。AS1、AS2、AS3 看似是三次连续升级,对成品 SWF 而言却有一条更重要的分界:AS1 与 AS2 都由 AVM1 执行,AS3 则使用重新设计的 AVM2。
源码经 Flash Professional、Flex SDK 等工具编译成字节码,再嵌入 SWF 交给播放器。归档器看到的是最后一层:标志、标签和字节码;原始 .as 文件里的注释、排版和许多工程信息早已不在其中。
先分清三个层次
| 层次 | 它回答的问题 | 例子 |
|---|---|---|
| 源语言 | 作者用什么语法和编程模型写作? | AS1、AS2、AS3 |
| 虚拟机 | 播放器用哪套运行时语义和指令系统执行? | AVM1、AVM2 |
| SWF 结构 | 编译后的程序以什么标志、标签和字节码装入文件? | FileAttributes.ActionScript3、DoAction、DoInitAction、DoABC |
这三层互相关联,却不是一回事。SWF 文件版本 只说明这个容器能装什么:较新的 SWF 照样可以装 AVM1 内容;AS2 名字里虽然有“2”,跑的也不是 AVM2。同一组字节码还可能来自不同工具和源码写法,反编译器拼回来的只是近似代码,不是作者当年的工程原稿。
为什么作品页会写 AS2、AS3 或 none
我们不会把脚本跑一遍再猜版本,只看文件留下的几样线索。顺序是这样的:
FileAttributes的ActionScript3位为 1,则标为AS3;- 否则,只要出现
DoABC,或提取器内部称为RawDoABC的旧式 ABC 容器标签,就标为AS3; - 否则,只要出现
DoAction或DoInitAction,就标为AS2; - 都没有命中时,标为
none。
偶尔也会碰到新旧信号挤在一起的文件,这时 AS3 优先。这里的 AS2 更像 AVM1 家族的展示名:一部用 AS1 写成的老作品,只要顶层出现传统 Action 标签,也会落入这一栏。AS3 说明文件明确声明 AS3 或装有 ABC,却不会顺便透露编译器。none 也只是这四类线索都没出现;动作仍可能藏在按钮、影片剪辑事件或 DefineSprite 里面。
| 展示概念 | 源语言特征 | 执行引擎 | 常见 SWF 载体 | 成品 SWF 留下多少线索 |
|---|---|---|---|---|
| AS1 | 时间轴脚本、函数与原型链风格 | AVM1 | DoAction、按钮或影片剪辑事件中的 Action 记录 |
很难与 AS2 稳定分开 |
| AS2 | class、extends、接口、类型注解;大量类型信息主要服务于编译期检查 |
AVM1 | 与 AS1 相同的传统 Action 记录,常见 DoAction、DoInitAction |
能看出 AVM1,未必能证明源码是 AS2 |
| AS3 | 新的语言与 API 模型,运行时类型信息、命名空间、密封类、E4X 等 | AVM2 | FileAttributes.ActionScript3、DoABC 中的 ABC |
通常能认出 AVM2 / AS3 |
| none | 未判定 | 未判定 | 没有命中上述四类标签或标志 | 只是眼下没找到这些线索 |
AVM1:AS1 与 AS2 共享的执行引擎
AVM1 执行 ActionScript 1.0 和 2.0,后来的 Flash Player 9、10 仍保留它以兼容旧内容。DoAction 保存一串 ACTIONRECORD,通常随相应帧的 ShowFrame 执行;DoInitAction 关联影片剪辑,在初始化阶段运行。按钮状态转换和影片剪辑事件也可以携带同类动作。
这套共同的动作模型正是 AS1、AS2 难从成品中分家的原因。AS2 增加类语法、接口和编译期类型检查,却没有更换 AVM1 及其原型继承机制;运行时的值仍是动态类型。
ActionScript 1.0(AS1)
AS1 代表早期、以时间轴为中心的编程方式:程序常直接写在帧、按钮或影片剪辑事件上,用函数、对象和原型链组织行为。编译后,它只剩 AVM1 能理解的 Action 记录,通常不足以让归档器断言原作者用的是 AS1 还是后来的 AS2 语法。
ActionScript 2.0(AS2)
AS2 在旧执行模型上提供了更适合大型项目的源码结构,包括 class、extends、public、private、接口和类型注解。类语法最终仍建立在同一套原型链与 AVM1 之上,并没有换成 AS3 的运行时类型系统;类型信息也主要服务于编译期检查。
AVM2:为 AS3 重新设计的虚拟机
AVM2 是为 ActionScript 3.0 从头设计的新虚拟机。它读取 ABC,其中有常量池、类型、方法和 AVM2 指令,并经历装载、链接、验证和执行。2006 年,Adobe 将 Flash Player 9 所用 AVM2 的源代码贡献给 Mozilla,形成 Tamarin 项目;这段历史也说明语言规范与执行语言的虚拟机是相关但不同的两层。
ActionScript 3.0(AS3)
AS3 以 ECMAScript 为基础,但在架构和概念上都不同于早期 ActionScript。它保留更多运行时类型信息,采用新的类与属性模型,提供命名空间、运行时异常、int / uint 等类型,并实现 E4X;显示列表、事件和许多 API 的用法也随之改变。老项目迁移到 AS3 通常是实质性移植,不是换几个关键字或切换发布选项。
在 SWF 容器层,AS3 编译结果以 ABC 块装进 DoABC 等标签,再由 FileAttributes.ActionScript3 指明运行模型。按 SWF 的规则,声明为 AS3 的文件不应混用传统 AS1/2 动作;播放器会忽略其中的 DoAction、DoInitAction,按钮结构也不能再携带旧式条件动作。
版本标签不等于兼容性评分
脚本家族不是兼容性评分。Ruffle 对 ActionScript 1、2、3 都已有较好支持,但项目仍在完善;一部作品能否完整运行,还取决于它实际调用的 API、网络协议和媒体功能,而不是标签写着 AS2 还是 AS3。SWF 9 以上也不自动等于 AS3,仍须查看 ActionScript3 标志与 ABC 结构。
成品 SWF 同样不能还原完整工程。注释、排版、部分名称和工程结构可能在编译时消失,优化还会改变代码形态。产品信息有时能提供工具线索,但不能由 AS2 或 AS3 单独推出。
相关词条
- SWF 文件版本:文件格式版本与播放器能力的关系。
- SWF 标签字典:
DoAction、DoInitAction、FileAttributes与DoABC在文件中的作用。 - Adobe Flex 制作与编译信息:Flex SDK 如何产生 SWF 并留下工具链指纹。
- SWF 压缩方式:脚本分类与 FWS、CWS、ZWS 压缩是彼此独立的维度。