[SML 7543] Re: 第7回Smalltalk勉強会@京都

AOKI Atsushi atsushi @ cc.kyoto-su.ac.jp
2009年 5月 15日 (金) 02:17:56 JST


こんばんは、青木@京都宇治です。

> センダの話題のところで出てきた
> Compiler evaluate: 'self printString' for: 3 logged: false
> のお話は、その場ではちょっと消化不良だったので、帰宅してから
> Compilerのやっていることを読んでおりました。

Compilerを読むと勉強になりますもんね。一昨日にも開示したプロ
グラムでもありますが、濱崎さんが提示のプログラムと同じ応答を
得るプログラムをここに開示させてください。

Compiler evaluate: 'thisContext sender receiver printString' for: 3 logged: false

これは誰のために評価するのかという立場を明示したプログラムで
して、thisContext(aMethodContext)にsenderとreceiverの単項メッ
セージを送信しています。

'3'が応答されるまでの経緯を追うことができれば、センダとレシー
バの柵(しがらみ)が分かると思います。

> それで、読んだコードに触発されて以下のコードを書きました。
> ------------- ここから -------
> | methodSearchBlock mainBlock |
> methodSearchBlock := [:class :messageSelector |
> class isNil
>     ifTrue: [nil]
>     ifFalse:
>         [(class selectors includes: messageSelector)
>             ifTrue: [class getMethodDictionary at: messageSelector]
>             ifFalse:
>                 [methodSearchBlock
>                     value: class superclass
>                     value: messageSelector]]].
> mainBlock := [:anObject :messageSelector :args |
> | method |
> method := methodSearchBlock
>     value: anObject class
>     value: messageSelector.
> method valueWithReceiver: anObject arguments: args].
> ^mainBlock value: 3 value: #+ value: #(4)
> --------------- ここまで ---------
> 仮想マシンが裏方でひっきりなしにやっていることではあるのですけれど、
> こんな風にあからさまに書いてしまうと、センダ、レシーバどころかメッセージ
> 送信そのものが消えてしまっていて、煎じ詰めればメソッド呼び出しのチェーンで
> しかないのね、と改めて思ってしまいます。当たり前と言えばそうなんですが。

そうりゃそうなりますよね、ノイマン型ですから、チューリングマ
シンの枠から出ることはかないません。量子コンピュータならば…。

とは言え、濱崎さんの触発プログラムコードは、メッセージ名とメ
ソッド(文字へのポインタと関数へのポインタ)の動的な束縛を遂
行するプログラムコードになっており、ユニバーサル系の実装です。

インヘリタンスをブロッククロージャの再帰で駆け上りながら、メ
ソッド辞書(文字へのポインタと関数へのポインタのテーブル)を
ひいています。

ここで、関数へのポインタが出てきていますが、xも*xも&xも区別が
つかず、**xや***xで「きゃぁ〜」と声を出し、「ポインタは難しい」
と宣う弱いプログラマは、(*x)(…)の出現によって気絶します。:-)

あるプログラミング言語を勉強したら、そのプログラミング言語で
記述したプログラム自体を実行するプログラム(処理系)を、その
プログラミング言語自身で書き下ろす経験をすれば、免許皆伝(勉
強しているプログラミング言語をマスターしたこと)になります。

プログラミング言語を教える立場の方々にとっては必須なことだと
思いますが、多くを語れず…。

------------------------------------------------------------
AOKI Atsushi          http://www.cc.kyoto-su.ac.jp/~atsushi/


SML メーリングリストの案内