命令型言語㮠Java ã‚„ Ruby ãŒãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã‹ã‚‰ã‚«ãƒ¼ãƒãƒ«ã‚¹ãƒ¬ãƒƒãƒ‰ã«ç§»è¡Œã—ãŸã®ã¨ã¯å¯¾ç…§çš„ã«ã€é–¢æ•°åž‹è¨€èªžã® Erlang ã‚„ Haskell ã§ã¯è»½é‡ãªãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’æä¾›ã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¦ã„ã¾ã™ã€‚僕ã¯ã€ã“ã®é•ã„ãŒä½•ã‹ã‚‰ç”Ÿã˜ã¦ã„ã‚‹ã®ã‹ç†è§£ã—ãŸã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ã“ã®è¨˜äº‹ã§ã¯ã€ã“ã‚Œã¾ã§èª¿ã¹ãŸã“ã¨ã‚’ã¾ã¨ã‚ã¾ã™ã€‚
軽é‡ãªãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ Erlang ãŒæœ‰åã§ã™ãŒã€Haskell (GHC)ã§ã‚‚利用ã§ãã‚‹ã“ã¨ã‚’é‡ãã¦å¼·èª¿ã—ã¦ãŠãã¾ã™ã€‚Haskell の方が Erlang よりも速いようです。追記:フェアãªæ¯”較ã§ã¯ãªã„よã†ãªã®ã§ã€è©±åŠåˆ†ã§å‚ç…§ã—ã¦ä¸‹ã•ã„。
Rubyã®å ´åˆ
Ruby 1.8 ã¾ã§æä¾›ã•ã‚Œã¦ã„ãŸãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€è»½é‡ã¨ã¯è¨€ãˆã¾ã›ã‚“ã§ã—ãŸã€‚ãã®ç†ç”±ã¯ã€ãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’コンテã‚ストスイッãƒã•ã›ã‚‹éš›ã«ã‚¹ã‚¿ãƒƒã‚¯ã‚’コピーã—ã¦ã„ãŸã‹ã‚‰ã§ã™ã€‚Rubyソースコード完全解説ã®第19章 スレッドã«ã‚ˆã‚Œã°ã€ã“ã‚Œã¯ç§»æ¤æ€§ã‚’高ã‚ã‚‹ãŸã‚ã®é¸æŠžã ãã†ã§ã™ã€‚
CPU ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’書ãæ›ãˆã‚Œã°ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚³ãƒ”ーã¯ä¸è¦ã§ã™ãŒã€CPU ã®ã‚¢ãƒ¼ã‚テクãƒãƒ£ã”ã¨ã«ã‚¢ã‚»ãƒ³ãƒ–ラを書ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚Ruby 1.8 ã¾ã§ã¯ã€ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã®æ›¸ãæ›ãˆã‚’ã›ãšã«ã€ã‚¹ã‚¿ãƒƒã‚¯ã®å†…容を差ã—替ãˆã‚‹ã“ã¨ã§ã€ã‚¢ã‚»ãƒ³ãƒ–ラを書ãã“ã¨ã‚’回é¿ã—ã¦ã„ã¾ã—ãŸã€‚ã“ã®ãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ãŒé…ã‹ã£ãŸã®ã§ã™ã€‚
GHCã®å ´åˆ
GHCã®ãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ãŒè»½ã„ã®ã¯ã©ã†ã—ã¦ã§ã—ょã†ã‹ï¼Ÿ 2種類ã®ç”ãˆãŒäºˆæƒ³ã§ãã¾ã™ã€‚
- ç ´å£Šçš„ãªä»£å…¥ãŒãªã„ã¨ã„ã†é–¢æ•°åž‹è¨€èªžã®ç‰¹å¾´ã‹ã‚‰æ¥ã¦ã„ã‚‹
- スタックãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’書ãæ›ãˆã‚‹ã‚¢ã‚»ãƒ³ãƒ–ãƒ©ã‚’é ‘å¼µã£ã¦æ›¸ã„ã¦ã„ã‚‹
ã¨ã„ã†ã‚ã‘ã§ã€ã‚½ãƒ¼ã‚¹ã‚’èªã‚“ã§ã¿ã¾ã—ょã†ã€‚ユーザスレッドã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’担当ã—ã¦ã„ã‚‹ã®ã¯ã€rts/Schedule.c ã® schedule() ã§ã™ã€‚GHC Commentaryã«ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ãŒè¼‰ã£ã¦ã„ã¾ã™ã€‚
scheduler(cap) { for (;;) { yieldCapability(cap); /* give cap to anybody wanting in from outside */ tso = popRunQueue(cap); result = StgRun(tso); case result of out of heap -> re-enqueue tso; call GC; out of stack -> enlarge tso; re-enqueue tso; time expired -> put tso on end of queue; /* round robin */ finished -> if (tso is a bound thread) return; else continue; } }
StgRun ãŒã‚¹ãƒ¬ãƒƒãƒ‰ã‚’走らã›ã‚‹ã‚ˆã†ã§ã™ã€‚(Stg 㯠Spain-less Tag-less G マシンã®ç•¥ã€‚G 㯠Graph ã®ç•¥ã€‚ラムダ計算ã¨ã¯çµå±€ã‚°ãƒ©ãƒ•ç°¡ç´„ã®ã“ã¨ã§ã€ã‚°ãƒ©ãƒ•ç°¡ç´„ã®ãŸã‚ã®ä»®æƒ³ãƒžã‚·ãƒ³ãŒ STG。) 実際ã®ã‚³ãƒ¼ãƒ‰ã¯ã“ã†ãªã£ã¦ã„ã¾ã™ã€‚
r = StgRun((StgFunPtr) stg_returnToStackTop, &cap->r);
StgRun ã¯ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’退é¿ã—ã€ç¬¬ä¸€å¼•æ•°ã® stg_returnToStackTop を呼ã³å‡ºã—ã¾ã™ã€‚stg_returnToStackTopã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚
stg_returnToStackTop
{
LOAD_THREAD_STATE();
CHECK_SENSIBLE_REGS();
jump %ENTRY_CODE(Sp(0));
}
LOAD_THREAD_STATE ã¯ã€ã¨ã¦ã‚‚探ã—ã«ãã„ã®ã§ã™ãŒã€compiler/cmm/CmmParse.yã®ä¸ã§ã€emitLoadThreadState ã«å¤‰æ›ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚
( fsLit "LOAD_THREAD_STATE", \[] -> emitLoadThreadState ),
compiler/codeGen/StgCmmForeign.hs を見るã¨ã€emitLoadThreadState ã®å®Ÿä½“㯠loadThreadState ã§ã€ã“ã‚Œã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚
loadThreadState :: LocalReg -> LocalReg -> CmmAGraph loadThreadState tso stack = do -- tso <- newTemp gcWord -- TODO FIXME NOW -- stack <- newTemp gcWord -- TODO FIXME NOW catAGraphs [ -- tso = CurrentTSO; mkAssign (CmmLocal tso) stgCurrentTSO, -- stack = tso->stackobj; mkAssign (CmmLocal stack) (CmmLoad (cmmOffset (CmmReg (CmmLocal tso)) ts o_stackobj) bWord), -- Sp = stack->sp; mkAssign sp (CmmLoad (cmmOffset (CmmReg (CmmLocal stack)) stack_SP) bWor d), -- SpLim = stack->stack + RESERVED_STACK_WORDS; mkAssign spLim (cmmOffsetW (cmmOffset (CmmReg (CmmLocal stack)) stack_ST ACK) rESERVED_STACK_WORDS), openNursery, -- and load the current cost centre stack from the TSO when profiling: if opt_SccProfilingOn then mkStore curCCSAddr (CmmLoad (cmmOffset (CmmReg (CmmLocal tso)) tso_CCCS) ccsType) else mkNop]
ã¨ã„ã†è¨³ã§ã€Cmm(C--) レベルã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ãƒ¼ãŒæ›¸ãæ›ãˆã‚‰ã‚Œã¦ã„ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã—ãŸã€‚Cmm ã¨ã¯æ±Žç”¨ã‚¢ã‚»ãƒ³ãƒ–ラã§ã™ã€‚
çµå±€ã€GHC ã¯ã‚‚ã¨ã‚‚㨠Cmm ã¨ã„ã†æ±Žç”¨ã‚¢ã‚»ãƒ³ãƒ–ラを用æ„ã—ã¦ãŠã‚Šã€ãã®ä¸ã§ã‚¹ã‚¿ãƒƒã‚¯ãƒãƒ³ã‚¿ãƒ¼ã‚’書ãæ›ãˆã‚‹æ‰‹æ®µãŒæä¾›ã•ã‚Œã¦ã„ãŸã®ã§ã€è»½é‡ãªãƒ¦ãƒ¼ã‚¶ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’サãƒãƒ¼ãƒˆã§ããŸã¨ã„ãˆãã†ã§ã™ã€‚(ã¤ã¾ã‚Šã€é•ã„ã¯é ‘å¼µã£ã¦ãŸãã•ã‚“ã®CPUアーã‚テクãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã—ãŸã‹ã©ã†ã‹ã€‚)
ãªãŠ GHC ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªä¸é–“言語を作りã¾ã™ã€‚
- Core -- æ‹¡å¼µãƒ©ãƒ ãƒ€å¼ (-ddump-simpl ã§è¦‹ã‚Œã‚‹)
- STG -- Graph 簡約マシンã®ã‚³ãƒ¼ãƒ‰ (-ddump-core ã§è¦‹ã‚Œã‚‹)
- Cmm -- 汎用アセンブラã®ã‚³ãƒ¼ãƒ‰ (-ddump-cmm ã§è¦‹ã‚Œã‚‹)
- アセンブラ/C/LLVM
GHC ã®ã‚½ãƒ¼ã‚¹ã‚’èªã‚€ã«ã‚ãŸã£ã¦ã€NaOHaq ã•ã‚“ã«ãŠä¸–話ã«ãªã‚Šã¾ã—ãŸã€‚ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
ä¸æ£ç¢ºãªè¨˜è¿°ã‚‚ã‚ã‚‹ã¨æ€ã†ã®ã§ã€çªã£è¾¼ã¿ã‚’æ“è¿Žã—ã¾ã™ã€‚