ABC

パッケージ関連のABC

パッケージ関連のABCを淡々と貼るよ。 要約 publicな関数はNamespaceを使う internalな関数はInternalNamespaceを使う グローバルや階層パッケージ(flash.display.*など)は特別扱いされない グローバルでinternalな関数 package{ function f(){ return "glob…

ifが返す値の型はそろえないとダメ

ABC

ABCプログラマのみなさん、こんにちは。ABCは文書化されていない仕様が多いことで有名ですけど、今日もひとつ新しい仕様を発見しました。 if式(?:演算子)が返す値の型は統一しないといけないみたいです。 ダメなやつ (if #t (f) 10) 自前の処理系であるHappy…

ブランチ切った

Sceme-abc - みずぴー日記クラスをサポートするために、いろいろと試してみたかったのでブランチを始めて切ってみた。Networkでブランチが可視化されるのは楽しいかも。よく分からないけど、git branchでブランチを切ったあと、 $ git push --allのように--a…

SWFをダンプしてみた

SWFの仕様書とHello,worldのダンプを見比べてみた。あいかわらず、アンドキュメントな仕様があるっぽいな。 使ったHello,worldはこんなの。 package{ import flash.display.*; import flash.text.*; public class Hello extends Sprite { public function He…

swfからabcの切り出し

swfからabcを切り出してディスアセンブルする方法は、OSS で SWF をデコンパイルする(2) - swfassist と abcdump で亜流デコンパイラ - てっく煮ブログ 跡地あたりに書いてある。ただ、AIRが必要だったり、入力ファイル名が固定だったするあたりが嫌だったの…

ByteCodeDisassemblerを作ってます

http://www.libspark.org/browser/air/ByteCodeDisassemblerscheme-abcをswfを吐けるようにしたい。というわけで、as3/ByteCodeDisassemblerをAIRに移植しつつ勉強してます。とりあえず、SWFの仕様書は印刷してみました。

クラス関係のABC

クラス関係のABCを淡々と貼るよ。 空定義 class Hoge{} class private::Hoge extends Object { function private::Hoge():* /* disp_id -1*/ { // local_count=1 max_scope=1 max_stack=1 code_len=6 0 getlocal0 1 pushscope 2 getlocal0 3 constructsuper …

浮動少数サポート

http://github.com/mzp/scheme-abc/commit/3cf6fa7c5c3719ebce25bdebcc17d21d1bed76c8 id:llaさんとid:MaDさんのおかげで浮動小数が使えるようになった。 (print (+. 1.0 2.2)) 浮動小数演算は、OCaml風に+.や*.にしてみた。Gauche風とも言える。

doubleを整数に変換したい(バイトコード的な意味で)

IEE 754倍精度浮動小数をバイト列にエンコードしたい。Cとかなら簡単に変換できるのだけども、OCamlでやる方法が分らない。 union { long n[2]; double f; } x; x.f = 42.0; // x.n[0]とx.n[1]がエンコードされたやつ ちゃんと仮数部と指数部を抜きだして、…

再帰サポート

http://github.com/mzp/scheme-abc/commit/520b7e7a3f4ebe086a5aaedfb0b51627333b1909再帰が使えるようになったぜいっ!letrecでもdefineでも使えるようになってます。 (letrec ([fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1)))))]) (print (fact 10)…

ユニットテストの結果出力を改善

http://github.com/mzp/scheme-abc/commit/cabe7a3139fbab0bb5b885e466f127a8f96d0538再帰を実装するまえに、細かい部分の手直しを。ユニットテストの出力がものすごく見づらいので、ちゃんと読めるようにした。昔の。 OUnit: expected: ("", 0, 0, 0, [15; …

再帰関係のABC

再帰関係のABCを淡々と貼るよ。callerとcalleeは意図的に無視してるよ。あと、Yコンビネータとか。 普通の再帰 function forever(){ forever(); } var undefined():* /* disp_id 0*/ { // local_count=1 max_scope=0 max_stack=1 code_len=7 0 findpropstric…

クロージャ対応

やっとクロージャが使えるようになった。 (define (k x) (lambda (y) x)) (print ((k 10) 20)) 大変だったけれど、できてしまえばたいしたことない。 実現するにあたって、レキシカルスコープの実現方法を変更した。 レキシカルスコープの実現 いままでは、P…

クロージャむずい

クロージャ、難しすぎる。 スコープには間違いなく値が格納されているはずなのに、findpropertyで探せない。なぜだ・・・。

変数回りの整理

変数回りの仕組みで、頭がごちゃごちゃしてきたのでちょっと整理してみる。 実現方法 変数はAVM2では、スコープオブジェクトのプロパティで実現する スコープは、いくつか積み重ねれる。スコープチェーン? スコープチェーンからプロパティを持つオブジェクト…

abcdumpで無名関数がダンプされない

クロージャの実装方法を探るために、いろんなABCをダンプしていて気がついたのだけれども、tamarin付属のabcdumpで一部のメソッドがダンプされないことがある。 function f(){ return function(){ // ダンプされない return 42;} } 直感的には関数内部で定義…

GetOuterScope

クロージャがなかなか実現できないので、0xEDで直接、バイトコードをいじって色々試してる。どうも、AVM2に載ってない謎の命令、getouterscopeが鍵っぽい。

Tamarinデバッグビルド

いままで、「Tamarinデバッグビルドはどうせ、Tamarin本体を開発する人以外には関係ないだろ」と思っていたけれど、意外と便利。 特に、"-Dverbose"と書くとコンスタントプールの中身やスタックの変化とかを出力してくれて、相当便利。 mac 23:25:26 $ avmpl…

リファクタリング

http://github.com/mzp/scheme-abc/commit/fc33594ecfb5d4df926e88ffb9b41cf0f9b763d4AST上で(+ 1 2)のような加算と(print "hello")のような関数適用を区別する必要はない、というあたりまえのことに気がついた。なので、コードがちょっとだけ短かくなった。…

スコープの管理

AVM2のスコープ管理についてメモ。相当賢く管理してて、簡単にクロージャを実装できるようになっている。まずは基本。 スコープはスコープスタックという専用のスタックで管理されている スコープ・スタックには任意のオブジェクトを積める。そして、ECMAScr…

総合テストを追加

今まで、新機能を追加するたびに、簡単なプログラムを書いて、ちゃんと実行できるか確かめてきた。 せっかく機能をテストするためのプログラムがたくさんあるんだから、自動で実行して、結果が変化してないか確認するようにした。実行するスクリプトと、それ…

defineサポート

defineが使えるようになったぜい。 $ cat example/define.scm (define x 42) (define (inc x) (+ x 1)) (print (inc x)) $ ocamlbuild main.byte -- example/define.scm Finished, 47 targets (47 cached) in 00:00:01. $ avmplus a.abc 43 でも、internal d…

引数と返り値サポート

http://github.com/mzp/scheme-abc/commit/ee63e8f23b70c61ab5e0e9f5fbccd5dfc57b2b61 yn$ cat example/lambda.scm (let ((add (lambda (x y) (+ x y)))) (print (add 2 3))) $ ocamlbuild main.byte -- example/lambda.scm Finished, 53 targets (53 cached…

無名関数サポート

http://github.com/mzp/scheme-abc/commit/9e468c756dda1a20290686743f77408f187432b1とうとう関数が使えるようになった。 $ cat example/lambda.scm (let ((f (lambda () (print 42)))) (f)) $ ocamlbuild main.byte -- example/lambda.scm Finished, 53 ta…

TwitterにGitHubのコミットログ

http://twitter.com/scheme_abcTwitterにGitHubのコミットログを出すようにしました。

関数関連のABC

関数に関係したABCを淡々と貼るよ。traitも調べないと無意味な予感はしてる。 サブルーチンっぽいやつ function f(){ } f(); 2 newfunction var undefined():* /* disp_id 0*/ 4 getglobalscope 5 swap 6 setslot 1 8 findpropstrict f 10 callproperty f (0…

letサポート

http://github.com/mzp/scheme-abc/commit/64fc87159119894bff8b2ada6ea97b488ca2f7f5とうとうletが使えるようになった。レキシカルスコープが使えるのはAS3に対して、アドバンテージになるんじゃね? $ cat example/let.scm (let ((x 42)) (let ((x 10)) (pr…

レキシカルスコープの実装が難しい

AVM2でレキシカルスコープを実現したいけれども、中々難しい。そもそもの原因は、ActionScript3の元となっているECMAScript3にレキシカルスコープが存在しないことにある。 とりあえず現状をまとめてみる。 各クラス・インスタンス・関数などは、Traitと呼ば…

if文サポート

http://github.com/mzp/scheme-abc/commit/e54efa5c0092f49ae892cb15a14fa67816d89099 if文が使えるようになった。正確にはif式だけれども。 $ cat example/bool.scm (if (< 1 42) (print "big") (print "small")) $ ocamlbuild main.byte -- example/bool.s…

変数関係の命令

AVM2で、どうやって変数を実現するか調査中。とりあえず、スタックの番号と名前の対応表がいる予感。 例 Flex3 SDKのasc.jarで var x=42;をコンパイルすると、 2 pushbyte 42 4 getglobalscope 5 swap 6 setslot 1が得られる。 関連してそうな命令 命令 補足…