ホーム   最近   SikiWiki   編集   新規 

[SikiLanguage] [式鬼言語航海日誌] 2007-06-08

2007/06/08_000000




ただいま~~ようやく戻ってこれました……。

「……またまたずいぶん時間が空いたねぇ」

まあ、世を忍ぶ仮の仕事が忙しかったということもあったのですが、言語設計の方もドツボにはまってまして……ようやっと抜け出したところです。

「おやおや」

不用意に実行プロセスの意味論を追っ掛け始めたのが運の尽きでしたね。もう泥沼に嵌りこむ感じです。Forthの奥深さに触れて調子に乗っていたところもあったのでしょうけど。

「というと?」

Forthには、immediateという仕組みがあって、Word一つ一つにソースコードの解釈時に実行する内容を定義することができるんですよね。No.22さんのところの解説とか、Naoさんのmops immediateの解説に解説がありますが、このimmediateという仕組みによって、マクロ的な内容を通常のWord定義の範疇で行うことができます。

「ミニマリストのあンたの好きそうな話だね」

ええ、こういうの大好きです。

ただ、Forthの場合、あくまで『Wordの定義』というパースの基本ルールに従う必要があるので、『Wordをスペースで区切らなくてはいけない』などのルールには従う必要があるようです。No.22さんのところで文字列リテラルの例が挙げられていますが、文字列リテラルをスタートする『s"』もWordで定義しているため、『s"』直後にスペースを置かなくてはならないという制限が発生しています。

「判りゃ大した話じゃ無いけど、あんたの嫌いそうな制限事項だね」

ええ、そうですね。汎用化という点からすると何とも嫌らしい制限ですよね。

まあ、Forthの場合、あくまでWord定義を変更するだけでパーザまで弄れる訳ではないですから、当然といえば当然ですが。

ただ、ここまで弄くれるのなら、とことんまで弄れるようにしたい……だったら、パーズ中に文法定義を修正できるようにすればいいじゃないか、と。

「おお、『万能チューリングマシン』……かね?」

そうですね。たぶんイメージ的には『万能チューリングマシン』に近いものかも。

ソースコードをパーズしながら実行して、場合によってはパーザ自体の修正も行う。マクロの発展版ですね。

ただ、これを実行プロセスとどうやって擦り合せるか……そこで泥沼に嵌っていました。結局、パーズそのものを実行プロセスの一環にしてしまいましたけどね。

「なンだそりゃ。ソースのパーズする部分をグローバル変数か何かに割り当てたンかい?」

まあ、そんなもんですね。

簡単に言うと

『ソースコードをパーズするオブジェクト』を別途用意する。このオブジェクトには常にアクセスできるようにする プログラムの実行プロセスとして、このオブジェクトにソースコードをパーズさせる 適当なタイミングで、パーズした内容(構造木)を実行する

といったところですね。『パースする <--> 実行する 』といった感じで交互に処理しますので、実行しながらパーザの定義=文法を入れ替えることができる……というわけです。

「ほう、そりゃ凄そうだね。でもセキュリティ確保とかバグ取りは大変そうだ。ライブラリをインクルードしただけで酷いことになる可能性があるわけか…………」

ええ、そのへんはマクロとかevalと一緒ですね。下手に弄るとトンでもないことになるでしょう。

まあ、そこは『膝を撃ち抜く自由』というやつで。

「……『足を滑らせる自由』のような気がしてならんけど」





制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)