早い話が呪文(spell)のことである。
alert(“ひゃっほーい!”);
と書くと
「ひゃっほーい!」(OK)
とメッセージが飛び出る。
何やら難しそうだが、実装は単純。
1.まず、ダブルクォートでサクっと文字を分割。偶数番目の文字の前後はダブルクォートでくくる。
- alert(
- “ひゃほーい!”
- );
2.これを記号で更に分割
- alert
- (
- “ひゃほーい!”
- )
- ;
3.適当な語句分析ルーチンに流して、分割した文字列に意味を持たせる。
- 名前:alert、左括弧(、リテラル:ひゃほーい!、右括弧)、セミコロン;
4.適当な文法解析ルーチンに流して、意味付けをする。
- 関数名:alert、引数1:”ひゃほーい!”、以上;
5.ここまで来れば、後は
- alert関数に”ひゃほーい!”を渡して、何かするのを期待するだけ。
と至って簡単である。
最初にダブルクォートで括るのはこれはプログラミングの定説とか信仰とは無関係である。なぜなら「ひゃほーい!」の部分にはダブルクォート以外なら大抵の文字が入ってよいので、文法上は「悪質なスクリプト」を書いても文法上は合法である。そんなもんを書かれるとプログラムはウッカリどころか真面目に解析してしまい厄介なことに明白で最初にそのようなケースをバッサリと除外しない奴は頭がイカれている。
一般には処理を分岐するif文とかloop文やwhile文もあるが、要は「適当な文法解析ルーチン」を作って、「xxx関数にyyyを渡して何かするのを期待する」だけなので何も難しくない。
ただ、String[100] text;と書くような文法は、JNIなどの外部インタフェースには欲しいが、バッファーオーバーランに出会うとひどい目に遭うのは間違いないので、そのようなバッファは他とは区別し共有メモリ(DNZエリア)に配置するのがよい。外部インタフェースの仕組みは言語やOSさらに32ビット版かか64ビット版かによって、ずいぶんと異なる仕来りでデータを配置しなければいけないので、OSのコンパイラーの構造体の仕様書やEXPORTSインタフェースの仕様を熟読する必要が、仕組みさえ理解すればメモリに仕様通りにデータを並べていくだけ。パラメータが複雑な構造体でも応用できるようにちゃんと組んでしまえば、面倒なバイナリーなダンプ・データを作成の便利なツールにもなる。
色々あるが、これらを都合のいいように、組み合わせれば、大抵のスクリプトのモックアップは完成する。
後は、呪文を組み合わせると、やはり可笑しなことが起こる。
一般通念としては、こうなるハズ!とか、常識的に考えればこうだろう!とかは大抵外れる様にできている。
例えば、AKB48(”xxxxx”);と呪文を唱えたら、どうなるか?
そう、AKB48関数をコードしないと、「知らない関数(AKB48)です」と表示することもせず、ただcoreファイルを吐き出すだけだろう。
スクリプトの難しいところは、
- いかにミスをしないように記述できるか
- 多少のミスなら無視して処理できるか
- ミスを犯した場合に適切なガイドメッセージを表示できるか
など、不注意に対してドレだけ寛容であるかが、使い心地に大きな影響を及ぼす。
だから、1文字間でも違えたらHDDがクラッシュするのは仕様ですなんて論外である。
以上。