真VRM世界征服計画・ゴジラ祭開幕こんにちは。VRMスクリプト禅問答どちらかというとI.MAGiCの中の人向けアイデアメモ。独り言:今回の事例もそうですが、せめてスクリプトで部品や変数の有無を確かめる条件式が欲しいですねぇ。それがあれば必要パッケージを持っていなかったり、編成を変えたりしても今より柔軟にスクリプトを組めると思いますけど。diaryのCaldia氏のコメントよりCaldia氏の言っているのは、たとえばC言語におけるディレクティブに当たるものになると思うんですが。ほとんどのVRMユーザーは、VRMスクリプトがコンパイル型言語処理系であることについて無自覚であること。スクリプトの字面はビュワーが起動する瞬間にのみ意味があり(thisに関する挙動が典型的)必ずしもそれぞれのスクリプト命令が実行される瞬間と一対一対応しないこと。ゆえに、階の異なる言語処理系(VRMスクリプトがビュワーの挙動を決定するのに対し、Caldia氏の言う仮称“VRMディレクティブ”はコンパイラの挙動を決定する)を、一般的なVRMユーザーが理解できるとは思えないこと。仮に理解するユーザーがいるとして、VRMユーザーのスクリプトを書く目的は、第一に自分のVRM環境で動作することであり、他人のVRM環境での動作を保障するためにVRMディレクティブを厳密に記述する人がいるとは思えないし、仮に記述したとしても、記述した本人のVRM環境ではその記述が正しいか否か判断できないこと。以上の3つの理由により、ちょっと違うんでないかい、と思ったワケです。以下は、ユーザーにはどうでも良くて、中の人にご一考いただきたいと思うことなのですが。現行のVRMビュワーは、起動時にスクリプトのコンパイルを行い、この時点でオブジェクト参照、メソッド、グローバル変数の名前解決が出来ないと、エラーを出力してビュワーの起動を中止します。一般に、コンパイラというものはかくあるべきです。VRMに限って言えば、名前解決が出来ないことが明らかになった時点で、その問題の行を“コメント”と読み替えてしまっても、大半のケースで実害がないんじゃないか、とか以前から思ってます。いや、もちろん、コンパイル型言語処理系としては非常に気持ちの悪い状態ではありますし、たとえばCコンパイラがそんな挙動をしたら、出力された実行イメージは十中八九暴走する代物だろう、とは思うワケです。仮に、名前解決が不能な行を読み飛ばしてコンパイルしたとしても、ユーザー(厳密にはスクリプトの記述者)が意図した機能が発現しないだけであり、最悪のケースを想定しても、せいぜいVRMビュワーが異常終了するだけです。VRMビュワーが、巷間言われるように真にVM(バーチャルマシン)であるならば、その被害がレイアウターが保持している仕掛中のレイアウトデータや、OSに被害を与えることは理論上はないはずです。ボクには、なぜ中の人が(構文ミスはともかく)名前解決の不備に対してビュワーが起動しない仕様を採用したのか、その理由がよくわかりません。ボクが阿呆なだけで、どうしてもそうでなければならない理由が他にあるのかも知れませんが、仮にそうなのだとしたら、向学のために是非ともご教示いただきたいくらいです。確かに、仮にVRMビュワー(起動時のスクリプトコンパイラ)が名前解決出来ない行を読み飛ばす仕様であったとすると、デバッグが面倒になる側面はあります。現行ビュワーでは、たとえばメソッド名を綴り間違えて参照が切れている場合、ビュワーがそれを警告して起動を中止するので、ユーザーは問題が綴り間違えであることを即座に認識することが出来ます(これにも一部制約がありますが)。ビュワーがこれを無視して起動すると、ユーザーは意図した機能が発現しない原因が、ロジックのミスなのか、単にメソッドの名前を綴り間違えたからなのか、が判別できなくなります。これは実は現行ビュワーでもケースによっては同じことであって、たとえば、編成3つにメソッドMtdStopがあって、センサーからこれをcallしたら停車するとした場合、うち1つの編成のメソッド名のみをMtdStpoと綴り間違いしていると、ビュワーは起動しますが、この編成だけがセンサーを通過しても停車しません(この仕様の間隙を突いているのが、最近ボクがしばしば言及するアドオン記法だ、と言うこともできます)。VRMレイアウトファイルの異なるパッケージ環境間の可搬性のメリットをとって、名前解決の不備は無視してコンパイルを続行する仕様の方が、結果的に誰にとってもハッピーなのではないか、と考えるのはボクだけでしょうか?あるいはより積極的に、名前が解決しなかったオブジェクト参照に対して、特殊な“例外Nullオブジェクト”のようなものを割り当ててやって、変数参照に対しては常に0を、メソッドcallに対してはノーオペレーションリターンを返してやれば済むのではないか、とか。ついでに、ここにフックしてログウィンドウに「例外Nullオブジェクトが参照されました」とリアルタイムにメッセージしてくれたりするとデバッグにも便利なワケですが、まぁ、そこまでは要求しますまい。resolvedみたいなメッセージを出して「オレ様はちゃんと例外処理をしているのだ!これで落ちたらユーザーのせいなのだ!」って自己満足する線で妥協しませんか?なんか、最後の方でネタ臭くなってしまいましたが、まぁ、発端がそうであるようにこれも“独り言”ですんで。真に受けて「そうだ、VRM4はそうあるべきだ!」と思われた方は、このエントリのURLを添えて会議室にでも爆撃してやってください。ghostトラックバック(0)コメントコメントを書くこの記事にはコメントを投稿できません画像内の文字列(認証コード)を入力してください。認証コードを正しく入力するとコメントが反映されます。※大文字/小文字の区別はありません。“AutoPage”AutoPage最新お知らせ。