トップページ > プログラム > 2015年02月12日 > FbfONYzU

書き込み順位&時間帯一覧

12 位/214 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000002000010010000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Smalltalk総合 Squeak Pharo
関数型プログラミング言語Haskell Part27_©2ch.net

書き込みレス一覧

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 >> + のプリミティブが失敗して普通にフォールバックしているだけだと思うんですが…


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。