感谢 Adobe (Macromedia) 的 Flash

原文:Thank you Adobe (Macromedia) for Flash
翻译:dreamana.com

Google trends, Apple, Google Chrome 以及 众多开发者 都对 Flash 赶尽杀绝。在我看来,若没有 Flash,如今的网页技术栈看起来可能是另一个样。

关于本文作者 (Credentials)

我写第一行 ActionScript 2.0 代码时是在 13 年前,那时候通过网页的形式流传。Flash 动画大爆炸,文字特效到处飞,还有 Flash 菜单。另外,我觉得我是世界上在配色方面最糟糕的人。虽然我喜欢 PC,我也不知道那个时候所做的就算是编程了。

若干年后,我写了越来越多的程序,有些用 Pascal 有些用 C ,它们都没有能吸引我很长时间(在大学之前)取而代之我用 Flash 做实验,我非常喜欢那种简单化:让 MovieClip 动起来,时间轴管理,或是做鼠标交互。大学期间,我转向关注 C++98,Verilog 及 SystemC。机缘巧合,我进入了游戏行业,在 GameFactory 工作。在那里我协作开发了 7 个 Flash 项目和 2 个 Unity 4 项目,之后我在 King 做 AS3/C++ 引擎开发者。所有这些都没有让我成为专家,既不是语言,也不是最佳实践。我能达到的那个水平是,觉得 Flash 提供那些 API 和技术很舒适,我可以很好地利用它们。

Flash 的亮点 (Bright sides of Flash)

API

我以前没注意到这方面,但当我作为一个引擎开发者工作之后,我才明白到,想要提供简洁而又有前瞻性的 API 是多么困难的事情。作为一名菜鸟,我只能臆测哪些 API 可以调用。在 Flash Player 上工作 8 年以来,我不记得有任何突变带来的问题。API 足够灵活去添加新功能,到处都非常聪明的设计了传递一个额外配置对象,比如 LoaderContext。例如,当他们要添加一个异步图像解码,不是通过添加额外参数给函数调用,而是 Context 的一个额外属性。这就是 KISS 原则 的实践。

ActionScript 3.0

我喜欢 XML 赋值:var xml:XML = <foo><bar/></foo>; [1]

我喜欢 weak key 的 Dictionary,以及 Object 可以用其他 Object 作为 key。

我喜欢 typed Vector,(但讨厌它性能有点弱甚至即使是用固定长度,以及他们之间的转换)。

我喜欢 for each..in 循环。

(译者注:[1] 这是 E4X 语法之一,可惜最后浏览器厂商都放弃支持了这个特性。而现在 Facebook 的 React 框架却又重新模仿起 E4X 发明了 JSX 语法)

令我感到惊奇的是 JavaScript 都没有这些。如此来自 ActionScript 3.0 的 ECMAScript 4 (ES4) 方式比 ES5 对开发者更加友好。某种程度上 ES6 尝试引入类 (class),但仍有许多缺失特性比如:final classes, private, public, protected, internel 访问权限。显示内联 (explicit inline, 这是偏向于编译器特性多于语言特性),强类型 (幸运的是我们有了 TypeScript),设计得很好的事件系统 (Event System) 以及良好的传播机制 (propagation, 这像是库特性多于语言特性),不会被 undefined 所迷惑,不会被 this 所迷惑,还有静态变量/函数。

文档

在线文档一直用很专业的方式去维护,带有版本区分,本地化语言。SWC 文件可以包含代码库以及 ASDoc,因此 IDE 像 FlashDevelop 之类可以提供代码提示。我希望所有软件都可以这样。

字体及音频支持

获得一个较好的带有一定范围文字的嵌入字体不容易,而最理想是这些字体需要与主 swf 分开下载。这不容易做但是可行的。除了有少许异常之外这运作得挺好,而且在不同平台的浏览器上出来的效果都一样。对于音频也一样,能运作。

Flex

这个对我来说是个神话,因为我从来没有用 Flex 完成过商业应用。但当我用来做宠物项目实验的时候,我非常惊讶它的数据绑定 (data bindings) 运作得很好。

Stage3D and AGAL

FlashPlayer 11 加入了 Stage3D 支持,这是 API 设计得非常合理的一个表现。Adobe 本可以模仿舞台 (Stage) 和显示对象树 (DisplayObject tree) 去做,但取而代之,我们得到了一些低层的 API,以此能够创造出如 Starling, Flare3d 及其他框架。 AGAL 是一个类汇编的 Shader 语言,能够运行于大多数 GPU 上。如果 GPU 加速不可用,仍可以用软件渲染模式运行 AGAL Shader。

Pixel Bender, PrinterJob, Camera, Video Decoding, AMF…

其他这些让 Flash 变得超级强大。

错失机会 (Missed opportunities)

Alchemy 也称作 FlasCC 或 CrossBridge (Alchemy aka FlasCC aka CrossBridge)

这套工具集能够将 C++代码编译成 SWF。这提供了一个基本平台抽象,能让 C/C++项目几乎完全重现出来。

例如,可以看看这个 Quake2 编译成 SWF 的 demo:

此时,我暂时找不到那个曾经让我吃惊的 demo,那是个用通过 Alchemy 实现的用 Flash 运行的 Windows (98 IIRC)。那个是慢得可怕,但能运作。

这个项目是从一个 实验项目(Alchemy) 演变而来的,然后官方工具叫做 FlasCC 再到后来改名为 Adobe Crossbrigde 再到最后变成一个 开源项目

时至今日,Emscripten 是 FlasCC 精神上的替代者。幸运地它有一个不同的模式:开源 + 强大的社区,于是似乎会成为更成功的技术。

缺少 HTML5 输出 (Missing an HTML5 target)

社区里都 叫喊着 要输出 HTML5 格式这个功能,我也明白那些人说是 OK 的,那只是处理有限的功能集合来输出可以用的 WebGL/ASM.js/WebAssembly 版本。据我目前所知,现在 (完美实现) 是不可能的。太差劲了。

Mozilla 尝试用另一种方法对付这个问题。Shumway 项目目标是提供一个能播放 SWF 文件的基于 JavaScript 的 Flash 虚拟机。现在这个项目貌似已经死了。

开源的 AVM2 (Open Source AVM2)

当前的境况,我看到只有一种方法能维持 Flash 支持。这需要 Adobe 一个勇敢的举措,将 Flash Player(AVM2) 开源。这是关键的触发一个社区去创建一个 WebAssembly 版本的 Flash Player (很可能没有全功能的)。但等一下,已经有一个在 Adobe’s GitHub 上,Mozilla 也有个 Tamarin,别忘了还有 Linux 的 Lightspark。开源模式有什么问题呢?

看了 fork tree 之后,看起来像有人在做:

准确一点是 keyhom’s fork on avm2pluscc branch。与此同时 Adobe 并没有在他们的代码仓库中做些什么。我不能辩解为什么在那些项目上没有什么牵头。

Thank you!

Flash 是个非常棒的激励因素,促使浏览器厂商去改进他们的技术。它“曾经是”且“仍是”一个如何设计及维护代码库 API 的典范。Flash 鼓励了众多有热情的人们去成为开发者。最后,感谢开发团队所做的出色工作及如此长时间开发并维护这个产品。


在 HackerNews 上讨论:https://news.ycombinator.com/item?id=14800953