Reading Gauche/vm/insn/LOCAL_ENV_CALL の変更点



 #setlinebreak(on)
 #topicpath
 *LOCAL_ENV_CALL [#j023ba16]
 ''LOCAL_ENV_CALL''(argv)
 ** 説明 [#uaebd043]
 
 **この命令が果たす役割 [#dc952fd4]
 クロージャーの最適化の際、主に3つのオプションに分類される。
 それは、LOCAL, EMBED, JUMPである。ここでは、このインストラクションに関係するLOCALを説明する。
 LOCAL: クロージャーの生成を避けられない場合、クロージャーの呼び出しは、"local"としてマークされる。ローカルなクロージャーの呼び出しは、LOCAL-ENV-CALLインストラクションとなる。そして、それは、[[CALL>Reading Gauche/vm/insn/CALL]]/[[TAIL-CALL>Reading Gauche/vm/insn/TAIL_CALL]]よりも高速である。
 
 このインストラクションは、ローカル関数の呼び出しの最適化の際に現れる。VAL0には呼び出すクロージャがセットされており、スタックには引数が既に PUSH されている。
 
 このインストラクションは、LOCAL-ENVのように存在する値をもつENVフレームを生成する、そしてVAL0のなかのクロージャーのエントリーポイントにジャンプする。要はCALL命令をバイパスできるものである。というのは、引数はすでに調整され、我々は呼びだれたクロージャーが総称関数でないことを知っているからである。
 
 **命令中に行われる主な処理 [#d0ff2559]
 以下にこのインストラクションでの動作を記述する。
 
 引数を算出、VAL0がクロージャーかの確認を行い、引数がある場合、スタックサイズをチェックし、環境フレームを作成する。引数がない場合、VAL0の指す値を環境フレーム(ENV)のポインタ値に変更し、ARGPにSPの値を代入する。
 
 プロファイラが動作しているときは、上記のクロージャーを記録して行く。
 
 ** 使用例 [#y4e9caf2]
 >(disasm (lambda () (letrec ((even? (lambda (x) (or (= x 0) (odd? (- x 1))))) (odd? (lambda (x) (and (not (= x 0)) (even? (- x 1)))))) (list (even? 20) (odd? 20)))))
 >(disasm (lambda () ( letrec ( (even? (lambda (x) (or (= x 0) (odd? (- x 1) ) ) ) ) (odd? (lambda (x) (and (not (= x 0)) (even? (- x 1) ) ) ) ) ) (list (even? 20) (odd? 20) ) ) ) )
 >main_code (name=#f, code=0x3fbf00, size=23, const=1, stack=18):
 >args: #f
 >     0 [[LOCAL-ENV-CLOSURES>Reading Gauche/vm/insn/LOCAL_ENV_CLOSURES]](1) (#<lambda 0>); (letrec ((even? (lambda (x) (or (= x 0)  ...
 >     2 [[PRE-CALL(1)>Reading Gauche/vm/insn/PRE_CALL]] 16
 >     4 [[CONSTI-PUSH>Reading Gauche/vm/insn/CONSTI_PUSH]](20) 
 >     5 [[LOCAL-ENV>Reading Gauche/vm/insn/LOCAL_ENV]](1)             ; (lambda (x) (or (= x 0) (odd? (- x 1))))
 >     6 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >     7 [[BNUMNEI>Reading Gauche/vm/insn/BNUMNEI]](0) 10            ; (= x 0)
 >     9 [[RET>Reading Gauche/vm/insn/RET]] 
 >    10 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >    11 [[NUMADDI>Reading Gauche/vm/insn/NUMADDI]](-1)              ; (- x 1)
 >    12 [[PUSH>Reading Gauche/vm/insn/PUSH]] 
 >    13 [[LREF10>Reading Gauche/vm/insn/LREF0]]                   ; odd?
 >    14 [[LOCAL-ENV-TAIL-CALL>Reading Gauche/vm/insn/LOCAL_ENV_TAIL_CALL]](1)   ; (odd? (- x 1))
 >    15 [[RET>Reading Gauche/vm/insn/RET]] 
 >    16 [[PUSH-PRE-CALL>Reading Gauche/vm/insn/PUSH_PRE_CALL]](1) 21
 >    18 [[CONSTI-PUSH>Reading Gauche/vm/insn/CONSTI_PUSH]](20) 
 >    19 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; odd?
 >    20 [[LOCAL-ENV-CALL>Reading Gauche/vm/insn/LOCAL_ENV_CALL]](1)        ; (odd? 20)
 >    21 [[LIST>Reading Gauche/vm/insn/LIST]](2)                  ; (list (even? 20) (odd? 20))
 >    22 [[RET>Reading Gauche/vm/insn/RET]] 
 >internal_closure_0 (name=odd?, code=0x3f4f00, size=18, const=0 stack=8):
 >args: #f
 >     0 [[LREF0-PUSH>Reading Gauche/vm/insn/LREF0_PUSH]]               ; x
 >     1 [[CONSTI>Reading Gauche/vm/insn/CONSTI]](0) 
 >     2 [[NUMEQ2>Reading Gauche/vm/insn/NUMEQ2]]                   ; (= x 0)
 >     3 [[NOT>Reading Gauche/vm/insn/NOT]]                      ; (not (= x 0))
 >     4 [[RF>Reading Gauche/vm/insn/RF]] 
 >     5 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >     6 [[NUMADDI>Reading Gauche/vm/insn/NUMADDI]](-1)              ; (- x 1)
 >     7 [[PUSH-LOCAL-ENV>Reading Gauche/vm/insn/PUSH_LOCAL_ENV]](1)        ; (lambda (x) (or (= x 0) (odd? (- x 1))))
 >     8 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >     9 [[BNUMNEI>Reading Gauche/vm/insn/BNUMNEI]](0) 12            ; (= x 0)
 >    11 [[RET>Reading Gauche/vm/insn/RET]] 
 >    12 [[LREF0>Reading Gauche/vm/insn/LREF0]]                    ; x
 >    13 [[NUMADDI>Reading Gauche/vm/insn/NUMADDI]](-1)              ; (- x 1)
 >    14 [[PUSH>Reading Gauche/vm/insn/PUSH]] 
 >    15 [[LREF20>Reading Gauche/vm/insn/LREF20]]                   ; odd?
 >    16 [[TAIL-CALL>Reading Gauche/vm/insn/TAIL_CALL]](1)             ; (odd? (- x 1))
 >    17 [[RET>Reading Gauche/vm/insn/RET]] 
 >#<undef>
 
 
 
 
 ** 関連項目 [#j1602ff4]
 -[[SP>Reading Gauche/vm.c/SP]]
 -[[ARGP>Reading Gauche/vm.c/ARGP]]
 -[[VM_ASSERT>Reading Gauche/vm.c/VM_ASSERT]]
 -[[SCM_CLOSUREP>Reading Gauche/gauche.h/SCM_CLOSUREP]]
 -[[VAL0>Reading Gauche/vm.c/VAL0]]
 -[[CHECK_STACK_PARANOIA>Reading Gauche/vm.c/CHECK_STACK_PARANOIA]]
 -[[ENV_SIZE>Reading Gauche/gauche/vm.h/ENV_SIZE]]
 -[[FINISH_ENV>Reading Gauche/vm.c/FINISH_ENV]]
 -[[SCM_FALSE>Reading Gauche/gauche.h/SCM_FALSE]]
 -[[SCM_CLOSURE>Reading Gauche/gauche.h/SCM_CLOSURE]]
 -[[ENV>Reading Gauche/vm.c/ENV]]
 -[[SCM_COMPILED_CODE>Reading Gauche/gauche/code.h/SCM_COMPILED_CODE]]
 -[[PC>Reading Gauche/vm.c/PC]]
 -[[CHECK_STACK>Reading Gauche/vm.c/CHECK_STACK]]
 -[[SCM_PROF_COUNT_CALL>Reading Gauche/gauche/prof.h/SCM_PROF_COUNT_CALL]]
 -[[SCM_OBJ>Reading Gauche/gauche.h/SCM_OBJ]]
 -[[NEXT>Reading Gauche/vm.c/NEXT]]
 
 //// &pageのお尻に ; をつけるとページ名に展開されます。
 //// ↓適宜コメントアウトして使いましょう
 ////**経緯
 ////**目的
 ////**概要
 ////**アクション
 ////**未解決な問題
 ////**関連ページ
 ////#ls2
 
 *コメント [#nca9ddcf]
 #pcomment(,1000,below,reply)

リロード   新規 編集 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.027 sec.