yarv-dev:258
From: Hideo Fukumori <fukumori m.ieice.org>
Date: Wed, 20 Oct 2004 23:34:12 +0900
Subject: [yarv-dev:258] Re: Block inlining method
福盛です。 SASADA Koichi wrote: > yarv-devel でいろいろと喋ってるんですが、たとえば Smalltalk > のブロックをインライン化する方法って提案されたりしてるんでしょ > うか。 一般的な実装として、ブロックが直接引数で渡されているときには インライン化(というかただのループにする)するのがお約束のようです。 これはかなり昔からやられていたような気が。 BooleanのifTrue:ifFalse:などについては http://www.sra.co.jp/people/aoki/SmalltalkIdioms/chapter4/Chapter4.htm#Branch に説明があったりします。 ...... また、少し古い実装(VisualWorks Smalltalk, Release 3.0(1998))ですが、 BlockオブジェクトのifTrue:メソッドのコメントにも "This method is inlined if both the receiver and the argument are literal blocks." なんてのがあるので、 --- [index <= list size] "<- receiverがliteral" whileTrue: [list at: index put: 0. "<- argumentがliteral" index := index + 1] --- というコードはインラインで動作するはず。 他にはNumberクラスのto:do:メソッドもインライン化されるみたいです。 ...... ただ、yarv-develに出てくる例(簡単な方): [1, 2, 3].each{|e| ... } に相当するSmalltalkのコードがきれいにインライン化されるかについては いまいち自信がありません。 VisualWorks3.0のSequenceableCollection(Arrayのスーパークラス)の do:メソッドの実装: --- do: aBlock 1 to: self size do: [:i | aBlock value: (self at: i)] --- とかを見るとループ自体はインライン化されるように見えるので なんとかなりそう、とおもいきや、Blockへの引数を渡すところ (aBlock value:xxx)のあたりがやっぱりインライン化されない 気配が強いので、やっぱりダメそうな気がします。 ...... う〜ん、ここまで書いてみてから改めて読み返してみると肝心の質問: > たとえば Smalltalkのブロックをインライン化する方法って > 提案されたりしてるんでしょうか。 の回答にはなっていませんね。 でももう眠くなってきてしまったので今日はこのへんでご勘弁を。 -- 福盛秀雄 fukumori m.ieice.org -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
257 2004-10-20 21:12 [ko1 atdot.net ] Block inlining method -> 258 2004-10-20 23:34 ┗[fukumori m.ieice.org] 259 2004-10-20 23:39 ┣[fukumori m.ieice.org] 260 2004-10-20 23:41 ┣[ko1 atdot.net ] 266 2004-10-24 10:34 ┃┗[fukumori m.ieice.org] 267 2004-10-25 20:00 ┃ ┗[ko1 atdot.net ] 261 2004-10-20 23:43 ┗[fukumori m.ieice.org]