Run c/c++ in flash, again !

In General, flex   July 8, 2008 - 3:50 pm

最近仍然持續極度忙錄中,但有趣的新消息卻仍然不斷冒出,抽空趕緊寫一下。

還記得去年 Max 2007 時 Adobe 的神人 Scott Petersen 展示了一個 flash 版的 Quake 遊戲嗎?那時他使用的技術,例如 LLVM 等,現在已經變的更成熟,而且離正式推出更近一步了。

根據 toolness.com 的報導,Scott Petersen 最近在 Mozilla 給了場演講,說明了 LLVM 與 Tamarin 的運作關係,以及如何讓 c/c++ 程式可以跑在 Tamarin 上,下面是基本的 steps

1. c -> LLVM instructions (using slightly modified version of llvm-gcc)

c/c++ code 透過 llvm-gcc (可能有動手腳稍微改過以符合 Tamarin 的需要) 編譯成標準的 LLVM instructions (IR)

2. LLVM instructions -> opcode (run by LLVM virtual machine in as3)

這些 llvm instructions 再經由一個用 actionscript 3 implement 的 virutal machine 處理成底層的 opcode

3. as3 -> bytecode -> machine code

而東西一旦變成 as3 剩下的就好處理了,它會利用 flash player 既有的功能去處理 bytecode 與 JIT machine code 轉換,然後就可以在每個人的 browser, desktop 與 mobile devices 上跑了。

由上面三個過程可知,真正的關鍵在於 #2 的 llvm virtual machine,它能將 llvm 轉換成 flash player 可吃的 opcode 進而達成『介接』的目地。

並且,據 Scott 指出,他同時也設計了一個特別的 byte array 來 directly mapping the system ram, 籍此降低模擬時的耗損並提升效率,這也是為何 Max 2007 上那個 Quake game 會嚇死人的快。

*這樣做的好處是?

當然任何理性的人都會接著問,這樣做有什麼好處呢?答案是好處多的很吶~

1、由於他的 toolchain 支援 llvm-gcc,因此理論上,任何 c-based 的語言都可以吃進去,這包含了php, ruby, perl, python 甚至 java 與 objective-c ,只要這個語言能用 c compiler 編譯,就可以編譯成 llvm-instruction 然後在 flash player 裏執行。

因此,過去一狗票現成的 library 都可以拿來重覆使用,不需使用 actionscript 重寫,也不需為此特別把某些工作丟回 server 上去跑。

也因此,才會出現有人想惡搞,把 WINE port 上 flash 然後讓它跑 windows 程式 (flash player running on windows with windows application inside ?) XD

2、另一個更隱誨的好處則是

這可能徹底的改變人們編寫 web application 的方式。

基本上大部份人都會承認,現行用 javascript/html/css 寫 web app 實在不是那麼的理想(well, I’m really trying to put it very nicely here…),如果能讓開發者直接用熟悉的語言(會 php 的請舉手?ruby 呢?)一路從 backend 寫到 frontend,這不是方便許多?

3、別忘了 Tamarin

Tamarin 是 Adobe 在 2006 時捐出去的一個 ECMAScript VM,目前由 Mozilla 基金會與Adobe 共同開發維護中,將來會用在 SpiderMonkey 中,並出現在下一版的 Firefox 4裏。

而 Tamarin 與 flash player 系出同門,這代表,將來 llvm 的東西也可以跑在所有支援 SpiderMonkey 的 browser 裏,至少 Firefox 就少不了,所以 nay-sayers against flash 不用急著跳著搖頭,你們也有的爽 :P

4、當然也別忘了 air

對我們而言,能在 browser 裏跑 php, ruby 等其實價值不大,因為它 code base 的積體可能是個問題,但對一支 desktop app 來說,這些就不會是太大的 concern,我們可以儘情的 mashup 任何需要的語言、技術來個大鍋炒,不用重新再造輪子,這才是最有價值的地方。

*缺點?

-Object model 不相容

現階段雖然可以讓 c/c++ 程式跑在 flash player 上,但它們與 actionscript 的 object model 卻完全不相容,因此要 inter-op 可能還有段路要走,但 Scott 說這件事已在進行中了。

oh, 如果你對 inter-op 不瞭解,可以想像一下 JRuby 與 Java 的運作關係,或是 Objective-C 與 C++ 的關係,就差不多是那樣。

-速度夠快嗎?

LLVM interpreter 是用 as3 寫的,等於是 interpreter (flash player) 再加上 interpreter,執行速度可能是個問題(也因此 Quake 展示時它背後用的 byte array 有動過手腳,直接可 map 到 system mem 減少了一些 simulation overhead)

*延伸閱讀

-名詞解釋部份

LLVM GCC

LLVM 是什麼?

Using LLVM, one can create a virtual machine for languages that require a code generator for a specific machine architecture, and optimizers independent from particular platforms or languages. The LLVM intermediate representation (IR) is language and architecture independent; it lies between a language-specific module and a code generator for a specific machine.

-Ryan Stewart 去年專訪 Scott 的文章(個人認為這篇裏面講的細節更多,也比較正確)

Ryan Stewart 專訪 Scott Pertersen

by admin

1 Comment Add your own

  • 1. 数字化海洋 » B&hellip  |  July 8th, 2008 at 10:44 pm

    [...] Adobe的Scott Petersen上周在Mozilla谈论了他创造的工具链(Toolchain)——不久后将开源——可以让C代码跑在Tamarin虚拟机上(相关中文描 述)。工具链包含了许多其它方面的细节,如一个定制的POSIX系统调用API和C多媒体库,让程序运行在flash上。Petersen设计一个特别的 byte array去直接贴图到RAM,因此降低模拟时的耗损并提升效率,可以让游戏之类的应用跑起来飞快。这样做的好处能在flash中以可接受的速度执行任何 基于C的代码,如php、ruby、perl、python甚至java与objective-c。Petersen演示了一个flash版的Quake 游戏,以及在一个基于C的任天堂模拟器上跑Zelda,两者都完全可以玩,包括了音效和音乐。 [...]

留言回應

hidden

您的留言會先經過站長認証後才刊登在網站上。
your comments will be approved by Administrator before appearing on the page.

Trackback this post  |  Subscribe to the comments via RSS Feed

mobile phone