3to2
出典: KLablabWiki
目次 |
ActionScript Converter "3to2(サントゥニー)"
ActionScript Converter "3to2(サントゥニー)" とは
ActionScript Converter "3to2(サントゥニー)" は、ActionScript3 で作成した Flash ムービーファイル(SWF) から ABC(ActionScript Byte Code) を抽出し、これを ActionScript2 ソースコードに変換する、コンバータプログラムです。
"3to2(サントゥニー)" は、現在、開発の途中段階にあります。現在は、プログラム変換処理の精度向上や一部の設計見直しなどをおこなっています。
開発の経緯
ActionScript のプログラミング環境については、コンテンツが PC向け(Flash)であるか、ケータイ向け(FlashLite) であるかによって、大きな違いがあります。
PC の Flash Player が ActionScript3 処理に対応して約 1 年が経過し、PC 向け Flash コンテンツの開発においては、ActionScript3 による開発が徐々に浸透してきています。いっぽう、ケータイ向け FlashLite Player については、2007 年 12 月現在最新のプレイヤーである FlashLite 3.0 であっても、ActionScript2 の処理系搭載となっているため、ここで ActionScript3 での開発を行うことはできません。
ActionScript2 から ActionScript3 への移行が始まっている今日、ケータイのみ、もしくは PC/ケータイ双方の Flash コンテンツ開発に関わるクリエイタ/プログラマが、もっと効率的に、楽しく ActionScript プログラミングできるようにならないか.. と思い、"3to2" の開発着手に至りました。
ダウンロード
使いかた
インストール
3to2 の実体は Ruby で書かれたプログラムです。したがって、プログラムの実行にあたっては、Ruby の実行環境が必要となります。ruby-1.8.6 での動作を確認しています。
Ruby 実行環境の準備が整ったら、任意の場所でダウンロードアーカイブを伸長すれば、 AsConverter.rb が得られます。irb 等のインタラクティブな実行環境や、$ ruby -e でのターミナル実行、もしくはその他のプログラム等から AsConverter クラスを読み込むことで、3to2 の機能を利用することができます。
元SWFの用意
ActionScript3 を含む SWF を用意します。Flash IDE でパブリッシュしても良いですし、flex2 SDK に含まれるコンパイラを使用しても良いでしょう。
ダウンロードアーカイブには、サンプルの ActionScript3 コード "Hello.as" と、この ActionScript から作成した "Hello.swf" を同梱しています。
ABC(ActionScript Byte Code) の抽出
AsConverter.rb を用い、用意した SWF を AsConverter#readSwfFile により読み込みます。その後、AsConverter#disassemble により、ABC を逆アセンブルしたソースコードを画面出力します。
irb での実行例:
$ irb
irb(main):001:0> require 'AsConverter'
=> true
irb(main):002:0> ac = AsConverter.new
=> #<AsConverter:0xb7de5578 @disassembled_code="", @head=0, @opcode=[] ..(以下略)
irb(main):003:0> ac.readSwfFile('Hello.swf')
=> nil
irb(main):004:0> print ac.disassemble
DoABC_Flags: 1
DoABC_ActionName: frame1
abcFile:
minor_version: 16
major_version: 46
cpool_info:
int_count: 0
uint_count: 0
: (以下略)
ActionScript2 への変換
前項での AsConverter#disassemble に引き続いて、AsConverter#toAs2 を実行します。
irbでの実行例:
irb(main):005:0> print ac.toAs2
class Hello {
static function main() {
var app:Hello = new Hello(_root);
}
function Hello(mc) {
: (以下略)
動作原理
3to2 は、SWF バイナリファイルのフォーマット仕様に基づき、バイナリファイルを解析し、プログラム変換を行います。動作の流れは次のとおりです。
SWF => ABC(ActionScript Byte Code) の抽出
SWF バイナリファイルは、ファイルのメタ情報などを含むヘッダ部と、各種ムービーの中身となるボディ部から構成されます。ボディ部は、タグと呼ばれる様々なデータ構造を持った構造体を複数含んでいます。Flash Player は、このタグの種別によって、グラフィックの定義やステージ上の配置、フレームの表示、さらには ActionScript の処理を実行しています。
このステップでは SWF のボディ部から ABC を定義しているタグ DoABC(tag type=0x52) を発見し、タグの中身となっているバイト列を、AVM2(ActionScript Virtual Machine 2) 仕様で規定されているフォーマットに基づき、可読なテキストフォーマットに変換します。
SWF バイナリファイルのフォーマットや、AVM2 仕様の詳細については、関連 URL に示した Adobe 社の公開情報をご覧ください。
ABC(ActionScript Byte Code) 解析
このステップでは、前ステップで得られた逆アセンブル後のテキストをパースし、字句/構文解析をします。具体的には、ソースコード前半部でのコンスタント(定数)プールや各種クラス/インスタンス構造体をメモリ上へ適切なフォーマットによりストアします。
ABC(ActionScript Byte Code) => ActionScript2 ソースコードへの変換
このステップでは、AVM2 の動作仕様に基づき、AVM2 の処理シーケンスをエミュレートする形で逐次 ActionScript2 のソースコードを生成します。
AVM2 は ABC 中 Script 構造体配列の最後部で定義されているスクリプトの init_method をエントリポイントと解釈し、処理を開始します。ですので、ABC 後部 Method_body 構造体配列から、指定のメソッドを発見し、その VM instruction code を変換後の ActionScript2 のエントリポイント(function main())として、変換処理を開始します。
AVM2 は VM instruction code を処理する際、2種類のスタックと1つのレジスタを使用します。(このステップの)変換処理の過程においては、VM instruction code を読み込み、これらのスタックとレジスタの動きをエミュレートしながら、適切な ActionScript2 のソースコードに変換していきます。
更新履歴
- swfファイル、abcファイルの読み込みを、binaryモードで行うように修正. (rev2)
- 初期リリース. (rev1)
関連URL
- SourceForge.jp プロジェクトページ
- Adobe Player Licensing
- Adobe ActionScript Virtual Machine 2 (AVM2) Overview (PDF, 400K)
作者
- TOMIDA, Yosuke
- INADA, Naoki
連絡先
- info-asc3to2 <at> klab.org