July 2010 Archives

showstopperの歴史は繰り返す...

| No Comments | No TrackBacks

これまで明示的には書いてこなかったのだけど、asparserの目的はひとえにSiONをC#コードに変換できないか、試すというところにある。

今日、asparserがまたひとつ目標としていたステップをクリアして、とりあえずsionのソース中で使用されているflashクラスを把握するところまではできた。やはり多少flash.display.*に依存するところはあっても、ほとんどはUI非依存の部分で出来ているようだ。

ただ、1000件近くあった型名解決と、1750件近くあった型メンバー名解決の次のステップとして、メンバー・変数レベルのシンボル解決が4500件ほどあって、これを解決できればほぼdllがビルド出来るのだけど、さすがに大仕事すぎて困っている。これはすぐには実現出来なそうだ。

もっとも、dllをビルド出来るようになっても、それは実行可能なコードが出来るということは全く意味しない。まともに動作することは期待していない。もし動作するコードを作るのであれば、さらに環境(たとえばオーディオをサポートするsilverlightや、portaudioのバインディング)に合わせてコードを変換する必要があるだろう。dllが出来上がれば、CLI/ILレベルでコードを読んだり書いたりできるので、flashのASTをまともに解決してC#コードの生成前後にinjectさせるようなコンパイラを作るよりは楽なのではないかと思っている。

ここまでは何とか進めてこられたのだけど、ここに来て開発機が死亡するというトラブルが起こって困っている。とりあえず全然使っていなかったmacbookを使っているのだけど、もともとまともなテキストエディタが無くて(TextWranglerで妥協している)開発に向いていない環境なのに加え、改行コードの問題でsionのソースに当てているパッチがきちんと当たらなくなって、さらなる変更を作成できなくなったりなどもしている。

開発環境まわりが変わると、開発がかなり止まってしまう傾向があって、個人的にはダメージが大きい。

実は今年も5月の上旬にWindows7にアップデートした関係で、いろんなことをほぼ最初からやり直すことになり、それまで開発していたものや予定していたものがいろいろ飛んでしまった。同じことは昨年の9月にも起こった(マシンを変えた)。ここのログを見ると勢いが落ちているのが目に見える。

手元のmacbookの問題はもう一つあって、Intel系マシンのくせにまともにLinuxが動作しない。まあそれでもバッテリーを認識しないノートPCよりはマシなのだけど、バッテリー容量を把握できず常に最大輝度で動作するというのは割と困る話だ。それよりも、そろそろLinux/C#/androidの開発環境が出てくるというのに、それが使えないというのでは、たいへん忸怩たるものがある。

それより、このasparserでやりたいことが一段落したら、いろいろ仕切りなおして先に進みたいと思っていたことがあるのに、それが先送りになるのが少なからず苦しいものがある。艱難の時なのかもしれない。

昨日はASTからC#コードのテキストを生成する部分で、実行時例外が出なくなるところまで進めたので、今日は生成されたテキストがまともにC#の文法に沿うよう、コードをがしがし修正していった。

最初は3000件以上エラーがあったような気がするけど、とりあえず全部直した。とは言っても、元のソースの方を簡単に修正することで対応した部分も5,6点はある。変数のスコープの問題で、C#ではエラーになるような変数宣言については、致し方なく名前を変更した。

AS3ではimport文はC#のusingではなくJavaに近く、具体的な型名を指定する。そうでない場合は ".*" を最後に付ける。C#にする時は、.*で終わっている場合は、通常のusing namespace_foobar; にして、そうでない場合はusing xxx = namespace_foobar.xxx ; とすることにした。この関係で、単なるflash型のインポートなら重複はエラーにならないが、C#のusingエイリアスだとエラーになってしまう。これは致し方なく重複をコメントアウトした。

AS3にはパッケージスコープ(?)みたいなものがあり、publicやprotectedやprivateの代わりにnamespaceを指定することが出来てしまう。これはC#にはないので、致し方なくpublicで代用することにした。

今回ソースに手を加えた部分としては、上記のような例外的なものが多い。まあasファイルの差分でたったの440行くらいなので、十分許容範囲だろうと思っている。ちなみにオリジナルのソースは気が遠くなるくらい大きい。

次はflashのランタイムAPIのmockのようなものが必要だ。これが出来上がったら、実行は出来ずともコンパイルだけは出来るようなソースが生成できる。

asparser: moderately ongoing

| No Comments | No TrackBacks

最近はずっとasparserのコードばかり進めている。あまり楽しくない成果になりそうだけど、一応パーサからASTを生成して、ASTからC#のコードを生成するようなところまでは書いた。まだ問題だらけなので実用品にはなっていないのだけど、少しずつ直していこうと思っている。

tsukimiを作っていた頃と、やっていることはそんなに変わらないのだけど、今回は真面目にコードを取り込んだり読解できるようになったりしたいので、もう少し回りくどいことをしなければならなくなるかもしれない。具体的には、AS3のASTからC#のコードを生成する前に、ASTを分析して、C#の構造に合わせられるようにC#向けの別のASTが必要になるかもしれない。

たとえば、C#ではif文やwhile文の条件式の結果はboolでなければならない。AS3では(Cなどと同様)これは自動的に計算される。問題なく変換を行うためには、ASTのツリーで型を判断できるようにしなければならない。型を判断するためには、式オブジェクトの全てに評価型が必要になり、変数などの参照解決が必要になる。これではもう実行コードを直接生成できるコンパイラを作っているのとあまり変わりないわけだ。まあ、if文の評価式は "bool EvaluateAsBoolean(object obj)" みたいな関数を呼び出すようにすれば、問題は回避できるのだけど、boxing/unboxingが入るとパフォーマンスは下がるだろう。

ジェネリック型などは.NETともそれなりに扱いが異なりそうだけど、その辺はまだ調べていないので、まだ構文上の違いくらいしかわからない。

プロパティの構文など、C#とAS3でシンボルの解釈が違う場合もあって(C#のvalueに相当するものが、AS3ではプロパティ名と同じ識別子になる。つまり、それ自身を再帰的に参照することはできない)、注意がいろいろ必要そうだ。

ライブラリという観点では、dogfoodingというか最終的に使おうと思っているオリジナルコードはサウンド系のものなので、あまり標準ライブラリに依存しているということはないだろうと思っているのだけど、まあまだよく分からない。ProcessingCliみたいなものは、大規模なものを作るつもりは無い。そこまで深入りはしたくないところだ。

Renoise Scriptingが興味深い

| No Comments | No TrackBacks

まだ購入者向けの開発版としてしか公開されていないのだけど、Renoise 2.6betaに新しく追加されたRenoise Scriptingが興味深い。Luaを使ってRenoiseの機能を外部スクリプトから呼び出せるようにしようというもので、xrnxというプロジェクトがgoogle code上にオープンソースで公開されている。 https://code.google.com/p/xrnx/

これを使って作られたツールはrenoise toolsというサイトで公開される(できる?)らしいのだけど、既に外部MIDIコントローラをRenoiseに接続するツールなど、なかなかクールな物がある。

Luaをいじったことは一度もないのだけど、どうせ難しくはないだろう。しかしこれで今まで書いたC#のコードを流用できるようになったら、楽しいことになりそうな気もする。というわけでLuaがC#から叩けないものか眺めてみることにした。

それで分かったのは、LuaにはLuaInterfaceというプロジェクトがあって、これにはC#のLuaラッパーが含まれている、ということだ。しかし、外部の説明を見ると、これはP/Invokeしているというのだけど、Lua 5.1を含むLuaInterface 2.0.1をダウンロードして見てみると、どうやらDllImportではなくC++ mixed mode assemblyを使っている。これでは移植性のない残念なコードだ。

もっとも、Lua自体はCで書かれたランタイムをdllとして公開しているので、これをP/Invokeするラッパーを書けば、Lua自体は使い回すことが出来る。Tao Frameworkには(旧公式サイト?はもはやドメイン屋が転売している有様だが)、Tao.Luaというラッパーライブラリが存在するらしい。しかし、そこまで回りくどいのであれば、Luaだけで完結するコードを書いて、手持ちのコードは移植してしまった方が早いような気もしてくる。

いずれにしても、なかなか面白いので、これは機会を見て何か作ってみたい。

asparserの開発中コードを公開

| No Comments | No TrackBacks

しばらく前に、ちょっとAS3で書かれたプロジェクトのソースを読んで、あわよくばC#に移植できないかと思って、一度ちまちまとironyでActionScript3のパーサを書いて、その後ずっと放置していたのだけど、最近になってまた同じ事をやりたくなってきて、作りかけで放置していたパーサに手を入れ始めた。ちょくちょくgistには置いていたのだけど、だんだんソースが増えてきて、というか複数ファイルになってきたので、作りかけでもいいからと思ってリポジトリを作って公開することにした。

まともなパーサとしては機能していなくて、ありもののAS3のソースを解析してエラーが出ていないという程度の代物なのだけど、とりあえずこれでC#のソースが生成できれば、個人的なニーズは満たしている。そもそも未だトークン解析しかできないので、これを実行して得られるものは何もない。これからParseTreeを元にASTを構築して、それからさらにC#のコードに変換するという作業が必要になる。AS3は複雑な文法をもたないので、その機能は概ねC#にコンバートする部分で(構文上は)苦労することが無さそうだ。

コードパーサはironyを使うことにしたが、一度、ironyのAPIがほとんどドキュメントされていないことから、使い慣れたjayに移行しようとして、コードも2000行ばかり書いたのだけど、ironyで問題なく通っているトークン解析の次元で、こちらではハマりそうだったので(トークナイザを自作しなければならなかったし、文法トークンが全てintに置き換わるので実行効率が良くてもコーディング効率が悪く、キャストを頻用するので実行時エラーにも多々悩まされる)、これは泣く泣く捨ててironyで何とかすることにした。ほとんど何も分からなかったAST生成の部分にも多少慣れてきたので、あと肉体労働さえすれば、そのうち出来上がるだろうと思う。

ironyでAS3の文法やJavaScriptの文法を実装する上で面倒なのは、改行でセミコロンを省略できるという部分で、そのせいかIronyにはC#やPythonのコードパーサはあっても、JavaScriptの例は無い。IronJSというJavascript実行環境のプロジェクトがあるので、あわよくばコードを流用してやろうと思って、ソースを見てみたら、(本体がF#で書かれていてびっくりしたということもあったのだけど、)どうやらantlrを使っているようだった。antlrに依存するようになると、それはそれで面倒なので、今回はパスすることにした。

そんなわけで(?)、セミコロンを省略するような表記にはまだ対応できていない。Ironyでは、解析したトークンに対してTokenFilterというものを使うと、ある種のトークンの並びを置き換えることが出来そうなのだけど、まだ使い方がよく分からない(合うのかどうかも分からない)ので試していない。

今回は、ちまちました個人的なニーズの割には、このツールで実装する内容が面倒なので、実用品が出来上がるまで、もうしばらくかかりそうだ。

開発が全面的に止まっている件

| No Comments | No TrackBacks

ここ2週間ばかり、全然やりたいことが出来ていない。といっても理由の大半は、旅に出ていたり、毎日のように他人と晩飯に出かけていたりと、プライベート時間を自分で削っていたからなのだけど。

ただ、他にも一つだけしばらく作業を停滞させそうな要因がある。ちょっとした翻訳作業を依頼されて、やっつけているのだけど、これが大変な肉体労働で、訳文の作成に手と頭を使わされる割に、知識として得るものがほとんど無くて、趣味の時間が削られそうなことに困惑している。全部やったら最低でも20時間くらいは消えてしまう計算だ(おそらくその1.5~2倍はかかる)。それだけの時間があったら、mldspみたいなアプリがひとつ(あるいは半分くらいは)作れてしまいそうな気がする。

今回の教訓は、目的がほとんど人助けであっても、関心のない勉強みたいなことには手を出さないという割り切りが必要だ、ということだ。たぶん、自分の時間は、自分で思っている(いた)より貴重なもの。遊びに出ることを決めている時も、半ば「どうせ好きなことをやる時間はとれないんだ...」と諦めたり無思考状態になったりしていることが多い。少なくとも来週はもう少し自分だけの時間を大切にするようにしようと思った。

ところで、開発は止まっているのだけど、もう一つ、vocaloidもどきのような物を作るのはやめようかと思うことにした。ひとつにはfestivalベースの実装でflingerというものが既に存在していると知ったことがある。同一コンセプトの作品があるなら、作る時間をとるのがもったいない。純粋に勉強したいモードでもないし。

もうひとつには、英語で歌わせるというのは、日本語で歌わせるよりもずっと難しそうだと分かったということがある。vocaloidのようなものが日本だけで流行っている(そしてルカ等があってもやはり英詞の作品が少ない)のには相応の理由があるのだ。そこを上手いこと実用出来るようになれば、それはそれで楽しいだろうけど、生半可なリソースで出来ることじゃない。それなら他にもやりたいことがある。歌うことは自分でもできるのだから。

また、開発は止まっているのだけど、試行錯誤してIndependence FreeのようなVSTを使って遊んでみようとしていたりもする。2GB近くあったりするので結構大変だ。

そんなことをやっているので、コードの生産が無い、ということはある。いずれにしろ、しばらくは趣味の時間をちゃんと取れるようにしたいと思ったのだった。

About this Archive

This page is an archive of entries from July 2010 listed from newest to oldest.

June 2010 is the previous archive.

August 2010 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 4.23-en