- Smalltalk総合 Squeak Pharo
235 :デフォルトの名無しさん[sage]:2015/02/12(木) 09:00:56.49 ID:FbfONYzU - >>232 あ、ほんとだ。ブロックリテラルで書かないと、インライン展開されないんですね。…とのことです。>>229
true ifTrue: [3] ifFalse: [4]. thisContext method symbolic "=> '33 <71> pushConstant: true 34 <99> jumpFalse: 37 35 <21> pushConstant: 3 36 <90> jumpTo: 38 37 <20> pushConstant: 4 38 <87> pop 39 <89> pushThisContext: 40 <D3> send: method 41 <D2> send: symbolic 42 <7C> returnTop' " true ifTrue: 3 ifFalse: 4. thisContext method symbolic "=> '33 <71> pushConstant: true 34 <21> pushConstant: 3 35 <22> pushConstant: 4 36 <F0> send: ifTrue:ifFalse: 37 <87> pop 38 <89> pushThisContext: 39 <D4> send: method 40 <D3> send: symbolic 41 <7C> returnTop' " | block | block := [3]. true ifTrue: block. thisContext method symbolic "=> '<略> 36 <71> pushConstant: true 37 <10> pushTemp: 0 38 <E1> send: ifTrue: 39 <87> pop 40 <89> pushThisContext: 41 <D3> send: method 42 <D2> send: symbolic 43 <7C> returnTop' "
|
- Smalltalk総合 Squeak Pharo
236 :デフォルトの名無しさん[sage]:2015/02/12(木) 09:26:20.70 ID:FbfONYzU - >>232
調べてみました。なるほど。 引数がブロックかどうかをチェックしてインライン化を判断しているのですね。 (以下は Squeak の場合ですが、VisualWorks でも似たようなことをしていました。) MessageNode >> transformIfTrue: encoder (self transformBoolean: encoder) ifTrue: [arguments := Array with: ((arguments at: 1) noteOptimizedIn: self) with: ((BlockNode withJust: NodeNil) noteOptimizedIn: self). ^true] ifFalse: [^false] MessageNode >> transformBoolean: encoder ^self checkBlock: (arguments at: 1) as: 'argument' from: encoder
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
511 :デフォルトの名無しさん[sage]:2015/02/12(木) 14:10:27.30 ID:FbfONYzU - >>509
具体例もお願いします。
|
- Smalltalk総合 Squeak Pharo
238 :デフォルトの名無しさん[sage]:2015/02/12(木) 17:47:15.72 ID:FbfONYzU - >>237
言いたいことがよく分かりません。 それはコンパイル時の ifTrue: 、whileTrue: などのインライン展開とどういう関係があるのでしょうか? そもそも 1 + 10 と 1 + MyClass new とではコンパイル結果は変わらないですよね? そのコードも SmallInteger >> + のプリミティブが失敗して普通にフォールバックしているだけだと思うんですが…
|