[SikiLanguage] [式鬼言語航海日誌] 2007-09-03
2007/09/03_000001ただいま戻りました。
「おお、今日は早いね」
ええ、昨日の話をちょっと考えていたので、仕事を早めに切り上げて帰ってきました。
「というと?」
昨日、
『トークンを処理するときはその都度メソッド呼び出しが発生します。パフォーマンス的なインパクトはありますが、代わりに柔軟性が手に入ります』
という話をしたかと思うのですが、────ホントにパフォーマンスを犠牲にしてまでそんな柔軟性が必要なのかと。
「ふむ────トークンは“メソッド呼び出し”と“変数の参照”を処理するっつうてたよね。それが不要っつうことかい?」
それぞれの機能は当然必要なのですが、それはトークンを処理するごとに行う必要があるのか、ということです。個々のパフォーマンスインパクトは小さくても、トークン処理はかなりの回数行うので。
それに、“メソッド呼び出し”の柔軟性は、リテラルを見てもらえばわかりますが、実はかなり限定的なんですよね。
「リテラルというと」
'test1' 'test2' .. append
はい、ここの“..”ですね。ここで引数の数を指定しているのですけど、結局のところ『ここでメソッドを呼びますよ』といっているようなものですからね。
「トークンを呼び出すたびにメソッドを実行するかどうかを判定しているけど、実は実行するポイントは決まっている、つうことか」
そうです。ということで、引数の存在するメソッドについてはあまり意味がありません。
「そうすると、効果があるのは引数なしのメソッドぐらいか」
はい。ただ、式鬼言語ではCLOSスタイルのメソッド呼び出しを考えていますので、実は引数無しのサンクというのは全然重要じゃないんですよね。メソッドを実行するときはほとんどの場合で(スタックに積まれている)Cellを必要とすることになりそうです。
あとは、メソッド呼び出しと同じリテラルでクロージャー呼び出しをするようにすることでカスタマイズポイントを提供するという技法もありますが、これも遅延評価に対応するとあまり嬉しくないですね。結局クロージャー呼び出しが必要になるのは引数の評価のタイミングですから、遅延評価でだいたいカバー出来てしまいそうです。
「“変数の参照”の方は?」
Forthライクの処理ですから、ほとんどがスタックだけで完結します。そもそも変数を参照しないんですよね。あるとしてもスコープを跨いだ参照とかの限定的なケース。それだったらわざわざトークン全てでやる必要は無いかと。
「ふうん。そこまで割り切るンかい。 で、どうする?」
はい。ここもForthチックに処理することにしましょう。メソッド呼び出しと変数呼び出し用のトークンとリテラルをそれぞれ別に用意します。具体的には
- ..:token メソッド呼び出し用のトークン。
- @token 変数呼び出し用のトークン
といった感じですか。ちょっとこれから実装してきます。
(追記)
ただいま戻りました。
「お、どうだった?」
とりあえずはメソッド呼び出し用のトークンのところまでは実装が終わりました……というか、ちょっとルールを変更して、
<|:test1 :test2 :..test3> {|'test'} test1 test2 ..test3
<| >という記法を導入しました。これは
- test1 test2 ..test3というメソッド呼び出しのベースになるCellを検索する
- 最後のトークン(この場合は..test3)をメソッド呼び出し用のトークン(Messageのインスタンス)にする
という処理を行う記法です。
「..test3というのが、さっき言っていたメソッド呼び出し用のトークン、つう訳だね」
はい、そうです。といっても、別に..test3じゃなくてtest3でも動きますが……。しかし、ここは表記ルールとして、トークンの頭に付く点の数で引数の数を区別することにしましょう。
変数呼び出し用のトークンはまた明日。
制作・著作: 野分(nowake) at fiercewinds.net (Creative Commons 表示-継承 2.1 日本)