2008/2/25

オブジェクト参照がコンパイル時に名前解決出来ない場合、ビュワー起動不能になる現行仕様は妥当なのか?  VRMスクリプト禅問答
どちらかというとI.MAGiCの中の人向けアイデアメモ。
独り言:
今回の事例もそうですが、せめてスクリプトで部品や変数の有無を確かめる条件式が欲しいですねぇ。それがあれば必要パッケージを持っていなかったり、編成を変えたりしても今より柔軟にスクリプトを組めると思いますけど。

Caldia氏の言っているのは、たとえばC言語におけるディレクティブに当たるものになると思うんですが。

(1) ほとんどのVRMユーザーは、VRMスクリプトがコンパイル型言語処理系であることについて無自覚であること。すなわち、スクリプトの字面はビュワーが起動する瞬間にのみ意味があり(thisに関する挙動が典型的)必ずしもそれぞれのスクリプト命令が実行される瞬間と一対一対応しないこと。
(2) ゆえに、階の異なる言語処理系(VRMスクリプトがビュワーの挙動を決定するのに対し、Caldia氏の言う仮称“VRMディレクティブ”はコンパイラの挙動を決定する)を、一般的なVRMユーザーが理解できるとは思えないこと。
(3) 仮に理解するユーザーがいるとして、VRMユーザーのスクリプトを書く目的は、第一に自分のVRM環境で動作することであり、他人のVRM環境での動作を保障するためにVRMディレクティブを厳密に記述する人がいるとは思えないし、仮に記述したとしても、記述した本人のVRM環境ではその記述が正しいか否か判断できないこと。

以上の3つの理由により、ちょっと違うんでないかい、と思ったワケです。

で、以下は、ユーザーにはどうでも良くて、中の人にご一考いただきたいと思うことなのですが。


現行のVRMビュワーは、起動時にスクリプトのコンパイルを行い、この時点でオブジェクト参照、メソッド、グローバル変数の名前解決が出来ないと、エラーを出力してビュワーの起動を中止します。一般に、コンパイラというものはかくあるべきです。

が、VRMに限って言えば、名前解決が出来ないことが明らかになった時点で、その問題の行を“コメント”と読み替えてしまっても、大半のケースで実害がないんじゃないか、とか以前から思ってます。いや、もちろん、コンパイル型言語処理系としては非常に気持ちの悪い状態ではありますし、たとえばCコンパイラがそんな挙動をしたら、出力された実行イメージは十中八九暴走する代物だろう、とは思うワケです。

しかしながら、仮に、名前解決が不能な行を読み飛ばしてコンパイルしたとしても、ユーザー(厳密にはスクリプトの記述者)が意図した機能が発現しないだけであり、最悪のケースを想定しても、せいぜいVRMビュワーが異常終了するだけです。VRMビュワーが、巷間言われるように真にVM(バーチャルマシン)であるならば、その被害がレイアウターが保持している仕掛中のレイアウトデータや、OSに被害を与えることは理論上はないはずです。

なので、ボクには、なぜ中の人が(構文ミスはともかく)名前解決の不備に対してビュワーが起動しない仕様を採用したのか、その理由がよくわかりません。無論、ボクが阿呆なだけで、どうしてもそうでなければならない理由が他にあるのかも知れませんが、仮にそうなのだとしたら、向学のために是非ともご教示いただきたいくらいです。

確かに、仮にVRMビュワー(起動時のスクリプトコンパイラ)が名前解決出来ない行を読み飛ばす仕様であったとすると、デバッグが面倒になる側面はあります。

現行ビュワーでは、たとえばメソッド名を綴り間違えて参照が切れている場合、ビュワーがそれを警告して起動を中止するので、ユーザーは問題が綴り間違えであることを即座に認識することが出来ます(これにも一部制約がありますが)。もし、ビュワーがこれを無視して起動すると、ユーザーは意図した機能が発現しない原因が、ロジックのミスなのか、単にメソッドの名前を綴り間違えたからなのか、が判別できなくなります。

しかしながら、これは実は現行ビュワーでもケースによっては同じことであって、たとえば、編成3つにメソッドMtdStopがあって、センサーからこれをcallしたら停車するとした場合、うち1つの編成のメソッド名のみをMtdStpoと綴り間違いしていると、ビュワーは起動しますが、この編成だけがセンサーを通過しても停車しません(この仕様の間隙を突いているのが、最近ボクがしばしば言及するアドオン記法だ、と言うこともできます)。

むしろ、VRMレイアウトファイルの異なるパッケージ環境間の可搬性のメリットをとって、名前解決の不備は無視してコンパイルを続行する仕様の方が、結果的に誰にとってもハッピーなのではないか、と考えるのはボクだけでしょうか?

あるいはより積極的に、名前が解決しなかったオブジェクト参照に対して、特殊な“例外Nullオブジェクト”のようなものを割り当ててやって、変数参照に対しては常に0を、メソッドcallに対してはノーオペレーションリターンを返してやれば済むのではないか、とか。ついでに、ここにフックしてログウィンドウに「例外Nullオブジェクトが参照されました」とリアルタイムにメッセージしてくれたりするとデバッグにも便利なワケですが、まぁ、そこまでは要求しますまい。

仮に中の人が、プログラマの美学として「名前解決も出来ていないコードをオレ様の美学の結晶たるVM環境で走らせ、オレ様の意図せぬビュワー異常終了を起こさせるなんざ許さん!」とお考えなのであれば、せめて、センサー部品がレールにちゃんと載っていないときにビュワーのログウィンドウに表示されるメッセージ(Sensor does not link・・・なんだっけ?コレ、マニュアルにも載ってないような気がw)のような感じで、Method "MtdStop" is not resolvedみたいなメッセージを出して「オレ様はちゃんと例外処理をしているのだ!これで落ちたらユーザーのせいなのだ!」って自己満足する線で妥協しませんか?

なんか、最後の方でネタ臭くなってしまいましたが、まぁ、発端がそうであるようにこれも“独り言”ですんで。真に受けて「そうだ、VRM4はそうあるべきだ!」と思われた方は、このエントリのURLを添えて会議室にでも爆撃してやってください。
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ