
ã¿ãªããããã«ã¡ã¯ïŒ
humbugãšãšãã«ã
Low Level Smalltalk ïŒLLSTïŒã·ãªãŒãºã®3çªç®ã®èšäºã«æ³šç®ããŠãã ããã ãã®èšäºããçããããã°ã©ãã³ã°èšèªã®
èªè»¢è»æå¥œå®¶ã ãã§ãªãã
LLVMã®ãããªçŽ æŽããããã®ã«èå³ããã人ã«ãšã£ãŠãè峿·±ããã®ã«ãªãããšãé¡ã£ãŠããŸãã
ç§ãã¡ã®ãããžã§ã¯ãã®ç®æšã¯ããã€ãã³ãŒãã¬ãã«ã§
Little Smalltalkãšäºææ§ã®ããç¬èªã®ä»®æ³ãã·ã³ãäœæããããšã§ãã äž»ãªéãã¯ãç°çš®ã¢ãŒããã¯ãã£ã§ããLLVMã³ãŒããIRã³ãŒãã«å€æããããšã«ããããã€ãã³ãŒããããã°ã©ã ã§å®è¡ããäœã¬ãã«ã®ããã»ããµåœä»€ã«ã³ã³ãã€ã«ã§ããŸãã ãã¡ããã2çªç®ã®æ¹æ³ã§ã¯ãããé«ãããã©ãŒãã³ã¹ãå®çŸããå©çšå¯èœãªã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãæé©ãªæ¹æ³ã§äœ¿çšã§ããŸãã
ããããæåã«æåã«...
åã®èšäºã§èª¬æãã以åã®ããŒãžã§ã³ãšæ¯èŒãããšãå€ãã®å€æŽç¹ããããŸãã
ãªã¹ãã衚瀺- readlineã©ã€ãã©ãªãæ¥ç¶ããŸãã ã ããã§ãã³ãã³ãã©ã€ã³ãç°¡åã«ç·šéã§ããŸãã 以åã«å
¥åããã³ãã³ãïŒCtrl + RïŒã®å±¥æŽãšãTabããŒã®ãªãŒãã³ã³ããªãŒãããããŸããã äžè¬ã«ããã¹ãŠã¯éåžžã®ã·ã§ã«ãšåãããã«æ©èœããŸãã
- ãã¡ã€ã«ãæäœããããªããã£ãã远å ãããã€ã¡ãŒãžããã£ã¹ã¯ã«æžã蟌ãŸããŸãã ããã§ãæ°ããVMã§ãå
ã®VMãšã»ãŒåãããšãã§ããŸãã
- ã¹ã±ãžã¥ãŒã©ã¯ã©ã¹ã«åºã¥ããŠããªããã£ããã«ãã¿ã¹ã¯ïŒã°ãªãŒã³ã¹ã¬ããïŒãå®è£
ããŸããã èšç»-å®å
šãªãã«ãã¹ã¬ããã
- ãã¹ãã¯ããã®åŸã®ãããã°ã倧å¹
ã«ç°¡çŽ åãããªããžã§ã¯ãã䜿çšããåºæ¬æäœçšã«äœæãããŸããã ãã¹ãã¯çŽ æŽãããã§ãïŒ
- ããŒããªããžã§ã¯ã
hptr<>
ãžã®ãã€ã³ã¿ãä¿®æ£ããŸããã 以åã¯ãå€éšãªã¹ãstd::list<>
ãçŸåšã¯ãªã¹ããã¹ã¿ãã¯ã¹ããŒã¹ã«ä¿æãããŠããŸãã ããã ãã§ããœãããŠã§ã¢VMã2åå éãããŸããã - ãã©ã³ã37ã§ã¯ããã€ãã£ãAPIã¹ã±ãããäœæãããŸããããã«ãããå°æ¥ãã©ãããŒããã®ä»ã®æŸèæãªãã§ãã€ãã£ãã¡ãœãããå®å
šã«äŸ¿å©ã«äœæã§ããããã«ãªããŸãã ã¡ãœããã¯ãSmalltalkããã®åçã®ãšã³ãã£ãã£ã®æ§é ãèšè¿°ããåãã¯ã©ã¹ã®ãã€ã³ãã¬ãŒã¹ãã§å®è£
ãããŸãã ãã ã ãã ã ããã§äŸãèŠãããšãã§ããŸã ã
- æ¢åã®Bakerã«åºã¥ããŠãäžä»£å¥GCãå®è£
ããããšããŸããã å®éããã¹ãŠã®éãã¯ãããŒãã®ååã®åœ¹å²ãšãäžä»£éã®ãªã³ã¯ã®ãªã¹ãã®æ ŒçŽã«ãããŸãã ãããã£ãŠãè¿
éã«çµã¿ç«ãŠãå Žåã¯ãè¥ãäžä»£ã®ã¿ã調ã¹ãŠãããããå€ãäžä»£ããåç
§ãããŠãããªããžã§ã¯ããååŸããå¿
èŠããããŸãã ã³ãŒãã¯èšè¿°ãããŠããŸããããŸã ãããã°ãããŠããŸããã
- Flex / Bisonã䜿çšããŠImageBuilderããŒãããæžãçŽãäœæ¥ãéå§ãããŸããã ç¶æ¿ããããŠãŒãã£ãªãã£ã«ã¯å€ãã®åé¡ããããŸãããã©ã¡ãŒã¿ãæž¡ãããšã¯ã§ãããéåžžã®ãšã©ãŒåºåã¯ãããŸãããã€ã¡ãŒãžã³ãŒãã®æåã®ãã¢ã倿Žãããšãç¥ç§çãªãã¯ã©ãã·ã¥ãçºçããŸãã ããšãã°ãã³ã¡ã³ããªã©ãåé€ãããšãã®åããç¥ç§çãªãçæŽ»ãããã«ãå Žåã«ãã£ãŠã¯ããŠãŒãã£ãªãã£ã¯èª€ã£ããã€ãã³ãŒããçæããŸãã ãã¡ããããã®ããã«çããããšã¯äžå¯èœãªã®ã§ããªã¡ã€ã¯ããããšã«ããŸããã çŸæç¹ã§ã¯ãLittle Smalltalkã®ææ³ã¯å®å
šã«èšè¿°ãããŠããŸãã èšèªæ§æäœèªäœã«å ããŠããã©ã€ããªããŒãã¹ãã©ããã€ã¡ãŒãžã®æ§ç¯ã«äœ¿çšãããå¶åŸ¡ã³ãã³ãããããŸãã
- ãã¡ã€ã³åãååŸããŠGitHubã«ç§»åããŸãã ã ãªããžããªãllst.orgã§å©çšå¯èœã«ãªããŸãã ã ãã©ãã«ãŒã«ã泚æããŠãã ããã
ããŠãä»ãæãè峿·±ããã®ïŒ
- Smalltalkãã€ãã³ãŒãã®LLVM IRã³ãŒããžã®å€æãå®è£
ããŸããã ãããŠãããã¯ãã¡ãã»ãŒãžãéä¿¡ãããšãã«ããã®å Žã§è¡ãããŸãã ã€ãŸããæåã®åŒã³åºãã§ã¯ãã¡ãœããã³ãŒãã®å€æãšã³ã³ãã€ã«ïŒããªç§ïŒã«æéãããããŸãããåŸç¶ã®åŒã³åºãã¯æ¢ã«ãã€ãã£ãã«è¡ãããŸãã
- äœåãªçµã¿èŸŒã¿é¢æ°llvm.gcrootãåé€ãã远å ã®ãã¹ãå®è£
ããŠãã¡ã¢ãªã¢ã¯ã»ã¹ã®åæ°ãæžãããŸãïŒãããŠãã¡ãããé床ãäžããŸãïŒã
- ã¡ãã»ãŒãžã®éä¿¡ãšã¡ãœããã®ããããã¹ããããã«é¢ããçµ±èšãåéãããŸãã ããã¯ãåŸç¶ã®æé©åã®åºç€ã§ãã
- æåŸã«ããããããã¡ãœããã®ä¿®æ£ãå®è£
ãããŸãããããã¯ãåéãããçµ±èšã«åºã¥ããŠãçŽæ¥åŒã³åºãã®å°å
¥ããã£ãã·ã¥ã®ãã€ãã¹ãã¯ã©ã¹ããŒãã«ã®æ€çŽ¢ã«ãã£ãŠã¡ãœããã倿ŽããŸãã ããã«ããããã€ãã©ã€ã³ãšããã»ããµé·ç§»äºæž¬ãæé©ãªæ¹æ³ã§äœ¿çšã§ããããã©ãŒãã³ã¹ã«ãã©ã¹ã®åœ±é¿ãäžããŸãã
çŸåšãæé©åãããæé©åããããããã³ãŒãã¯ãå®è¡ãããã³ãŒãã«å¿ããŠã以åã®ããŒãžã§ã³ã®ãœãããŠã§ã¢VMãšæ¯èŒããŠ2ã100åé«éã«å®è¡ãããŸãã æªããªããç§ã«ã¯æããã ãŸã éçºã®äœå°ããããŸããã å®éãè€éãªã°ã©ãåæãšåæšè«ãå¿
èŠãšããªãæãåçŽãªæé©åãè¡ãããŠããŸãã èªç±ã«æéãéãããããªãããã£ãšå£®å€§ãªããšãã§ããŸãã
ããã¯ã©ã®ããã«èŠããŸãã
åŒã³åºãçµ±èšãç¥ãããšã§ã³ãŒããé«éåããæ¹æ³ãèŠãŠã¿ãŸãããã åã®èšäºã§èª¬æããæ¢ç¥ã®äžŠã¹æ¿ãã¢ã«ãŽãªãºã ãšãã¡ãã»ãŒãžåŠçã®é床ãè©äŸ¡ã§ãããã³ãããŒã¯ã®ãã¹ããå®è¡ããŸãã ããŒãžã§ã³ãããŒã«ã«ã«ã€ã³ã¹ããŒã«ããå Žåã¯ãgithubã®
ãªããžããªã®èª¬æã«ãã
UsageãšLLVMã®é
ç®ãèªãã åŸãã³ã³ãã€ã«
æžã¿ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããããœãŒã¹ããã³ã³ãã€ã«ããããšããå§ãããŸãã
ãã³ãããŒã¯ããå§ããŸãããïŒ
loopBenchmark | sum | sum <- 0. 1 to: 100000 do: [ :x | sum <- sum + 1 ]. ^sum
ãã®ãæªæã®ãããã³ãŒãã¯ã倿°ã®
sum
10äžåã®å°ããªã³ãŒãã远å ããŸãã ãã¡ãããåºå£ã§åã10äžãååŸããå¿
èŠããããŸãïŒãŸãã¯ãVMããŽãç®±ã«ç§»åã§ããŸãïŒã
ãããŠãå®è¡ã®çµæã¯æ¬¡ã®ãšããã§ãã
å€ãã®ãã $ ./llst Image read complete. Loaded 5442 objects Soft run: 60 Cold jit run: 46 Hot jit run: 28 JIT Runtime stat: Messages dispatched: 200006 Objects allocated: 200004 Blocks invoked: 200002 Block cache hits: 199999 misses 3 ratio 100.00 % Message cache hits: 400004 misses 6 ratio 100.00 % Hot methods: Hit count Method name 200000 Block>>value: (0 sites) 2 Number>>to:do: (1 sites) value: (index 20, offset 109) class hits: (Block 200000) 2 Undefined>>loopBenchmark (1 sites) to:do: (index 15, offset 73) class hits: (SmallInt 2) 2 Block>>value (0 sites) Patching active methods that have hot call sites Recompiling method for patching: Number>>to:do: Patching Number>>to:do: ...done. Verifying ...done. Recompiling method for patching: Undefined>>loopBenchmark Patching Undefined>>loopBenchmark ...done. Verifying ...done. Optimizing Number>>to:do: ...done. Verifying ...done. Optimizing Undefined>>loopBenchmark ...done. Verifying ...done. Compiling machine code for Number>>to:do: ...done. Compiling machine code for Undefined>>loopBenchmark ...done. All is done. Patched cold jit run: 12 Patched hot jit run: 9 JIT Runtime stat: Messages dispatched: 200010 Objects allocated: 400008 Blocks invoked: 400004 Block cache hits: 399998 misses 6 ratio 100.00 % Message cache hits: 400006 misses 10 ratio 100.00 % Hot methods: Hit count Method name 200000 Block>>value: (0 sites) 4 Block>>value (0 sites) 2 Undefined>>loopBenchmark (0 sites) 2 Number>>to:do: (1 sites) value: (index 20, offset 109) class hits: (Block 200000) 2 Undefined>>loopBenchmark (1 sites) to:do: (index 15, offset 73) class hits: (SmallInt 2) ===-------------------------------------------------------------------------=== ... Statistics Collected ... ===-------------------------------------------------------------------------=== 2 adce - Number of instructions removed 2 branchfolding - Number of block tails merged 2 branchfolding - Number of dead blocks removed 1 cgscc-passmgr - Maximum CGSCCPassMgr iterations on one SCC 31 codegen-dce - Number of dead instructions deleted 63 codegenprepare - Number of GEPs converted to casts 9 codegenprepare - Number of blocks eliminated 114 codegenprepare - Number of memory instructions whose address computations were sunk 47 codegenprepare - Number of uses of Cast expressions replaced with uses of sunken Casts 313 dagcombine - Number of dag nodes combined 0 dse - Number of other instrs removed 12 dse - Number of stores deleted 54 gvn - Number of blocks merged 2 gvn - Number of instructions PRE'd 125 gvn - Number of instructions deleted 2 gvn - Number of loads PRE'd 37 gvn - Number of loads deleted 265 inline - Number of functions inlined 271 inline-cost - Number of call sites analyzed 263 instcombine - Number of dead inst eliminated 1 instcombine - Number of dead stores eliminated 67 instcombine - Number of instructions sunk 492 instcombine - Number of insts combined 159 isel - Number of blocks selected using DAG 7667 isel - Number of times dag isel has to try another path 101 jit - Number of bytes of global vars initialized 5310 jit - Number of bytes of machine code compiled 12 jit - Number of global vars initialized 239 jit - Number of relocations applied 3 jit - Number of slabs of memory allocated by the JIT 1 loop-simplify - Number of pre-header or exit blocks inserted 3 machine-licm - Number of hoisted machine instructions CSEed 11 machine-licm - Number of machine instructions hoisted out of loops 73 machine-sink - Number of machine instructions sunk 6 memdep - Number of block queries that were completely cached 11 memdep - Number of fully cached non-local ptr responses 43 memdep - Number of uncached non-local ptr responses 784 pei - Number of bytes used for stack in all functions 1 phi-opt - Number of dead PHI cycles 15 phielim - Number of atomic phis lowered 31 pre-RA-sched - Number of loads clustered together 48 reassociate - Number of insts reassociated 29 regalloc - Number of cross class joins performed 251 regalloc - Number of identity moves eliminated after coalescing 92 regalloc - Number of identity moves eliminated after rewriting 7 regalloc - Number of instructions deleted by DCE 4 regalloc - Number of instructions re-materialized 1 regalloc - Number of interferences evicted 251 regalloc - Number of interval joins performed 11 regalloc - Number of new live ranges queued 683 regalloc - Number of original intervals 369 regalloc - Number of registers assigned 1 regalloc - Number of registers unassigned 3 regalloc - Number of rematerialized defs for spilling 4 regalloc - Number of rematerialized defs for splitting 3 regalloc - Number of spilled live ranges 2 regalloc - Number of splits finished 4 simplifycfg - Number of blocks simplified 2 twoaddrinstr - Number of instructions aggressively commuted 2 twoaddrinstr - Number of instructions commuted to coalesce 4 twoaddrinstr - Number of instructions promoted to 3-address 30 twoaddrinstr - Number of two-address instructions 14 x86-codegen - Number of floating point instructions 1414 x86-emitter - Number of machine instructions emitted ->
ããã§éèŠãªã®ã¯5è¡ã§ãã
Soft run: 60 Cold jit run: 46 Hot jit run: 28 Patched cold jit run: 12 Patched hot jit run: 9
æåã®è¡ã¯ããœãããŠã§ã¢VMã䜿çšããã¡ãœããã®å®è¡ã§ãã æãé
ãæ¹æ³ïŒããªãã¯ãªããã³ãŒãã¯åœä»€ããšã«éåžžã«æ£ç¢ºã«å®è¡ãããŸãã ãã®ã¢ãŒãã¯ãã³ãŒãã«å€æŽãå ããªãããããããã°ã«é©ããŠããŸãã ãŸããã³ãã³ãã©ã€ã³ãè§£æãããšãã«ã€ã¡ãŒãžã«çµã¿èŸŒãŸããã³ã³ãã€ã©ãŒã«ãã£ãŠäœ¿çšãããŸãã
2è¡ç®ã¯JITã³ãŒã«ãã©ã³ã§ãã ãã®ã¡ãœããã¯ãæ©èœçã«åçã®IRã³ãŒãã«å€æãããããã»ããµåœä»€ã«ã³ã³ãã€ã«ãããæ¢ã«çŽæ¥å®è¡ãããŠããŸãã ãã®æ®µéã§ãã§ã«ããã€ãã®æé©åãè¡ãããŠããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã ã¡ãœããã®ã³ã³ãã€ã«ãèæ
®ããŠããç·å®è¡æéã¯çŽç²ãªå®è¡ãããçãããšãããããŸãã ããã¯åžžã«ããã§ã¯ãããŸããã å€ãã®å Žåãè€éãªã¡ãœããã®å Žåãæåã®å®è¡ã«çŽ100ããªç§ã®æéããããå ŽåããããŸããããã®åŸã«ã²ã€ã³ãåŸãããŸãã åãã¢ãŒãã§ã¯ãåŒã³åºãã«é¢ããçµ±èšãèç©ãããŸãïŒåŒã³åºããã³ãã©ãåŒã³åºããããã³ã«ãã³ã³ãã€ã«ãããã¡ãœãããèµ·åãããŸãïŒã
3è¡ç®ã¯ãããã©ã³ã§ãã ãã§ã«JITã«éŠŽæã¿ã®ããã¡ãœãããåŒã³åºããããããæ¢è£œã®ã³ã³ãã€ã«æžã¿ã³ãŒããå«ãŸããŸãã ãªãŒããŒããããªã-ãã£ãã·ã¥å
ã®ã¡ãœããã®ååšã確èªãã颿°ãçŽæ¥åŒã³åºããŸãã çµæã¯æããã§ãã
4è¡ç®ã¯ããããã£ãŒã®ãã³ãŒã«ããå®è¡ãšãçµ±èšããã®ã€ãã³ãã®å®è¡å¯èœæ§ã瀺ãçŽæ¥åŒã³åºãïŒçŽæ¥ïŒã®é
眮ã§ãã ãã®å Žåãããã£å
šäœã颿°ããã¹ããŒããïŒæ°ãã«åã³ã³ãã€ã«ãããŸãïŒããããã£ãŒã¯ãã¹ããŸãã ãããã£ãŒãçŽæ¥åŒã³åºãã§çœ®ãæããå¿
èŠãããåœä»€ãèŠã€ããããšãã§ããããã«ãå®å
šãªåã³ã³ãã€ã«ãå¿
èŠã§ãã åé¡ã¯ããã¹ãæé©åããåŸïŒããã³GCã®ã³ãŒããæºåããåŸïŒãã¡ãœããã®æ¬äœãèªèã§ããªãã»ã©å€æŽãããå¯èœæ§ãããããšã§ãã ããããã¹ãŠã®æäœã®åŸãIRã³ãŒãã¯å®éã®ããã»ããµåœä»€ã«ã³ã³ãã€ã«ããããã®åŸå®è¡ãããŸãã
5è¡ç®ã¯ãããããé©çšããæé©åãããã¡ãœããã®ãããã©ã³ã§ãã ç¹°ãè¿ããŸãããããªãã¯ãªãã§ãããè¡ãã ãã§ãã
ãããã¯ãã€ã§ã...å€ã倿¿ãããšã1ç§ãããçŽ1200äžãããã¯ãç§ã®ãã·ã³ã§åŠçãããŸãã ãã®å®æ°ãããåŠçãããã¡ãã»ãŒãžã®æ°ã®æšå®å€ãååŸã§ããŸãã
Number>>to:do:
ã¡ãœããã«å¯Ÿå¿ããJITã³ãŒãã§ã¯ã次ã®ã¡ãã»ãŒãžéä¿¡ãšåçã®3ã€ã®æäœãå®è¡ãããŸãã
<
#to:do:
ã«ãŒãæ¡ä»¶ïŒå
ã§<
counterãªããžã§ã¯ããéä¿¡ããŸãã#value:
ãããã¯ãªããžã§ã¯ããžïŒãããã¯åŒã³åºãïŒ;sum
ãªããžã§ã¯ãïŒã«ãŒãæ¬äœïŒã«+
ãéä¿¡ããŸãã
äžå®ã®3,600äžãååŸããŸããããã¯ã1ç§ãããã«éä¿¡ãããã¡ãã»ãŒãžã®æ°ãäžããæŠç®ãããšèŠãªãããšãã§ããŸãã
åæã«ãããã¯å¶éé床ããã¯ã»ã©é ãã ããšãã°ã
whileTrue:
ã³ã³ã¹ãã©ã¯ãã䜿çšããŠãã³ãããŒã¯ã®æ¬æãæžãæããå Žå
whileTrue:
loopBenchmark | sum | sum <- 0. [ sum < 1000000 ] whileTrue: [ sum <- sum + 1 ]. ^sum
次ã«ã
100äžåã®å®è¡ã®çµæïŒ10äžåã§ã¯ãªãã宿°ã«æ³šæããŠãã ããïŒã¯æ¬¡ã®ããã«ãªããŸãã
Soft run: 197 Cold jit run: 13 Hot jit run: 4
ãã®å Žåã1ç§ãããçŽ8.1Ã10
8ã¡ãã»ãŒãžããŸãã¯197/4ã®å éãçŽ50åã«ãªããŸãã ããã¯ãã³ã³ãã€ã«ãããããŒãžã§ã³ã«ã¡ãã»ãŒãžéä¿¡ã®å®éã®æäœãå«ãŸããŠããªãããã§ãã
whileTrue:
é·ç§»ã䌎ãç·åœ¢ã®åœä»€ã»ããã«å±éãããŸãã ãã¹ãŠã®æŒç®ã¯ãç®è¡æŒç®ãçŽæ¥å«ããå®è¡ã®åå¥ã®åå²ãããæ°å€ã«å¯ŸããŠè¡ãããŸãã
ãããã£ãŒã䜿çšããå®è¡ã®çµæã¯ããããJITã®å®è¡ã®çµæãšå€ãããŸãããã¡ãã»ãŒãžã®éä¿¡ããªããããåéã§ããçµ±èšæ
å ±ããªããJIT颿°ãžã®çŽæ¥åŒã³åºãã§çœ®ãæããããšãã§ãããœãããŠã§ã¢VMãžã®åŒã³åºãããªãããšãæå³ããŸãã
ãã¡ãããVMã®ããã©ãŒãã³ã¹ã«é¢ããŠã¯ãããããçš®é¡ã®ãã³ãããŒã¯ïŒç¹ã«æŽæ°ã®ãã³ãããŒã¯ïŒã«éåžžã«æ³šæããå¿
èŠããããŸãã ãããã®æ°å€ã¯ãå®è¡ãããæé©åã®å€§ãŸããªè©äŸ¡ã«ã®ã¿äœ¿çšãããå¹³åããŠã³ãŒãã®å®è¡ãéããªã£ãããšãç€ºãææšãšããŠã®ã¿äœ¿çšãããŸãã
ãã¡ãããããã§ã¯æé©åã®ããã®ã»ãŒçæ³çãªæ¡ä»¶ãããããã宿°ã¯å°ãªããªããŸããã«ãŒããšç®è¡ã¯ãã€ãã£ãã³ãŒãå
šäœã«ã³ã³ãã€ã«ãããŸãã çŽæ¥åå²åœä»€ã®ååšã¯ãããã»ããµåå²äºæž¬åãæé©ã«äœ¿çšããŸã;ãã£ãã·ã¥ã®ãã¹ã¯å°ãå°ãªããªããŸãã ãããã£ãŠãæé©åãããŠããªãããŒãžã§ã³ãšæ¯èŒããŠå¢å ããåããã±ãŒãžã«ã€ããŠãã³ãã©ãŒã¹ã¿ãã«ç§»åããå¿
èŠãããããã£ãã·ã¥ã確èªããŠãã¡ãã»ãŒãžã«å®éã«å¯ŸåŠããå¿
èŠããããŠãŒã¶ãŒãçè§£ããŸãã ãããã®99ïŒ
ãèæ
®ããŠãã貎éãªããã»ããµã¯ããã¯ãããã«è²»ããããŸãã
ãœãŒããã¹ãã§ã¯ãããæ§ãããªçµæã衚瀺ãããŸãã
Soft run: 48 Cold jit run: 140 Hot jit run: 25 Patched cold jit run: 7 Patched hot jit run: 6
å®å
šãªçµè« Preparing test data ...done Soft run: 48 Cold jit run: 140 Hot jit run: 25 JIT Runtime stat: Messages dispatched: 210613 Objects allocated: 17746 Blocks invoked: 43006 Block cache hits: 43001 misses 5 ratio 99.99 % Message cache hits: 369520 misses 51704 ratio 87.73 % Hot methods: Hit count Method name 44061 Link>>next (0 sites) 35102 MetaObject>>in:at:put: (0 sites) 27775 Link>>value (0 sites) 25778 Block>>value:value: (0 sites) 17746 Class>>new (0 sites) 17356 MetaLink>>value:next: (3 sites) new (index 3, offset 7) class hits: (MetaLink 17356) in:at:put: (index 11, offset 31) class hits: (MetaLink 17356) in:at:put: (index 18, offset 72) class hits: (MetaLink 17356) 17226 Block>>value: (0 sites) 15619 List>>add: (1 sites) value:next: (index 5, offset 13) class hits: (MetaLink 15619) 1999 List>>isEmpty (1 sites) = (index 4, offset 9) class hits: (SmallInt 1999) 1999 SmallInt>>= (0 sites) 1867 List>>insert:onCondition: (10 sites) isEmpty (index 3, offset 7) class hits: (List 1867) add: (index 10, offset 27) class hits: (List 130) value (index 33, offset 166) class hits: (Link 10419) value:value: (index 40, offset 210) class hits: (Block 10419) next (index 48, offset 268) class hits: (Link 1481) value:next: (index 50, offset 286) class hits: (MetaLink 1481) value:next: (index 57, offset 21) class hits: (Link 1481) next (index 68, offset 8) class hits: (Link 8938) value:next: (index 81, offset 24) class hits: (MetaLink 256) next: (index 83, offset 9) class hits: (Link 256) 1481 Link>>value:next: (0 sites) 392 List>>size (0 sites) 390 MetaList>>new (2 sites) new (index 4, offset 9) class hits: (MetaCollection 390) in:at:put: (index 12, offset 34) class hits: (MetaList 390) 384 Link>>next: (0 sites) 262 Collection>>sort: (13 sites) size (index 3, offset 7) class hits: (List 262) insertSort: (index 12, offset 34) class hits: (List 132) popFirst (index 21, offset 88) class hits: (List 130) new (index 26, offset 126) class hits: (MetaList 130) new (index 31, offset 158) class hits: (MetaList 130) value:value: (index 42, offset 219) class hits: (Block 15359) add: (index 49, offset 279) class hits: (List 8207) add: (index 56, offset 12) class hits: (List 7152) do: (index 59, offset 31) class hits: (List 130) sort: (index 64, offset 64) class hits: (List 130) sort: (index 70, offset 19) class hits: (List 130) add: (index 76, offset 4) class hits: (List 130) appendList: (index 81, offset 24) class hits: (List 130) 260 Link>>do: (2 sites) value (index 18, offset 72) class hits: (Link 260) value: (index 20, offset 82) class hits: (Block 260) 260 List>>do: (1 sites) do: (index 9, offset 25) class hits: (Link 260) 132 Collection>>insertSort: (4 sites) isEmpty (index 3, offset 7) class hits: (List 132) new (index 16, offset 55) class hits: (MetaList 130) insert:onCondition: (index 27, offset 130) class hits: (List 1867) do: (index 30, offset 143) class hits: (List 130) 130 List>>popFirst (3 sites) value (index 14, offset 43) class hits: (Link 130) next (index 19, offset 76) class hits: (Link 130) - (index 25, offset 111) class hits: (SmallInt 130) 130 SmallInt>>- (0 sites) 130 List>>appendList: (7 sites) firstLink (index 8, offset 21) class hits: (List 2) size (index 13, offset 40) class hits: (List 2) next (index 36, offset 181) class hits: (Link 8207) next (index 43, offset 234) class hits: (Link 8079) firstLink (index 54, offset 3) class hits: (List 128) next: (index 56, offset 12) class hits: (Link 128) size (index 61, offset 49) class hits: (List 128) 130 List>>firstLink (0 sites) 2 Collection>>sort (1 sites) sort: (index 10, offset 27) class hits: (List 2) 2 Block>>value (0 sites) ===-------------------------------------------------------------------------=== ... Statistics Collected ... ===-------------------------------------------------------------------------=== 2 adce - Number of instructions removed 14 branchfolding - Number of block tails merged 6 branchfolding - Number of branches optimized 5 branchfolding - Number of dead blocks removed 1 cgscc-passmgr - Maximum CGSCCPassMgr iterations on one SCC 38 codegen-dce - Number of dead instructions deleted 220 codegenprepare - Number of GEPs converted to casts 2 codegenprepare - Number of blocks eliminated 151 codegenprepare - Number of memory instructions whose address computations were sunk 123 codegenprepare - Number of uses of Cast expressions replaced with uses of sunken Casts 854 dagcombine - Number of dag nodes combined 250 dce - Number of insts removed 194 dse - Number of other instrs removed 158 dse - Number of stores deleted 51 gvn - Number of blocks merged 353 gvn - Number of instructions deleted 6 gvn - Number of loads PRE'd 277 gvn - Number of loads deleted 862 inline - Number of functions inlined 862 inline-cost - Number of call sites analyzed 1085 instcombine - Number of dead inst eliminated 69 instcombine - Number of instructions sunk 2540 instcombine - Number of insts combined 194 isel - Number of blocks selected using DAG 18193 isel - Number of times dag isel has to try another path 461 jit - Number of bytes of global vars initialized 12042 jit - Number of bytes of machine code compiled 25 jit - Number of global vars initialized 375 jit - Number of relocations applied 2 jit - Number of slabs of memory allocated by the JIT 15 llst - Number of removed loads from gc.root protected pointers <<<<<< 222 llst - Number of removed roots <<<<<< 4 machine-cse - Number of common subexpression eliminated 1 machine-licm - Number of hoisted machine instructions CSEed 14 machine-licm - Number of machine instructions hoisted out of loops 71 machine-sink - Number of machine instructions sunk 10 memdep - Number of block queries that were completely cached 81 memdep - Number of fully cached non-local ptr responses 84 memdep - Number of uncached non-local ptr responses 2792 pei - Number of bytes used for stack in all functions 9 phielim - Number of atomic phis lowered 2 phielim - Number of critical edges split 36 pre-RA-sched - Number of loads clustered together 23 reassociate - Number of insts reassociated 21 regalloc - Number of cross class joins performed 250 regalloc - Number of identity moves eliminated after coalescing 124 regalloc - Number of identity moves eliminated after rewriting 6 regalloc - Number of instructions deleted by DCE 1 regalloc - Number of interferences evicted 248 regalloc - Number of interval joins performed 21 regalloc - Number of new live ranges queued 1240 regalloc - Number of original intervals 891 regalloc - Number of registers assigned 1 regalloc - Number of registers unassigned 6 regalloc - Number of rematerialized defs for spilling 4 regalloc - Number of rematerialized defs for splitting 6 regalloc - Number of spilled live ranges 4 regalloc - Number of splits finished 13 simplifycfg - Number of blocks simplified 3 twoaddrinstr - Number of instructions re-materialized 43 twoaddrinstr - Number of two-address instructions 40 x86-codegen - Number of floating point instructions 2697 x86-emitter - Number of machine instructions emitted Patching active methods that have hot call sites Recompiling method for patching: MetaLink>>value:next: Patching MetaLink>>value:next: ...done. Verifying ...done. Recompiling method for patching: List>>add: Patching List>>add: ...done. Verifying ...done. Recompiling method for patching: List>>isEmpty Patching List>>isEmpty ...done. Verifying ...done. Recompiling method for patching: List>>insert:onCondition: Patching List>>insert:onCondition: ...done. Verifying ...done. Recompiling method for patching: MetaList>>new Patching MetaList>>new ...done. Verifying ...done. Recompiling method for patching: Collection>>sort: Patching Collection>>sort: ...done. Verifying ...done. Recompiling method for patching: Link>>do: Patching Link>>do: ...done. Verifying ...done. Recompiling method for patching: List>>do: Patching List>>do: ...done. Verifying ...done. Recompiling method for patching: Collection>>insertSort: Patching Collection>>insertSort: ...done. Verifying ...done. Recompiling method for patching: List>>popFirst Patching List>>popFirst ...done. Verifying ...done. Recompiling method for patching: List>>appendList: Patching List>>appendList: ...done. Verifying ...done. Recompiling method for patching: Collection>>sort Patching Collection>>sort ...done. Verifying ...done. Optimizing MetaLink>>value:next: ...done. Verifying ...done. Optimizing List>>add: ...done. Verifying ...done. Optimizing List>>isEmpty ...done. Verifying ...done. Optimizing List>>insert:onCondition: ...done. Verifying ...done. Optimizing MetaList>>new ...done. Verifying ...done. Optimizing Collection>>sort: ...done. Verifying ...done. Optimizing Link>>do: ...done. Verifying ...done. Optimizing List>>do: ...done. Verifying ...done. Optimizing Collection>>insertSort: ...done. Verifying ...done. Optimizing List>>popFirst ...done. Verifying ...done. Optimizing List>>appendList: ...done. Verifying ...done. Optimizing Collection>>sort ...done. Verifying ...done. Compiling machine code for MetaLink>>value:next: ...done. Compiling machine code for List>>add: ...done. Compiling machine code for List>>isEmpty ...done. Compiling machine code for List>>insert:onCondition: ...done. Compiling machine code for MetaList>>new ...done. Compiling machine code for Collection>>sort: ...done. Compiling machine code for Link>>do: ...done. Compiling machine code for List>>do: ...done. Compiling machine code for Collection>>insertSort: ...done. Compiling machine code for List>>popFirst ...done. Compiling machine code for List>>appendList: ...done. Compiling machine code for Collection>>sort ...done. All is done. Patched cold jit run: 7 Patched hot jit run: 6
ããã§ãã©ã®ããã«ããããŠã©ã®ããã«æé©åããããã«ã€ããŠããã€ãã®èšèãèšãå¿
èŠããããŸãã ãŸãããããã£ãŒã¯ã¡ãœããã®æ©èœã®ã¿ãæž¡ããŸãã ãããã¯ã¯æé©åãããªããŸãŸã§ãã æ¬¡ã«ãã¡ãã»ãŒãžéä¿¡æäœããšã«
Array
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã¡ãã»ãŒãžåŒæ°ãé
眮ãããŸãã ããã«ãæéãããããŸãã æåŸã«ãçŸåšãã€ã³ã©ã€ã³åã¡ãœããã¯å®éã«ã¯äœ¿çšãããŠããŸããã ããã¯ããŠãŒãã£ãªãã£é¢æ°ïŒåŸã§èª¬æããŸãïŒãšããã€ãã®ç°¡åãªæ§é ã®ã¿ã«é¢ä¿ããŸãã ããã«ããããããªãæé©åã®å¯èœæ§ã¯å°œããããšã¯ãªãããšçµè«ä»ããããšãã§ããŸãã
ã³ã³ãã€ã«ããã»ã¹äžããã³ããã°ã©ã å®è¡äžã«äœãèµ·ãããããã詳现ã«çè§£ããã«ã¯ãä»®æ³ãã·ã³ã®å
éšãããã³ãçè§£ããå¿
èŠããããŸãã ä»äœãããŸããã
Smalltalkä»®æ³ãã·ã³
ä»®æ³ãã·ã³ã¯ãªããžã§ã¯ããæäœããŸããæäœã¯ããªããžã§ã¯ãéã§ã¡ãã»ãŒãžã亀æãããªããžã§ã¯ãã®èåŸã«ãããŽããäžæããããšã«åæžãããŸããå®éãä»®æ³ãã·ã³ãè¡ãå¯äžã®æ·±å»ãªæäœã¯ãã¡ãã»ãŒãžã®éä¿¡ã§ããä»ã®ãã¹ãŠã¯ãäœããã®åœ¢ã§ãåãåæã«åž°çããŸãããã·ã³ããããè¡ãæ¹æ³ãçè§£ããã«ã¯ããŸãSmalltalkãªããžã§ã¯ããšã¯äœããçè§£ããå¿
èŠããããŸãããªããžã§ã¯ã
æ¬¡ã®æ§é ã«ããããªããžã§ã¯ããç°¡çŽ åã§ããŸãã struct TObject { TSize size; TClass* klass; union { TObject* fields[0]; uint8_t bytes[0]; }; };
åãªããžã§ã¯ãã«ã¯ããªããžã§ã¯ãã®ãµã€ãºãšãã®ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãèšé²ãããèŠåºãããããŸãã以äžã¯ãä»ã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãå«ããªããžã§ã¯ããã£ãŒã«ãã§ãããã¡ãããã¯ã©ã¹ããã£ãŒã«ãããªããžã§ã¯ãã§ãããããåãæ§é ã§è¡šãããŸããSmalltalkã®ãã¹ãŠã®ãªããžã§ã¯ãã¯4ãã€ãã®åæ°ã§ãããã®ãµã€ãºã¯ãŒããªãã»ããã§æ ŒçŽãããäžäœ2ãããã¯ç¹å¥ãªåœ¹å²ãæãããŸãããã€ããªïŒBïŒããã³éæ¥ïŒIïŒãã©ã°ãæ ŒçŽãããŸãããã©ã°Bã¯ããªããžã§ã¯ãããã€ããªã§ããããšãæå³ããŸããã€ãŸããéåžžã®ãªããžã§ã¯ãã®ãã£ãŒã«ãçšã«äºçŽãããå Žæã«æªå å·¥ã®ãã€ãã»ãããæ ŒçŽããŸãããã®ãããªãªããžã§ã¯ãã¯ãããšãã°ãã©ã€ã³ïŒã€ã³ã¹ã¿ã³ã¹String
ïŒã§ããã€ã³ã¹ã¿ã³ã¹ã«ä¿åãããŠããã¡ãœãããã€ãã³ãŒãByteArray
ãããããã€ããªãªããžã§ã¯ãã§ãããã€ããªãªããžã§ã¯ãã«ã¯ãåžžã«ãã€ããè€æ°ã®é·ããŸã§åã蟌ãŸããŸãããã©ã°Iã¯ãæ¢ã«åŠçããããªããžã§ã¯ããããŒã¯ããããã«ããŒããééãããšãã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠäœ¿çšãããŸãããããã£ãŠããªããžã§ã¯ãã®ãµã€ãºã«å¯ŸããŠ30ããããæ®ããŸããéåžžã®ãªããžã§ã¯ãã®å Žåããµã€ãºã¯ãã£ãŒã«ãïŒ4ãã€ãã®åæ°ïŒããã€ããªã®å Žå-ãã€ãã§èšç®ãããŸããäž¡æ¹ã®ãªããžã§ã¯ãã«ã¯åãæ¢ç¥ã®èŠåºãããããããåèšãµã€ãºã§ã¯ãã®ãµã€ãºã¯èæ
®ãããŸãããSmallInt
ãã¹ãŠã®ãªããžã§ã¯ãã¯ã4ãã€ãã§æŽåãããã¡ã¢ãªã«é
眮ãããŸãããããã£ãŠãã¢ãã¬ã¹ã®äžäœ2ãããã¯åžžã«0ã«ãªããŸãããã®äºå®ã¯ããªããžã§ã¯ãã®ãã£ãŒã«ãã«æå€§31ãããé·ã®æ°å€ãçŽæ¥æ ŒçŽããããã«äœ¿çšãããŸãããã®å Žåãèšé²ãããæ°å€ã¯2åããïŒå·Šã«1ãããã·ããïŒãäžäœãããã¯1ã«èšå®ãããŸããä»®æ³ãã·ã³ã¯ãã®æé©åãèªèãããã£ãŒã«ãã«ã¢ã¯ã»ã¹ãããã¹ãŠã®å Žæã§ããªããžã§ã¯ããã€ã³ã¿ãŒãå®éã«æ ŒçŽãããŠãããã©ããã確èªããŸããŸãã¯ããã®æ
å ±ã¯æ°åãšããŠè§£éããå¿
èŠããããŸãããã®ç¹ã¯ãã·ã¹ãã ã®ä»ã®éšåã«å¯ŸããŠå®å
šã«ééçã§ããããšã«æ³šæããããšãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã¯ãäœããã©ãã«ãã©ã®ããã«ä¿åãããŠããããç¥ãå¿
èŠã¯ãããŸãããããšãã°ãã³ã³ãœãŒã«ã§ã³ãã³ããèšè¿°ã1 class
ãæåŸ
ãããå¿çãååŸããããšã¯å®å
šã«åæ³ã§ãSmallInt
ãç»åå
ã®ãã®åäœã¯ãŸãã«ãã®ãããªããªããžã§ã¯ããã«ãã£ãŠè¡šãããŸããSmallInt
ããã®å°ããªããªãã¯ã¯ããã€ããªè¡šçŸããã1ãããã ãå€ãã䜿çšããŠæ°å€ãæžã蟌ããããæ¶è²»ãããã¡ã¢ãªã®éã倧å¹
ã«åæžã§ããŸãããã¯ã·ã³ã°ã䜿çšãããå Žåãåçªå·ã«å¯ŸããŠã4ãã€ãã®ãªããžã§ã¯ããã€ã³ã¿ãŒã«å ããŠãããããŒã®å¥ã®8ãã€ããšå®éã®ããŒã¿ã®4ãã€ããæ ŒçŽãããŸããæåã®éžæè¢ã§ã¯ãªãããã§ããã¡ãã»ãŒãž
åã®èšäºã§ãã§ã«èª¬æããããã«ãã¡ãã»ãŒãžã¯ã¬ã·ãŒããŒãªããžã§ã¯ããã»ã¬ã¯ã¿ãŒããã©ã¡ãŒã¿ãŒã»ããã§ããã¡ãã»ãŒãžã®éä¿¡ãšé¢æ°ã®åŒã³åºãã®éèŠãªéãã¯ãæåŸã®ç¬éãŸã§èª°ãå®éã«ã¡ãã»ãŒãžãåŠçãããããããªãããšã§ãããªããžã§ã¯ãã®ã¿ãç¥ãããŠããŸã-ã¡ãã»ãŒãžã®åä¿¡è
ãã¡ãã»ãŒãžã®éä¿¡ã¯ãã¡ãã»ãŒãžãåŠçã§ããã¯ã©ã¹ã®éå±€å
ã®æ€çŽ¢ããå§ãŸããŸããæ€çŽ¢ã¯ããªããžã§ã¯ãã®çŽæ¥ã®ã¯ã©ã¹ãããéå±€ãäžã£ãŠãæå€§ã§å®è¡ãããŸããObject
ã倧éã®ã¡ã¢ãªã¢ã¯ã»ã¹ãè¡ãå¿
èŠããããããããã¯ããªãé«äŸ¡ãªæäœã§ãããšèšããªããã°ãªããŸããããããã£ãŠãæ€çŽ¢çµæã¯ãã£ãã·ã¥ãããŸãããããã£ãŠãå®å
šãªæ€çŽ¢ã¯äžåºŠã ãå®è¡ããå¿
èŠããããŸããã¡ãœãããã£ãã·ã¥ããã©ãã·ã¥ãããã®ã¯ã次ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒã¡ãœãããªããžã§ã¯ããç§»åããå¯èœæ§ãããïŒã𿬡ã®ã¡ãœããã远å ãŸãã¯åé€ãããïŒéå±€ã«ââ圱é¿ããïŒå Žåã®2ã€ã ãã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³äžã®ãã£ãã·ã¥ã®å®æçãªã¯ãªãŒãã³ã°ãèæ
®ããŠãããããã®å²åã¯éåžžã«é«ããŸãŸïŒçŽ99ïŒ
ïŒã§ãããããã¡ãœããã®æ€çŽ¢ã«è²»ããããæéã¯å¹³åçã«ã¯éèŠã§ã¯ãªããšèããããŸãããªããžã§ã¯ã'Hello world'
ïŒã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹String
ïŒã«ã¡ãã»ãŒãžãéä¿¡ããå Žåã®æ€çŽ¢ã®æ§åãèŠãŠã¿ãŸããã#isNil
ãæ€çŽ¢ã¯æ¬¡ã®ããã«å®è¡ãããŸãã- hash(String, #isNil);
- , ;
- ,
String
: - methods , (
Dictionary
) .
: ;
; - ;
- , , , ; ;
- , :
- ( nil ), 4;
- , .
ã¡ãœãããã¯ã©ã¹éå±€ã§äžåºŠãèŠã€ãããªãã£ãå Žåãä»®æ³ãã·ã³ã¯ã#doesNotUnderstand:
åŠçãããããšãä¿èšŒãããïŒå°ãªããšãå®éã®ãã®ã§ã¯Object
ïŒãªããžã§ã¯ãã«ã¡ãã»ãŒãžãéä¿¡ããŸããå Žåã«ãã£ãŠã¯ãã¯ã©ã¹ã¯ãã®ã¡ãã»ãŒãžãæå³çã«ã€ã³ã¿ãŒã»ããããŠç¹å®ã®ç®æšãéæããŸããããšãã°ããããã·ãªããžã§ã¯ãã¯ãããå®è¡ã§ããã¡ãã»ãŒãžã¯æå¹ãªã¢ãã¬ã¹ã«é
ä¿¡ãããŸããäžèšã®ã¡ãã»ãŒãžã®å Žåã¯String>>isNil
ãæ€çŽ¢æååã¯ã次ã®ããã«ãªããŸããString
â Array
â Collection
â Magnitude
â Object
ãã¡ãœãããèŠã€ãã£ãåŸãä»®æ³ãã·ã³ã¯ã³ã³ããã¹ããªããžã§ã¯ããäœæããŠããŒã¿ãå
¥åããã¡ãœããã«é²ã¿ãŸããã³ã³ããã¹ã
ã³ã³ããã¹ãã®æŠå¿µã¯ãã¡ãã»ãŒãžãéä¿¡ããæäœãšå¯æ¥ã«ãªã³ã¯ããŠããŸããx86ãªã©ã®åŸæ¥ã®ããã»ããµã¢ãŒããã¯ãã£ã«ã¯ãã³ãŒã«ã¹ã¿ãã¯ã®æŠå¿µãååšããŸãã颿°ãåŒã³åºããããšãæ»ãã¢ãã¬ã¹ãšãšãã«æž¡ããããã©ã¡ãŒã¿ãŒãã¹ã¿ãã¯ã«ããã·ã¥ããããã®åŸé¢æ°æ¬äœãžã®é·ç§»ãå®è¡ãããŸãããããã颿°ãçµäºãããšãã¹ã¿ãã¯ã®æäžéšããæ»ãã¢ãã¬ã¹ãåé€ãããŸããã¹ã¿ãã¯äžã®å颿°ã«ã¯ãã¹ã¬ãããéå§ãããŠããçŸåšã®é¢æ°åŒã³åºããŸã§ã®é·ç§»ã®ãéå±€ãå
šäœãååšããããšãããããŸããSmalltalkã§ã¯ããã¹ãŠãç°ãªã£ãŠè¡ãããŸããåäžã®åŒã³åºãã¹ã¿ãã¯ã¯ãããŸããã代ããã«ãã¡ãã»ãŒãžãéä¿¡ããããã³ã«ã³ã³ããã¹ããªããžã§ã¯ããçæãããŸããããã®ç¹å®ã®ããã±ãŒãžã«é¢é£ããæ
å ±ãä¿åããŸããã¡ãœããæ¬äœèªäœãå®è¡ããå Žåãä»®æ³ãã·ã³ã¯åããªããžã§ã¯ãã䜿çšããŸããããã¯æ¬¡ã®ãããªãã®ã§ãã struct TContext : public TObject { TMethod* method; TObjectArray* arguments; TObjectArray* temporaries; TObjectArray* stack; TInteger bytePointer; TInteger stackTop; TContext* previousContext; };
- æ¹æ³ -ããã§ã¯ãã¡ãã»ãŒãžãåŠçãã以åã®æ¹æ³ãçºèŠãããªããžã§ã¯ããžã®ãã€ã³ã¿ã眮ããŸããã
- arguments-質éïŒã€ã³ã¹ã¿ã³ã¹
Array
ïŒãžã®ãã€ã³ã¿ãŒãããã«æ ŒçŽãããæž¡ãããåŒæ°ãä¿åãããŸãã - temporaries-äžæã¡ãœãã倿°ã®ã¹ãã¬ãŒãžãç¹ã«ã
| |
ã¡ãœããããããŒå
ã®æåã®éã«æžã蟌ãŸãããã®ã - stack â . . . , . .
- bytePointer â ; IP . . .
- stackTop â .
- previousContext-ããã§ã¯ãã¡ãã»ãŒãžãéä¿¡ãããã¡ãœããããã芪ã³ã³ããã¹ãã®ã¿ãä¿åãããŸããçŸåšã®ã¡ãœããããå€ãè¿ããšããã®å€ã¯èŠªã¹ã¿ãã¯ã®äžçªäžã«é
眮ãããŸãã
ãã€ã§ããã³ã³ããã¹ãã«ã¯ã¡ãœããå®è¡ã®çŸåšã®ç¶æ
ã«é¢ãããã¹ãŠã®æ
å ±ããããŸããããã«ãããã¡ãœããã®å®è¡ãç°¡åã«äžæããŠïŒããšãã°ãå²ãåœãŠããããã£ãã¯æ°ã®æå¹æéãåããåŸïŒãåŸã§æ»ãããšãã§ããŸããããšãã°ãç¶ç¶ã®å®è£
ãªã©ããšããŸããã¯ãªãŠãŒã¹ã±ãŒã¹ããŸã ãããŸããæ¹æ³
ã¡ãœããã¯ã次ã®åœ¢åŒã®ãªããžã§ã¯ãã§è¡šãããŸãã struct TMethod : public TObject { TSymbol* name; TByteObject* byteCodes; TSymbolArray* literals; TInteger stackSize; TInteger temporarySize; TClass* klass; TString* text; TObject* package; };
- name-ã¡ãœããã®å®éã®ååããŸãã¯ãã®ååã®ã·ã³ãã«ãžã®ãã€ã³ã¿ãŒã
- byteCodes â
ByteArray
, - . - literals â . : , , . , .
- stackSize â (. TContext::stack), .
- temporarySize â , . .
- klass â , .
- text â .
- ããã±ãŒãžã¯ãã®ã¡ãœããã®ã«ããŽãªã§ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºãããã¡ãœããã®ãªã¹ãããã£ã«ã¿ãŒåŠçããããã«èšèšãããŠããŸããçŸåšäœ¿çšãããŠããŸããã
ã¡ãœãããªããžã§ã¯ãã¯ããã©ã€ããªã€ã¡ãŒãžãImageBuilderã䜿çšããŠãœãŒã¹imageSource.stããã³ã³ãã€ã«ãããçµæã®ã€ã¡ãŒãžãã¡ã€ã«ã«ä¿åããããšãã«åœ¢æãããŸãããŸããã³ãã³ãã©ã€ã³ããã³ãã³ããå®è¡ãããšã1åéãã®ã¡ãœãããäœæãããŸããå®éãã³ãã³ãã©ã€ã³ããã¹ãã¯ã¡ãœããã®æ¬æãšããŠè§£éãããéåžžã®æ¹æ³ã§ã³ã³ãã€ã«ãããŠåŒã³åºãããŸãããã®ããã«ããŸããã¡ãœããã®æ¬äœã«Undefined>>main
ã³ãŒãããããŸãïŒ [ command <- String readline: '->'. command notNil ] whileTrue: [ command isEmpty ifFalse: [ command doIt printNl ] ]
ãŸããreadlineã©ã€ãã©ãªã䜿çšããŠãã³ãã³ãã©ã€ã³ãååŸããŸããæ¬¡ã«ãã¡ãã»ãŒãžãæååãªããžã§ã¯ãã«éä¿¡ãã#doIt
ããã®çµæãç»é¢ã«è¡šç€ºãããŸããã¡ãœããèªäœã¯#doIt
次ã®ãšããã§ãã doIt | method | method <- Undefined parseMethod: 'doItCommand ^ ' + self. ^ method notNil ifTrue: [ ^ Context new perform: method withArguments: (Array new: 1) ]
ãã¹ãŠã®éæ³ã¯ãããã§ã€ã¡ãŒãžããã¹ãã«å®è£
ãããã³ã³ãã€ã©ã䜿çšããŠãUndefined>>parseMethod:
ãœãŒã¹ããã¹ã#doItCommand
ããã¡ãœãããªããžã§ã¯ãã圢æããã¡ãœããã§äœæãããŸããSmalltalkã¯ãSmalltalkèªäœã§æžãããã³ã³ãã€ã©ã䜿çšããŠç¬èªã®ã¡ãœãããã³ã³ãã€ã«ããŸããSmalltalkã¯ã€ã¡ãŒãžã®äžå¯æ¬ ãªéšåã§ãããã®ç¬éã¯ãšãŠãé¢çœããšæããŸããã¡ãœãããªããžã§ã¯ããäœæããããšãã³ã³ããã¹ããªããžã§ã¯ããäœæãããŠåŒã³åºãããäœæãããã¡ãœãããå®è¡ãããŸããæ°ããã¡ãœããã¯ã©ã®ã¯ã©ã¹ã®ã¡ãœãããªã¹ãã«ã远å ãããŠããªããããå®è¡æïŒæ¬¡ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãŸã§ïŒã«ã®ã¿ååšããŸããä»®æ³ãã·ã³ã®æç€º
ä»®æ³ãã·ã³ã¯ãã¡ãœããã®ãã¬ãŒã ã¯ãŒã¯å
ã§ã®ã¿åœä»€ãå®è¡ã§ããŸããã³ãŒãã¡ãœããã®å€åŽã«ã¯ååšããŸãããåœä»€ã¯ãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã®byteCodesãã£ãŒã«ãã«æ ŒçŽãããŸãMethod
ãããã«ãã€ã³ã¹ã¿ã³ã¹èªäœã«ã¯ãã³ã³ããã¹ããªããžã§ã¯ããåæåãããšãã«ã䜿çšãããè¿œå æ
å ±ãå«ãŸããŠããŸãïŒäžèšãåç
§ïŒããã®èšäºã¯ãã§ã«å€§ããæé·ããŠãããããããã§ã¯ãã€ãã³ãŒãã衚çŸããããã®åœ¢åŒã«ã€ããŠè©³ãã説æããŸããã1ã€ã®åœä»€ã1ãã€ããŸãã¯2ãã€ããå æã§ããããšã«æ³šæããŠãã ãããå€ã¹ã¿ãã¯ã®èª¬æ
ãªããžã§ã¯ãã®1ã€ãå€ã¹ã¿ãã¯ã®äžçªäžã«ããã·ã¥ããããã·ã¥åœä»€ããããŸããåœä»€ã³ãŒããšãšãã«ãæŽæ°ãã©ã¡ãŒã¿ãŒãæå®ãããŸããããã¯ã察å¿ããããŒã¿æ§é ãããªããžã§ã¯ããéžæããããã®ã€ã³ããã¯ã¹ãšããŠè§£éãããŸãã- pushArgument-çŸåšã®ã³ã³ããã¹ãã®åŒæ°ã®é
åããã®åŒæ°ã
- pushInstance-çŸåšã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã
- pushTemporary-çŸåšã®ã³ã³ããã¹ãã®å€æ°ã®é
åããã®äžæå€æ°ã
- pushLiteral-ãã®ã¡ãœããã®ãªãã©ã«ã®å®æ°é
åããã®ãªãã©ã«ã
å°ãç°ãªãåäœãããä»ã®2ã€ã®ç¹å¥ãªããã·ã¥åœä»€ããããŸãã- pushConstant â :
SmallInt
, 0-9 , nil , true false , Undefined
, True
False
. - pushBlock â
Block
, - , . bytePointer .
ãŸããããã€ãã®éã®æäœããããŸããæ¬¡ã®æäœã䜿çšãããšãã¹ã¿ãã¯ããå€ãåé€ããã«ãã£ãŒã«ããšäžæå€æ°ã®å€ã倿Žã§ããŸãããã£ãŒã«ããšå€æ°ã¯ããªãã·ã§ã³ã®æŽæ°ãã©ã¡ãŒã¿ãŒã«ãã£ãŠãã€ã³ããã¯ã¹åãããŸãã- assignInstance-çŸåšã®ãªããžã§ã¯ããã£ãŒã«ãã®å€ãã¹ã¿ãã¯ã®äžçªäžã«å²ãåœãŠãŸãã
- assignTemporary-äžæå€æ°ã«ã¹ã¿ãã¯ã®äžçªäžã«ããå€ãå²ãåœãŠãŸãã
åŒæ°ãšãªãã©ã«ã¯äž¡æ¹ãšãã¡ãœããåŒã³åºãã®äžéšãšããŠå®æ°ãšèŠãªãããããããããã®å²ãåœãŠæäœã¯ååšããŸãããã¹ã¿ãã¯ããå€ãåé€ããããã«ãå¥ã®æäœïŒpopTopïŒãæäŸãããŸããããã«ã€ããŠã¯ã以äžã§èª¬æããŸããç§»è¡æé
ãã¡ãããç§»è¡æé ããããŸãïŒ- branchIfTrue â bytePointer , true .
- branchIfFalse â , false .
- branch â .
ã¡ãã»ãŒãžéä¿¡æé ã¯æ®éçã§ãããã©ãã«ã§ãé©çšã§ããŸãããå Žåã«ãã£ãŠã¯ãå°çšã®å®è£
ã䜿çšããŠåŠçãé«éåããŸãããã®ãããªç¹æ®ãªã±ãŒã¹ã¯ãåé
ããã³ãã€ããªã¡ãã»ãŒãžãéä¿¡ããæäœã§ããåå¥ã®sendUnaryåœä»€ãšsendBinaryåœä»€ãæäŸãããŸããéåžžã®ã¡ãã»ãŒãžã¯sendMessageã«ãã£ãŠéä¿¡ãããŸããã¡ãã»ãŒãžãéä¿¡ãããšãåŒæ°ãã¹ã¿ãã¯ã«ããã·ã¥ããããã®åŸmarkArguments Nã¹ããŒãã¡ã³ããåŒã³åºãããŸããã¹ã¿ãã¯ããNåã®å€ãåé€ããããããããªããžã§ã¯ãã圢æããŸãArray
ãæ¬¡ã«ããã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ã¯ã¹ã¿ãã¯ã®äžçªäžã«æ»ããŸããããã¯ãäœæãããã³ã³ããã¹ããªããžã§ã¯ãã®åŒæ°ãã£ãŒã«ããåæåãããšãã«äœ¿çšãããŸããè¿åæé
é
ããæ©ãããäœããã®æ¹æ³ã§ã¡ãœããããæ»ãå¿
èŠããããŸããããã¯ã埩垰æç€ºã䜿çšããŠè¡ãããŸããäž»ãªãã®ã¯stackReturnã§ããããã¯ãã¹ã¿ãã¯ããå€ãåé€ããŠåŒã³åºãã³ã³ããã¹ãã«æž¡ããã¡ãœããã®çŸåšã®ã³ã³ããã¹ãã忢ããŸããSmalltalkã§ä»»æã®å€ãè¿ãããšã«å ããŠãçµæãšããŠselfãè¿ãããšãéåžžã«é »ç¹ã«å¿
èŠã§ãããããã£ãŠããã®ãããªæäœçšã«ç¬ç«ããselfReturnã¹ããŒãã¡ã³ããçšæãããŠããŸããæåŸã®returnã¹ããŒãã¡ã³ãã¯blockReturnã§ããæã§èª¬æããã®ã¯ããªãé£ããã§ããåºæ¬çãªèãæ¹ã¯ãå¶åŸ¡ã¯èŠªã³ã³ããã¹ãã«ã§ã¯ãªããçŸåšå®è¡äžã®ãããã¯ã®å®£èšãå«ãã¡ãœããã®èŠªã³ã³ããã¹ãã«è»¢éãããŸãããã®åäœã¯ãä»ã®èšèªã®äŸå€ã¹ããŒã¡ã«ããºã ãšæ¯èŒã§ããŸããããã°ã©ã ã®ç¹å¥ãªç¶æ³ã§ã®ã¿çºçããäžè¬çãªã±ãŒã¹ã§ã¯ããã°ã©ã ã®ãéåžžã®ãå®è¡ã«é¢ä¿ããªãäŸå€ãšã¯å¯Ÿç
§çã«ãblockReturnã¯ä»®æ³ãã·ã³ã®èгç¹ããã¯å®å
šã«éåžžã®æäœã§ãããäžè¬çãªã³ãŒãã§äœ¿çšã§ããŸããããã¯äŸã䜿çšããŠè¡šç€ºããã®ãæãç°¡åã§ããããã¯ã¡ãœããããã¹ãã§ããCollection>>at:ifAbsent:
at: value ifAbsent: exceptionBlock self do: [ :element | element = value ifTrue: [ ^element ] ]. ^exceptionBlock value
^element
ãã¹ãããããããã¯èªäœã®åŒã¯ãblockReturnã¹ããŒãã¡ã³ãã䜿çšããŠã³ã³ãã€ã«ãããŸããå®éã«ã¯ããããã¯ã¯çŸåšã®ã¡ãœããã§ã¯å®è¡ãããŸããããããæ·±ãããããããå¿
èŠã§ããã¡ãœããCollection>>at:ifAbsent:
ã¯methodãåŒã³åºããCollection>>do:
ãã©ã¡ãŒã¿ãŒãšããŠå€éšãããã¯ãæž¡ããŸãããã®ã¡ãœããã¯ãã³ã¬ã¯ã·ã§ã³ã®åèŠçŽ ãCollection>>do:
åŒã³åºãBlock>>value:
ãŠããã©ã¡ãŒã¿ãŒããããã¯ã«æž¡ããŸãããããŠãå
éšã«Block>>value:
ããã®ã¯ããªããã£ãçªå·8ã ãã§ãããã¯ãã§ã«ãããã¯ã³ãŒãã®å®è¡ã«ã€ãªãããŸãããããã£ãŠãã³ãŒããããã¯ã¯ãæ»ãå€ãå®è¡ããããã«å¿
èŠã§ããããšã決å®ããelement
ã«ã¯ãããã°ã©ã ãšããã§ãããåœä»€å«ãŸblockReturnå
é ã«å¶åŸ¡ãç§»ããè¶
ããŠã¯Collection>>at:ifAbsent:
ã¡ãã»ãŒãžã®çµæãšããŠç®çã®å€ãè¿ãããããã¯ã®æ¬äœã«ç«ã£ãŠãããã¹ãŠã®æŒç®å^
ãblockReturnã¹ããŒãã¡ã³ãã«å€æãããããã§ã¯ãªãããšã«æ³šæããŠãã ãããã³ã³ãã€ã©ã¯å¯èœãªéããã³ãŒããããåçŽãªåœä»€ã«åè§£ããããšããŸããå®è¡ã¡ãœããã®æ¬äœã«ãããã¯ãåã蟌ã¿ããããã¯ã®åŒã³åºããåçŽãªåœä»€é·ç§»ã«çœ®ãæããŸãããã®å ŽåãblockReturnãstackReturnãŸãã¯selfReturnã«çœ®ãæããããŸããç¹å¥ãªæç€º
äžèšã®æç€ºã«å ããŠãããã€ãã®è£å©çãªæç€ºããããŸãããããã«ã¯ãpopTopããã³dupåœä»€ãå«ãŸããŸãã1ã€ç®ã¯ãããã·ã¥åœä»€ã®1ã€ã䜿çšããŠïŒãŸãã¯ã¡ãã»ãŒãžéä¿¡ã®çµæãšããŠä»®æ³ãã·ã³èªäœã«ãã£ãŠïŒã¹ã¿ãã¯ã®å
é ããå€ãåé€ããã ãã§ããéåžžãpopTopã¯assignInstanceãŸãã¯assignTemporaryåœä»€ã®åŸã«äœ¿çšãããã¹ã¿ãã¯ããäžèŠã«ãªã£ãå€ãåé€ããŸããdupåœä»€ã¯ãååããæšæž¬ã§ããããã«ãã¹ã¿ãã¯äžã®å€ãè€è£œãããŸã£ããåããã®ã次ã«é
眮ããŸããSmalltalkã³ã³ãã€ã©ã¯ããã®åœä»€ã䜿çšããŠãæ¡ä»¶ä»ãã®è€éãªåŒãè§£æããŸããã¡ãœããå®è¡
äžèšã®ããã«ãå®è¡ã¯ã³ã³ããã¹ããªããžã§ã¯ãã®äœæããå§ãŸããŸãããã®åŸãä»®æ³ãã·ã³ã¯æåã®åœä»€ã®ãã€ãã³ãŒããæœåºããŠãã³ãŒãããŸãããã®åŸããã·ã³ã¯ãã¡ãã»ãŒãžã®éä¿¡ãŸãã¯ãžã£ã³ãåœä»€ã®ããããã«ééãããŸã§ãåœä»€ã1ã€ãã€å®è¡ãå§ããŸããã¡ãœããã®å®è¡ã¯ãreturnã¹ããŒãã¡ã³ãã®1ã€ãèŠã€ãããšããã«çµäºããŸããååã®èšäºã§ãã§ã«ããªãã¿ã®ã³ã¬ã¯ã·ã§ã³ã®ãœãŒãæ¹æ³ã«åºã¥ããŠãã¡ãœããã®å®è¡ãšJITã³ã³ãã€ã©ã®åäœã远跡ããŸãã ->Collection viewMethod: #sort: sort: criteria | left right mediane | (self size < 32) ifTrue: [ ^ self insertSort: criteria ]. mediane <- self popFirst. left <- List new. right <- List new. self do: [ :x | (criteria value: x value: mediane) ifTrue: [ left add: x ] ifFalse: [ right add: x ] ]. left <- left sort: criteria. right <- right sort: criteria. right add: mediane. ^ left appendList: right
ãã®ãããªæ¹æ³ãã³ã³ãã€ã«ããçµæã¯ãæç€ºæžå
šäœã§ããäœæ¥ã®ããžãã¯ã®è©³çްãªèª¬æã¯ãã®èšäºã®ç¯å²ãè¶
ããŠããããããã€ãã³ãŒããèŠãŠãã©ã®éšåãäœã«å¯Ÿå¿ããããçè§£ããŠã¿ãŠãã ãããããã¯å®éã«ã¯ããã»ã©é£ãããããŸãããåŸæ¥ã®ã¢ã»ã³ãã©ãšã¯ç°ãªããããã§ã¯åœä»€ã¯éåžžã«åäžãã€äžè²«ããŠäœ¿çšãããŸããæåã«ãå€ã¹ã¿ãã¯ã«å°æ¥ã®åŒã³åºãã®ããã®åŒæ°ãå
¥åãããŸããæ¬¡ã«ãmarkArgumentsã䜿çšããŠãç¹å®ã®ã¡ãã»ãŒãžéä¿¡æäœã§ãã§ã«äœ¿çšãããŠããåŒæ°ã®é
åãããããã圢æãããŸããããŠãç§»è¡ã®æç€ºã¯ãã®ãã¹ãŠã®æããå¶åŸ¡ããŸããèªã¿ãããããããã«ã1ã€ã®åæã«é¢é£ããåœä»€ãããã¯ã空çœè¡ã§åé€ããã³ã¡ã³ããæäŸããŸããã ->Collection methods at: #sort:; disassemble 0000 PushArgument 0 0001 MarkArguments 1 0002 SendMessage size 0003 PushLiteral 1 0004 SendBinary < 0005 DoSpecial branchIfFalse 16 0008 PushArgument 0 0009 PushArgument 1 0010 MarkArguments 2 0011 SendMessage insertSort: 0012 DoSpecial stackReturn 0013 DoSpecial branch 17 0016 PushConstant nil 0017 DoSpecial popTop 0018 PushArgument 0 0019 MarkArguments 1 0020 SendMessage popFirst 0021 AssignTemporary 2 0022 DoSpecial popTop 0023 PushLiteral 4 0024 MarkArguments 1 0025 SendMessage new 0026 AssignTemporary 0 0027 DoSpecial popTop 0028 PushLiteral 6 0029 MarkArguments 1 0030 SendMessage new 0031 AssignTemporary 1 0032 DoSpecial popTop 0033 PushArgument 0 0034 PushBlock 0037 PushArgument 1 0038 PushTemporary 3 0039 PushTemporary 2 0040 MarkArguments 3 0041 SendMessage value:value: 0042 DoSpecial branchIfFalse 52 0045 PushTemporary 0 0046 PushTemporary 3 0047 MarkArguments 2 0048 SendMessage add: 0049 DoSpecial branch 56 0052 PushTemporary 1 0053 PushTemporary 3 0054 MarkArguments 2 0055 SendMessage add: 0056 DoSpecial stackReturn 0057 MarkArguments 2 0058 SendMessage do: 0059 DoSpecial popTop 0060 PushTemporary 0 0061 PushArgument 1 0062 MarkArguments 2 0063 SendMessage sort: 0064 AssignTemporary 0 0065 DoSpecial popTop 0066 PushTemporary 1 0067 PushArgument 1 0068 MarkArguments 2 0069 SendMessage sort: 0070 AssignTemporary 1 0071 DoSpecial popTop 0072 PushTemporary 1 0073 PushTemporary 2 0074 MarkArguments 2 0075 SendMessage add: 0076 DoSpecial popTop 0077 PushTemporary 0 0078 PushTemporary 1 0079 MarkArguments 2 0080 SendMessage appendList: 0081 DoSpecial stackReturn 0082 DoSpecial popTop 0083 DoSpecial selfReturn
ãããã«
...äžè¬ã«ããã®èšäºã§Smalltalkä»®æ³ãã·ã³ã®å
éšããã€ã¹ã«ã€ããŠèª¬æãããã£ãã®ã¯ããã ãã§ããç©èªã®åœ¢åŒã«ã¯ç°¡æœããæ±ããããŸãããçè§£ãæãªãããã«ãããè¡ãã¹ãã§ã¯ãããŸãããç§ã¯ãªããšã劥åç¹ãèŠã€ããããšãã§ãããšæããŸããSmalltalkã€ã¡ãŒãžã§ãªããžã§ã¯ããã©ã®ããã«èŠããããæ°åãã©ã®ããã«è¡šçŸãããããã¡ãã»ãŒãžãéä¿¡ããŠé©åãªã¯ã©ã¹ãæ€çŽ¢ããã¢ã«ãŽãªãºã ãçè§£ããã³ã³ããã¹ããªããžã§ã¯ããšã¯äœããåŠã³ãŸãããæåŸã«ãä»®æ³ãã·ã³ã®åºæ¬çãªåœä»€ã«ç²Ÿéããæ¢ç¥ã®ãœãŒãæ¹æ³ã®ã³ãŒããšãã³ã³ãã€ã©ã«ãã£ãŠå€æãããåœä»€ã調ã¹ãŸãããã§ã¯æ¬¡ã®èšäºãSmalltalkã¡ãœãããLLVMãçè§£ã§ããäžéIRã³ãŒãã«ã³ã³ãã€ã«ããéã®JITã®åé¡ã«ã€ããŠèª¬æããŸããæ¬¡ã«ãå®éã®ããã»ããµåœä»€ã«ã³ã³ãã€ã«ãããŸããã¡ãœããã®ãã€ãã³ãŒããåæããããããæé©ãªæ¹æ³ã§IRã«å€æããããã«å¿
èŠãªããšãçè§£ããããšããŸããæåŸã«ãå°ããªèª¿æ»ïŒ