åã®èšäºã§ ã
humbugãš
ç§ã¯ãã¡ãœããã®å®è¡æ¹æ³ãšãã®å
容ã«ãã£ãŠèšç®é床ãã©ã®ããã«å€åããã
ã瀺ããŸããã ããã§ãä»®æ³ãã·ã³ã®å
éšãèŠãŠããããã©ã®ããã«ããªãèµ·ããã®ããçè§£ã§ããŸãã
å
ã»ã©ã
Smalltalkèšèª ããŸãã¯
Little Smalltalkã®ãã€ã¯ãå®è£
ã«ç²ŸéããŸããã èšèªã®æ§æãã¡ã¢ãªå
ã®ãªããžã§ã¯ãã衚çŸããããã®åœ¢åŒãããã³åºæ¬çãªåœä»€ã®ã»ãããçè§£ããŸããã ããã§ãSmalltalkãš
LLVMã®çžäºäœçšã®åé¡ã«è¿ã¥ããŸãïŒãã®ãããäžé£ã®èšäºå
šäœãèæ¡ãããŸããïŒã
ããã§
ãJITã³ã³ãã€ã©ã§äœãè¡ãããããæ£ç¢ºã«çè§£ããããã«å¿
èŠãªç¥èããŒã¹ããã¹ãŠæããŸããã ãã®èšäºã§ã¯ãSmalltalkãã€ãã³ãŒããLLVM IRã³ãŒãã«å€æãããæ¹æ³ãã³ãŒããã³ã³ãã€ã«ããã³å®è¡ãããæ¹æ³ãããã³ããã°ã©ã ã«ããè§£éãããé«éã«åäœããçç±ãåŠç¿ããŸãã æããã£ãã¡ãªäººã¯ãæ°åãšå¿ã³å¯ãã©ã€ã³ã®ããã·ã§ã«ãã£ã¹ãïŒ
1åãš
2å ïŒãèŠãããšãã§ããŸãïŒã¹ã¯ããŒã«ã®å¯èœæ§ãå¿ããªãã§ãã ããïŒã
ã¯ããã«
TRIZãšåžžèã®ãããµããèå¯ã®äž¡æ¹ã¯ãç§ãã¡ã«æ¬¡ã®ããšãæããŠãããŸãïŒ
- æéã®æ¹æ³ã¯ããããå¿
èŠãªãããšã蚌æããããšã§äœããããããšã§ãã
- ããã«äœãããã代ããã«ãç±ãå°ç¡ãã«ããããšã¯ã§ããŸããããäºåã«ãããããããšããŸãã
- åãä»äºã2åè¡ãå¿
èŠã¯ãããŸããïŒç¹ã«ãŸã£ããã§ããªãå ŽåïŒã
ãããã®ååã¯äººéé¢ä¿ãã¯ããã«è¶
ããŠãããå¹
åºãåéã§å¿çšãããŠããŸãã ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãå«ãã å€ãã¯ã
ãã£ãã·ã¥ã䜿çšããå©ç¹ãçè§£ããŠããŸãã
æ zyãªã³ã³ãã¥ãŒãã£ã³ã°ã®ããšãèãã人ãããŸãã ããããç¡æå³ã§ãããŒãå®åäž»çŸ©ã®æä»£ã«çŽé¢ããåäŸã§ã誰ããåºäŒããŸããã
ãŸããJITã³ã³ãã€ã©ãŒã«ã¯ãäžèšã®èæ
®äºé
ãšå€ãã®å
±éç¹ããããŸãã ç§ãã¡ã®ãããžã§ã¯ããäŸå€ã§ã¯ãããŸããã åŸæ¥ã®æ¹æ³ã§ã³ãŒããå®è¡ãããæ¹æ³ãšãããã©ãŒãã³ã¹ãæ¹åããããã«ã³ãŒãã§äœãã§ãããã確èªããŸãã
ä»®æ³ãã·ã³ãšå®éã®ããã»ããµãŒã®éã
Smalltalkä»®æ³ãã·ã³ã¯ã¹ã¿ãã¯æåã§ãã
- æäœãå®è¡ãããšããªãã©ã³ããã¹ã¿ãã¯ã«ããã·ã¥ãããŸãã
- å®è¡ãããæäœã«ãããå¿
èŠãªæ°ã®ãªãã©ã³ããã¹ã¿ãã¯ããåé€ãããŸãã
- çµæã¯ã¹ã¿ãã¯ã®æäžéšã«ããã·ã¥ããã¯ãããæ¬¡ã®æäœã®ãªãã©ã³ããšããŠäœ¿çšã§ããŸãã
ãã®ã¢ãããŒãã®å©ç¹ã¯ãä»®æ³ãã·ã³ã®ã³ãŒããã·ã³ãã«ã§ãããäžé£ã®èšç®ãç°¡åã«å®è£
ã§ããããšã§ãã ãã¡ããæ¬ ç¹ããããŸããããã®äž»ãªç¹ã¯ãå€ãæäœããããã¹ã¿ãã¯ã«å€ãé
眮ããããã¹ã¿ãã¯ããå€ãåé€ãããããŠããã·ã³ãå€ã«å¯ŸããŠäœããã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããããã«ããããšã§ãã èªåã§å€æããïŒ
åã®èšäº ïŒ
Collection>>sort:
説æããäŸã§ã¯ãå€ãã¹ã¿ãã¯ã«ç¹°ãè¿ãããã·ã¥ããŠããã«å€ãæœåºããArrayã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ã³ããŒããŠããããªããžã§ã¯ããã¹ã¿ãã¯ã«åã³
é
眮ããŸãïŒ
markArgumentsã¯
ãããè¡ããŸãïŒ ïŒ
ãã¡ãããããã¯ãã¹ãŠçç±ããããŸãã ãã·ã³ã®ç©ã¿éããããæ§æã«ãããè€éãªæäœãå°å
¥ããããšãªããã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ãéåžžã«ç°¡åã«èšé²ã§ããŸãã ããšãã°ãæ¬åŒ§ã䜿çšããŠç®è¡åŒãèšç®ããå Žåãã¹ã¿ãã¯ã¯äžéå€ã®äžæçãªã¹ãã¬ãŒãžãšããŠäœ¿çšãããŸãã 倪å€ãããå·¥åŠèšç®æ©ã¯ãããã®ååã«åŸã£ãŠã
éããŒã©ã³ãèšæ³ã䜿çšããŠèšèšãããŠããŸããã
ãã ããææ°ã®ããã»ããµã¢ãŒããã¯ãã£ã®èгç¹ããèŠããšãSmalltalkã¯éåžžã«äžäŸ¿ã§ãã ã»ãšãã©ã®æäœã¯ã¡ã¢ãªã䜿çšããŠå®è¡ãããŸãã 屿æ§ã®ååã¯ç¶æãããŸããïŒãªããžã§ã¯ãã¯ãã¹ãŠäºãã«é ãé¢ããããŒãã«æ£åšããŠããŸãïŒã æ°ãããªããžã§ã¯ããçµ¶ããçæãããŠãããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãè¡ãããæ¬¡ã®å€§éã®ã¡ã¢ãªãã·ã£ããã«ãããŸãã ãã¹ãŠã®ã¡ã¢ãªæäœã¯éæ¥çã«åŠçãããŸãã æåŸã«ã倿°ã®å°ããªã¡ãœããã«ãããã¬ãžã¹ã¿ãé©åã«å²ãåœãŠãããšãã§ããªããªããŸãã
倧è¡ã®ææ°ã®ããã»ããµã¯ç»é²ãããŠããŸãã ã¬ãžã¹ã¿ã¯RAMãããã¯ããã«é«éã«åäœãããããã¬ãžã¹ã¿ãçŽæ¥æäœããããšã§ããé«ãããã©ãŒãã³ã¹ãæåŸ
ã§ããŸãã 倧éã®ããŒã¿ãã£ãã·ã¥ãååšãããšãã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ã®ã³ã¹ãã倧å¹
ã«åæžã§ããŸãïŒããŒã«ãªãã£ã®åçã«åŸããŸãïŒãã以äžã«ç€ºãããã«ãã¡ã¢ãªæäœèªäœãã¬ãžã¹ã¿ã«ç§»åããã®ã§ã¯ãªããã¡ã¢ãªæäœèªäœã®æ°ãæ ¹æ¬çã«åæžããããšã«ãããäž»ã«æåãéæããŸãã
ãããã£ãŠãããã»ããµã§Smalltalkã³ãŒããå¹ççã«å®è¡ããã«ã¯ãã¹ã¿ãã¯ããžãã¯ãã¬ãžã¹ã¿ã«å€æããæ¹æ³ãèŠã€ããå¿
èŠããããŸãã
ã³ã³ãã€ã©ãŒJITå€ã¹ã¿ãã¯
LLVMã®
äžéã³ãŒã
衚çŸã¯
SSA衚èšã䜿çšããŸãã ãã®è¡šèšã§ã¯ãæ
£ããŠãã圢åŒã®å€æ°ã¯ãããŸããã ãã¹ãŠã®èšç®ã¯ã°ã©ãã§ãã åèšç®çµæïŒããŒãïŒã«ååãå²ãåœãŠãŠããã®ååã以éã®èšç®ã§äœ¿çšã§ããŸãïŒ2ã€ã®ããŒãããªã³ã¯ããŸãïŒã ããã«ãæå®ãããååããã®å€ã倿Žã§ããªãå ŽåïŒåãååãžã®å€ã®åå²ãåœãŠã¯èš±å¯ãããŸããïŒã ååã¯ããããçºè¡šãããããã°ã©ã ïŒããã³ããŒã¿ïŒå
ã®ãã®ãã€ã³ãã®ã¿ãåç
§ããŸãã ãŸã ã¡ã¢ãªãæäœããå¿
èŠãããå Žæã§ã¯
ãallocaåœä»€ã䜿çšãããŸããããã¯ãèŠæ±ããããµã€ãºã®ã¡ã¢ãªé åãšãèªã¿èŸŒã¿ããã³æžã蟌ã¿ã®
ããŒãããã³
ã¹ãã¢åœä»€ãããããå²ãåœãŠãŸãã
åè¿°ã®ãœãŒãæ¹æ³ãã
left
倿°ãåæåããã®ã«å¿
èŠãªSmalltalkãã€ãã³ãŒãã«åã³æ³šç®ããŸãããã
0023 PushLiteral 4 0024 MarkArguments 1 0025 SendMessage new 0026 AssignTemporary 0 0027 DoSpecial popTop
å¥ã®äŸãåãã¡ãœããããã®ãããã¯ã®éå§ïŒ
0037 PushArgument 1 0038 PushTemporary 3 0039 PushTemporary 2 0040 MarkArguments 3 0041 SendMessage value:value: 0042 DoSpecial branchIfFalse 52
ãŸããã©ã¡ãã®å Žåãã倿°ã®åçŽãªã¡ã¢ãªæäœãå®è¡ãããããšã¯æããã§ãã åºæ¬çãª
ããã·ã¥åœä»€ã¯ãã¢ã»ã³ãã©ãŒåœä»€ã®ãã¢ã«å€æã§ããŸãã ã¹ã¿ãã¯ã®æäžéšã®ã€ã³ããã¯ã¹ãã·ããããããšã«ãã倿°ã®ã€ã³ããã¯ã¹ãå¥ã®é åã«ã·ããããããšã«ãããããã¡ã¢ãªé åãããã€ã³ã¿ãã³ããŒããã ãã§ãïŒãããŠãªããžã§ã¯ãæ§é ãžã®ãã€ã³ã¿ã®ã¿ã䜿çšããŸãïŒã
IRã³ãŒãã§ã®äžèšã®ã¢ã€ãã¢ã®ãæ£é¢ãå®è£
ã¯ã次ã®ããã«ãªããŸãã
define void @pushValueToStack(%TContext* %context, i32 %index, %TObject* %value) { %stackPointer = getelementptr inbounds %TContext* %context, i32 0, i32 4 %stack = load %TObjectArray** %stackPointer %stackObject = bitcast %TObjectArray* %stack to %TObject* call %TObject** @setObjectField(%TObject* %stackObject, i32 %index, %TObject* %value) ret void } define %TObject** @setObjectField(%TObject* %object, i32 %index, %TObject* %value) { %fieldPointer = call %TObject** @getObjectFieldPtr(%TObject* %object, i32 %index) store %TObject* %value, %TObject** %fieldPointer ret %TObject** %fieldPointer } define %TObject** @getObjectFieldPtr(%TObject* %object, i32 %index) { %fields = getelementptr inbounds %TObject* %object, i32 0, i32 2 %fieldPointer = getelementptr inbounds [0 x %TObject*]* %fields, i32 0, i32 %index ret %TObject** %fieldPointer }
ã¯ããåäœãããã€ãã£ãã³ãŒãã«å€æããããšãã€ã³ã¿ãŒããªã¿ãŒã®åæ§ã®å®è£
ãããé«éã«ãªããŸãã ãã ãããã®ãããªJIT VMã®å
šäœçãªããã©ãŒãã³ã¹ã¯é©ãã»ã©äœããªããŸãã åé¡ã¯ãã¡ã¢ãªæäœèªäœããªããªã£ãŠããªãããšã§ãã åçŽã«äœã¬ãã«ã®ã³ãŒãã«ç§»æ€ãããœãããŠã§ã¢VMã®ãã©ãããŒããåãé€ããŸããã
ä»®æ³ãã·ã³ãå®éã«é«éåããã«ã¯ãæäŸãããŠããLLVMæ©èœãã€ãŸãSSAãè±å¯ãªæé©åãã¹ãšãšãã«äœ¿çšããå¿
èŠããããŸãã
pushããã³
markArgumentåœä»€ã®ç®çãæãåºããšãããã®ã¹ã¿ãã¯ã¯ç¹å®ã®å€ïŒåŒæ°ããªãã©ã«ã宿°ããŸãã¯äžæå€æ°ïŒãã察å¿ãã
ããã·ã¥åœä»€ã®äœçœ®ã«ãã£ãŠæ±ºå®ãããåŒæ°ã®é
åå
ã®å¯Ÿå¿ããã»ã«ã«é¢é£ä»ããããã«ã®ã¿äœ¿çšãããããšãæããã«ãªããŸãã
SSA衚èšã«ãããã¹ã¿ãã¯ããã€ãã¹ããŠãããçŽæ¥è¡ãããšãã§ããŸãã å¿
èŠãªã®ã¯ãåŒæ°ã®é
åã«å
¥ããããã«æºåãããªããžã§ã¯ãããèšæ¶ãããããã«å°æ¥ã®äœ¿çšå Žæã«ã³ããŒããããšã§ãã
LIFOã®ååã«åŸã£ãŠãä¿åãããŠããå€ã«ãé çªã«ã¢ã¯ã»ã¹ãããããã¹ã¿ãã¯ã䜿çšããŠãªã³ã¯ãä¿åããã®ã劥åœã§ãã ãã®
å€ã¹ã¿ãã¯ã¯ååšããã³ã³ãã€ã«æã«ã®ã¿äœ¿çšãããŸãã ãã§ã«çæããããæ£ãããã³ãŒããå®è¡ãããŸãã
ãã®ååã¯éåžžã«ããŸãæ©èœãããããJITããŒãžã§ã³ã®ã¡ãœããã¯éåžžã®ã³ã³ããã¹ãã¹ã¿ãã¯ã
ãŸã£ãã䜿çšããŸããã JITã³ãŒãã§ã³ã³ããã¹ããäœæãããšãã«ãåæåããããããã¯éä¿¡
ããã¡ãã»ãŒãž
ããšã« 1ã€ã®å²ãåœãŠãå·®ãåŒãããã®ã§ãã
ãããã£ãŠãæé©åãããã¡ãã»ãŒãžéä¿¡ã®ããã«æ¬¡ã®ã¢ã«ãŽãªãºã ãååŸããŸãã
- ãªããžã§ã¯ããã³ã³ããã¹ãã¹ã¿ãã¯ã«ããã·ã¥ãã ïŒ push ïŒä»£ããã«ãã¡ã¢ãªãã倿°ã«å€ãããŒããïŒ load ïŒãã³ã³ãã€ã©ãŒã®å€ã¹ã¿ãã¯ã«çœ®ããŸãã
- markArgumentsã¹ããŒãã¡ã³ããåŠçããåŒæ°ã®ãªããžã§ã¯ããäœæããŠãããå€ã¹ã¿ãã¯ããèŠçŽ ãé æ¬¡åé€ããäœæãããåŒæ°ã®é
åã®ã¹ãããã®è¡ã«ããããæ ŒçŽããŸãã
- sendMessageãã³ãã©ãŒã¹ã¿ããåŒã³åºããŸã ã
4ã€ã®ã¡ã¢ãªæäœïŒå€ã®
èªã¿èŸŒã¿ ãã¹ã¿ãã¯
ãžã®å€ã®
æ ŒçŽ ãã¹ã¿ãã¯ããã®å€ã®
èªã¿èŸŒã¿ ãåŒæ°é
åã®ãã£ãŒã«ããžã®æ ŒçŽïŒã®ä»£ããã«ã2ã€ïŒå€ã®
èªã¿èŸŒã¿ãšé
åãžã®æ ŒçŽïŒã ããæ®ããããšãããããŸãã
LLVMã«ç²ŸéããŠãã人ã¯ããªããã£ãã€ã¶ãã¹ã«ãã£ãŠå€éšã®æ¯æŽãªãã§ãã®ãããªç©ºã®ã¡ã¢ãªæäœã广çã«åé€ãããããšã«å察ãããããããŸããã å®éãæãåçŽãªå Žåãããã¯ããã§ãã ããããçæããå¿
èŠãããå®éã®ã³ãŒãã¯ãã¯ããã«è€éã«èŠããŸãã ããã¯äž»ã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã®æ£ããåäœãä¿èšŒããããã«ç¹å¥ãªããŒã«ãŒãšå€ãžã®åç
§ã远å ããå¿
èŠãããããã§ãã
ã¡ãœãããšæ©èœ
åäœãããšãä»®æ³ãã·ã³ã¯ã€ã¡ãŒãžããåã¡ãœããã®JITããŒãžã§ã³ãäœæããŸãã ã¡ãœãããšæ©èœçã«åçã§ããããã€ãã£ãããã»ããµã®åœä»€ã§æ¢ã«å®è£
ãããŠããŸãã JIT颿°ã¯ããŸã éä¿¡ãããŠããªãã¡ãã»ãŒãžãæåã«éä¿¡ãããšãã«äœæãããŸãã ããšãã°ãã¡ãã»ãŒãž
List>>sort:
firstãéä¿¡ãããšãã¡ãã»ãŒãžãã³ãã©ãèŠã€ãããŸããããã¯
Collection>>sort:
ã¡ãœããã§ãïŒ
List
ã¯ã©ã¹ã«ã¯
sort:
ã¡ãœããã¯ãããŸãããã
Collection
ããç¶æ¿ãããããïŒã ãã®åŸãä»®æ³ãã·ã³ã¯åãååã®JIT颿°ãèŠã€ããããšããŸãããèŠã€ããããŸããã JITã³ã³ãã€ã©ãåŒã³åºããã
Collection>>sort:
ã¡ãœããã®æ¬äœãéããŠãåçã®é¢æ°ãäœæãããŸãã æ¬¡ã«ããã®é¢æ°ã¯ãéåžžã®ã¡ãã»ãŒãžçšãšåããã©ã¡ãŒã¿ãŒã§åŒã³åºãããŸãã æ¬¡åéä¿¡ãããšãã³ã³ãã€ã©ã¯åŒã³åºããããã¡ãœããã®æ¢åã®ããŒãžã§ã³ã䜿çšãããŸãã
ã¡ãã»ãŒãžãéä¿¡ãã
ååã®èšäºã§æãåºããããã«ãä»®æ³ãã·ã³ã«ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- ã¹ã¿ãã¯ããå€ãåé€ããåŒæ°ã®é
åãäœæããŸãïŒ markArgumentsã®åå¥ã®ã¹ããããšããŠå®è¡ãããŸã ïŒã
- ã¡ãã»ãŒãžãåŠçããéå±€å
ã®ã¡ãœãããèŠã€ããŸãã
- ã³ã³ããã¹ããªããžã§ã¯ããäœæãããã£ãŒã«ãã«å
¥åããŸãã
- æ°ããã³ã³ããã¹ãã®å®è¡ã«åãæ¿ããŸãã
ãã®æ®µéã§ã¯ãä»®æ³ãã·ã³ã«ã¯ãªããžã§ã¯ãã®ã¿ã€ãã«é¢ããæ
å ±ããªããããå®å
ã¡ãœããã®æ€çŽ¢æé ã«åœ±é¿ãäžããããšã¯ã§ããŸããã å
·äœçã«ã¯ããã®æ
å ±ã¯åŒã³åºãæã«ã®ã¿å©çšå¯èœã§ããããªããžã§ã¯ãã®å°æ¥ã®ã¿ã€ããäºæž¬ããããã«äœ¿çšããããšã¯ã§ããŸããã ãããã£ãŠãã¡ãã»ãŒãžæ€çŽ¢ãšã³ãžã³ã¯åããŸãŸã§ãã¢ãžã¥ãŒã«ã«ç»é²ãããŠãã
sendMessage()
ã·ã¹ãã 颿°ã䜿çšããŠåŒã³åºãããŸãã ãã®æ©èœã䜿çšãããšãJITã³ãŒããããœãããŠã§ã¢VMã«ã¢ã¯ã»ã¹ããã¡ãã»ãŒãžå®å
ãèŠã€ããããã«äŸé Œã§ããŸãã æ¬¡ã«ãå¶åŸ¡ã¯èŠã€ãã£ãã¡ãœããã®JITããŒãžã§ã³ã«è»¢éãããŸãã
ãœãããŠã§ã¢VMã¯ãä»ã®ã¡ã¢ãªããªããããããŒãäžã«ã®ã¿ãã¹ãŠã®ãªããžã§ã¯ããäœæããŸãã JIT VMã®å Žåãããã€ãã®ãªããžã§ã¯ããã¹ã¿ãã¯ã«é
眮ããããšã«ãããã¡ã¢ãªã®ãªãŒããŒãããã倧å¹
ã«åæžã§ããŸãã ãã®ãããªãªããžã§ã¯ãã¯æ¬¡ã®ãšããã§ãã
- åŒæ°ã®é
å
- ã³ã³ããã¹ããªããžã§ã¯ãã
- äžæå€æ°ã®é
åã
ãããã®ãªããžã§ã¯ãã®åç¶æéã¯ã¡ãœããèªäœã®å®è¡æéãããçããªãããïŒåžžã«ã¢ã¯ãã£ããªã³ã³ããã¹ããããªã³ã¯ãããŠããããïŒãã¹ã¿ãã¯ã«é
眮ã§ããŸãã ã¡ãœãããçµäºãããšãã¹ã¿ãã¯ã¯åã®ãã¬ãŒã ã«æããããŸãã䜿çšäžã®ã¡ã¢ãªãèªåçã«è§£æŸãããŸãã å³å¯ã«èšãã°ãã¹ã¿ãã¯ãšããŒãã®ã¡ã¢ãªå²ãåœãŠã®é床ã¯ã»ãŒåãã§ãã ãããšããã®äž¡æ¹ã§ãå²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã«ãã€ã³ã¿ãç§»åããçµæã®å€ãè¿ãã ãã§ãã ãããã倧éã®å Žåãããã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å¿
èŠæ§ã«ã€ãªããããã§ã«ããªãã®æéãããããŸãã ãããé »ç¹ã«çºçããã»ã©ãã¹ã¿ãã¯ãªãã·ã§ã³ã¯ããå¹ççã«æ©èœããŸãã
çµ±èš
JITã³ã³ãã€ã©ã®çæ³çãªæçµçµæã¯ã次ã®ããã«è¡šãããšãã§ããŸãã
- é¢é£ãããã¹ãŠã®Smalltalkã¡ãœããã颿°ã«å€æ
- éä¿¡ãããåã¡ãã»ãŒãžã¯ãçŽæ¥ã®é¢æ°åŒã³åºãã«å€æãããŸãïŒæ€çŽ¢ã¹ã¿ãã§ã¯ãããŸããïŒ
- çŽæ¥åŒã³åºããããããããããã¯ãšå°ããªé¢æ°ã®ã³ãŒãã¯ãéä¿¡ããã€ãã¹ããŠäœ¿çšããå Žæã«çµã¿èŸŒãŸããŠããŸã
RBIãéæããæ¹æ³ã®äž»ãªåé¡ã¯ãåŒã³åºãããšã®ãªããžã§ã¯ãã®ã¿ã€ãã®äžç¢ºå®æ§ã§ãã æ¢ã«ç¥ã£ãŠããCollection >> 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
䜿çšããã倿°ã®ã¿ã€ãã¯ã©ãã§ããïŒ å®è¡ã³ã³ããã¹ããšåŒã³åºãã³ãŒãããªããã°ãæç¢ºãªããšã¯èšããŸããã ããã¯ãSmalltalkã®é·æãšçæã®äž¡æ¹ã§ãã ãã®ã³ãŒãã¯ãäžäœã¯ã©ã¹ã«é¢ä¿ãªãåçã«å¹ççã«æ©èœããããã匷åã§ãã ãªã¹ããšé
åã®äž¡æ¹ãçãããœãŒãããŸãã ã³ã³ãã€ã«æ®µéã§æé©åãè¡ãããšãã§ããããªããžã§ã¯ãåã®ç¥èã«äŸåããŠããããã匱ãã
æé©ã«è¿ãçµæãåŸãããšãã§ããããªãããŒãªãã©ã³ããããŸãã ãããŠã圌ã®ååã¯ã³ãŒã«çµ±èšã§ãã ããã°ã©ã ãå®è¡ããããšãsendMessageãã³ãã©ãŒãåŒã³åºãããŸãããã®ãã³ãã©ãŒã¯ãã¡ã€ã³ã®äœæ¥ã«å ããŠãã¡ãã»ãŒãžã®éä¿¡ã«é¢äžããã¯ã©ã¹ã®çµ±èšãè£å
ããŸãã
ããã°ã©ã ã®éçšã§ã¯ã©ã¹éå±€ãå€åããªããšä»®å®ããŠãæ¡ä»¶ã®ä»£ããã«çŽæ¥åŒã³åºããæ¿å
¥ã§ããŸãã æ®å¿µãªããšã«ãããã§ã®å³ããçŸå®ã«ã¯é©ãããããŸãã ããšãã°ãçµ±èšãåéãããšã次ã®çµæãåŸãããŸããã10åã®é£ç¶ããåŒã³åºãããã倿°ãã¯ã©ã¹
String
ããšã10å倿ããŸããã ããããããã¯æ¬¡åã«ãããªããšããæå³ã§ã¯ãããŸããã ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãæ©ããšãããŸããŸãªã¯ã©ã¹ã«åºäŒããŸãã æåŸã«ã
String
ã€ã³ã¹ã¿ã³ã¹ãè¿ãããã«äœ¿çšãããã¡ãœããã§ãããåã«
æã
圢æãããããã«ãã©ã¡ãŒã¿ãèšå®
ããããããçªç¶
nilãè¿ãããšããããŸããã
ãããã£ãŠãåŒã³åºãã®çµ±èšæ
å ±ãæã£ãŠããå Žåã§ãã倿°ã®åãæ¢ç¥ã®ããããã§ããããšã倿ããå Žåããã®æ®µéã§ã§ããããšã¯çŽæ¥åŒã³åºããæ¿å
¥ããããšã§ãã å®éã«ã¯ãããã¯ããããã£ãŒããªããžã§ã¯ãã®ã¯ã©ã¹ããã§ãã¯ãã察å¿ãã颿°ã«å¶åŸ¡ãç§»ãã¹ã€ãããããã¯ãæ¿å
¥ãããšããäºå®ã«ã€ãªãããŸãã
åæšè«
å°æ¥çã«ã¯
ãHindley-Milnerã¢ã«ãŽãªãºã ãšè¿œå ã®ãã¥ãŒãªã¹ãã£ãã¯ã䜿çšããŠãå®å
šãªåæšè«ãè¡ãäºå®ã§ãã æ¬¡ã«ã倿°ã®åãå®å
šã«æšæž¬ãããå Žæã§ããã§ãã¯ãªãã§çŽæ¥åŒã³åºããè¡ãããšãã§ããŸãã ããã¯ãåŒã³åºããã³ãŒãã«åŒã³åºãããã¡ãœãããå®å
šã«ã€ã³ã©ã€ã³åããããã©ãŒãã³ã¹ãšæ©èœã«éåžžã«ãã圱é¿ããŸãã
ããšãã°ãäžèšã®
Collection>>sort:
ã¡ãœãããèŠããšãæ³šææ·±ãèªè
ã¯ã倿°
left
ãš
right
åžžã«
List
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ãã£ãŠåæåãããããšã«æ°ä»ããããããŸããã ä»®æ³ãã·ã³ã¯ã次ã®èæ
®äºé
ãããããçè§£ã§ããŸãã
left
倿°ã¯ã List new
åŒã®çµæã«åæåãããŸãã- åŒ
List new
ã¯ãã©ã¡ãŒã¿ãŒã䜿çšãããåºå®ã¢ã¯ã·ã§ã³ãªããžã§ã¯ãïŒ List
ïŒãæã¡ãŸãã List
ãªããžã§ã¯ããžã®#new
ã¡ãã»ãŒãžã®éä¿¡ã¯ã List>>new
ã«ãã£ãŠåŠçãããŸãList>>new
ã¡ãœããã¯ãåŒsuper new
çµæãè¿ããŸã- çŸåšã®ã³ã³ããã¹ãã§ã¯ã
List super
ãã€ãŸãCollection
Collection
ãªããžã§ã¯ããžã®#new
ã¡ãã»ãŒãžã®éä¿¡ã¯ã Object>>new
ã«ãã£ãŠåŠçãããŸãObject>>new
ã¡ãœããã«ã¯ãæ¢ç¥ã®ã¯ã©ã¹ïŒå
¬çïŒã®ãªããžã§ã¯ããåžžã«è¿ãããªããã£ã7ãå«ãŸããŸãã
ããã«ãåŒã¯éã®é åºã§æããããŸããã
left
ã®å€æ°ã¯
List
ã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãã£ãŠåæåãããŸãããšããã¹ããŒãã¡ã³ãã«ã€ãªãããŸãã
倿°ã®ã¯ã©ã¹
left
ãš
right
ãç¥ã£ãŠããã°ãã¡ãœããã®æ®ãã®éšåãæé©åã§ããŸãã æäœ
#add:
#sort:
ãããã³
#appendList:
ã¯ã远å ã®æ¡ä»¶ãªãã§çŽæ¥ã¡ãœããåŒã³åºãã䜿çšããŠã³ã³ãã€ã«ãããŸãã
å®éãåã®å®å
šãªæšè«ã¯ç§ãã¡ã«ãšã£ãŠæãŸããã§ãããå¿
é ã§ã¯ãããŸããã 倿°ã®åã¯åŒã³åºãããšã«
å€ãããªãããšãç¥ãã ãã§ååã§ãã ãããŠãæåã«ã¡ãã»ãŒãžãéä¿¡ãããšãã®ç¶æ
ãæ£ç¢ºã«èª¿ã¹ãŸãã å
šäœãšããŠãããã°ã©ã å®è¡äžã®åãã§ãã¯ãæé€ããã³ãŒãéãåæžãããªããã£ãã€ã¶ãŒã®æãé¢ãããšãã§ããŸãã
ç·šé
ãã®æç¹ãŸã§èªãã ããš
ãããã ã
LLVMãäœã§ãããã«ã€ããŠã»ãšãã©ç¥ããªã人ã®ããã«ãHabréã®å€ãã®éåžžã«è¯ãæçš¿ããŸãã¯
LLVMãš
LLVMèšèªãªãã¡ã¬ã³ã¹ããã¥ã¢ã« ãžã®Hackerã®ç޹ä»ãèªãããšããå§ãããŸãã ãã¡ãããè±èªã§ã
ãã®ãããLLVMã¯åœä»€ã®ãã§ãŒã³ã®åœ¢åŒã§èšè¿°ãããIR衚çŸãå
¥åã§åãåããŸãã åœä»€ã¯ã
åºæ¬ãããã¯ãšåŒã°ãããšã³ãã£ãã£ã«ç·šæãã
ãŸã ã ãã®ãããªãŠãããã®ç¹åŸŽã¯ã1ã€ã®å
¥åãš1ã€ã®åºåãããªãããšã§ãã ããã¯ãäœæ¥ã®äŸ¿å®äžãæå³çã«è¡ãããŸãã å¶åŸ¡ã転éããåœä»€ãé€ããåœä»€ã¯ãããã¯å
ã«é
眮ã§ããŸãã ã€ãŸããæ¡ä»¶ä»ããžã£ã³ãããªã¿ãŒã³ãã¹ããŒãããã³ãã£ããåœä»€ããããã¯ã®éäžã«çœ®ãããšã¯ã§ããŸããïŒäŸå€ãã¹ããŒããªãå Žåã颿°åŒã³åºãã¯èš±å¯ãããŸãïŒã ããã§ããããå¿
èŠãªå Žåããã®å Žæã®ãããã¯ã¯2ã€ã«åå²ããããããåé¡ã®åœä»€ïŒLLVMçšèªã§ã¯
ã¿ãŒãããŒã¿ãŒãšåŒã°ã
ãŸã ïŒã¯ååã®æ«å°Ÿã«ãããŸãã ãããã£ãŠãæ©èœå
šäœã¯äžé£ã®åºæ¬ãããã¯ãšãããã®éã®é·ç§»ã§æ§æãããŸãïŒé·ç§»åœä»€èªäœã¯ã¢ãã¬ã¹ã§ã¯ãªããå¶åŸ¡ã転éãããããã¯ã®èå¥åã§åäœããŸãïŒã
ç§ãã¡ã®ã¿ã¹ã¯ã¯ãã¡ãœããã®ãã€ãã³ãŒããèªã¿åãããããIRã³ãŒãã§åäœæããé·ç§»ããžãã¯ãä¿æããæçµçã«æ©èœçã«åçãªãã®ãååŸããããšã§ãã ãã¡ãããããã¯åèªããšã«ãã€ãã³ãŒãããæäœãç¹°ãè¿ãå¿
èŠããããšããæå³ã§ã¯ãããŸããããæ£ç¢ºæ§ã確ä¿ããå¿
èŠããããŸãã
æåã®åé¡ã¯ãã¡ãœããã®ãã€ãã³ãŒãã1ã€ã®é
åã«ãŸãšããŠæžã蟌ãŸããããšã§ãã åœç¶ãåºæ¬çãªãããã¯ã¯ãªãããã¹ãŠã®é·ç§»ã¢ãã¬ã¹ã¯ãé
åã®å
é ããã®ãªãã»ããã·ã¹ãã ã«èšé²ãããŸãã ãããã£ãŠãæåã«å¿
èŠãªããšã¯ãé·ç§»åœä»€ã®ãªãã»ãããšããŒã¹ãããã¯éã®å¯Ÿå¿ãæ§ç¯ããããšã§ãã ããã¯ããã€ãã³ãŒããäºåã«æž¡ãããšã§è¡ãããŸãïŒ
MethodCompiler.cppã®scanForBranchesã¡ãœããïŒ
ã¡ãœããã®å°æ¥ã®ãããã¯ã®ãéããæã«ããæç€ºããè©°ã蟌ããããšããå§ããŸãã ã¹ã¿ããã£ã³ã°èªäœã¯é çªã«è¡ãããŸãã ã¡ãœããã®æåãããSmalltalkåœä»€ã察å¿ããIRã³ãŒãã®æäœã«å€æããŸãã
ããã·ã¥åœä»€ã¯çŽæ¥ãšã³ã³ãŒããããªãããšãæãåºããŠãã ããã代ããã«ãå¿
èŠãªä¿çäžã®ã¢ã¯ã·ã§ã³ã説æãã
TDeferredValueæ§é äœïŒ
TStackValueã
åç
§ ïŒãå€ã¹ã¿ãã¯ã«é
眮ããŸãã æ¬¡ã«ãã³ãŒãã§ã¹ã¿ãã¯ãããã®ãããªå€ãåé€ããæäœã«åºããããšãä¿çäžã®ã¢ã¯ã·ã§ã³ãå®è¡ããæ¢ã«äœ¿çšå¯èœãªå®éã®ååãååŸããŸãã 倧åã®å Žåãã¢ã¯ã·ã§ã³ã¯æ°åœä»€ã ãå»¶æããããããã³ãŒãå
ã®æäœã®å®éã®äœçœ®ã¯å€ãããŸããã å®éãäžéå€ïŒãŸãã¯ã³ã³ããã¹ãã¹ã¿ãã¯ã®äœ¿çšïŒãå¿
èŠãšããã«ãã³ãŒãå
ã®2ã€ã®å Žæã®è«çãã€ã³ãã£ã³ã°ããããŸãã çŸåšã®ã³ãŒãã®å€ã®è»¢éãã©ã®ããã«æ£ç¢ºã«å®è£
ããããã¯ãLLVMã«ãã£ãŠãã§ã«æ±ºå®ãããŠããŸãã
ããšãã°ããã€ãã³ãŒãã§æ¬¡ã®å ŽåïŒ
0023 PushLiteral 4 0024 MarkArguments 1 0025 SendMessage new 0026 AssignTemporary 0 0027 DoSpecial popTop
...ãã®éšåãã³ã³ãã€ã«ãããšããã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
- ãã¹ã¿ãã¯ã«4çªç®ã®ãªãã©ã«ã眮ããé
å»¶æäœãäœæããŸãã
- markArgumentsã¹ããŒãã¡ã³ãã§ã¯ãã¹ã¿ãã¯ããå€ãååŸããå¿
èŠããããŸãã ããã«ãããä¿çäžã®æäœãå®è¡ãããŸããåå
lit0
äœæãã lit0
ãªãã©ã«ã®é
åãã4çªç®ã®èŠçŽ ãèªã¿åãæäœãlit0
ãŸãã ãã®ååã¯ãçŸåšã®ããŒã¹ãŠãããã®å€ã®ã¹ã¿ãã¯ã«é
眮ããŸãã - 1ã€ã®èŠçŽ ã®é
åãäœæããããã
args0
ãšããååã§args0
ãŸãã . , , ( lit0
). , : args0[0] = lit0
. - sendMessage,
args0
. ( , ). - temp0, .
temp0
. - ( popTop ).
äžèŠæãã§ãããå®éã«ã¯ãããããã¹ãŠãã»ãã®æ°åã®ã¢ã»ã³ãã©ãŒåœä»€ã§ãŸãšããããŸããç¹ã«ãåŒæ°ã®é
åãäœæãããšããå¿
èŠãªã¡ã¢ãªæäœã®ã¿ãæ®ããŸããããªãã©ã«ãèªã¿åããé
åã«æžã蟌ã¿ãã¡ãã»ãŒãžãéä¿¡ããçµæãäžæå€æ°ã«æžã蟌ã¿ãŸããåãæäœã»ããã®ãœãããŠã§ã¢VMã¯ãã¹ã¿ãã¯ãæäœãããšãã«ã¡ã¢ãªã®èªã¿åããšæžã蟌ã¿ãç¹°ãè¿ãå®è¡ããå¿
èŠããããŸããå€ãã³ã³ããã¹ãã¹ã¿ãã¯ã«ããã·ã¥ããŠããã«å€ãååŸããåŒæ°ã®é
åã«æžã蟌ã¿ãŸãã圌女ã¯åã³äœæãããåŒæ°ã®é
åãžã®ãã€ã³ã¿ãã¹ã¿ãã¯ã«çœ®ãããããã¹ã¿ãã¯ããåŒãåºããã¡ãã»ãŒãžãéä¿¡ãããšãã«ããã䜿çšããŸãããã®çµæã¯æ°ç§éã ãã¹ã¿ãã¯ã«çœ®ãããŸããææ°ã®ããã»ããµãšå€§èãªããŒã¿ãã£ãã·ã¥ã§ããç§ãã¡ã®åœã§ã¯ãåŒæ°ã®é
åã§ããããŒãäžã«äœæãããŸããããã¹ããªãŒã ãžã®åŒã³åºãã®å®éã®ã¹ã¿ãã¯ã«é
眮ãããŸãããããã£ãŠãé
åã®å²ãåœãŠãšå
å¡«ã¯è¿
éã«è¡ãããŸããæãéèŠãªããšã¯ãIRã§åäœããLLVMã¯ãçŽæ¥èŠãããªããé©åãšèããããããçš®é¡ã®æé©åãèªç±ã«å®è¡ã§ããããšã§ããããšãã°ãåãtempå€ãé£ç¶ããŠ2å䜿çšãããå ŽåããããŸããæ¬¡ã«ãå€ãåèªã¿åããã代ããã«ãLLVMã¯ä»¥åã®ååã䜿çšã§ããŸãïŒãããçµæã«åœ±é¿ããªãå ŽåïŒããããŠããã®ãããªäºçްãªäºæããããããããŸãã...ã³ã³ãã€ã©å€ã¹ã¿ãã¯ãããŒã«ã«ã§äœ¿çšãããªãã·ã§ã³ãæ€èšããŸããããã ããç§»è¡æäœãéå§ããããšãäºæ
ã¯ããã«è€éã«ãªããŸãããã¹ãŠã®ããã·ã¥æäœçŸåšã®åºæ¬åäœã®å€ã®ããŒã«ã«ã¹ã¿ãã¯ã§å®è¡ãããŸããã¹ã¿ãã¯æäœã¯éããŒã«ã«ã«ããããšãã§ããŸãããã®å Žåãå€ã¯é·ç§»éå±€ã®äžäœã®ãããã¯ããåé€ãããŸããããšãã°ã2ã€ã®åºæ¬ãããã¯XãšYããããŸãããããã¯Xã¯æäœpushTemporary 0
ãšbranch , Y. , Y markArguments 1
, . , Y . , Y X, . .
Y X 1 ..X n , Ï- , SSA. X i , , . , .
, MethodCompiler::TJitContext::popValue() JITCompilation.txt .
, , « ». , , . Collection>>sort:
, . , , .
, . , , . , .
, . , 10% , , â . , :
branch , Y. , Y markArguments 1
, . , Y . , Y X, . .
Y X 1 ..X n , Ï- , SSA. X i , , . , .
, MethodCompiler::TJitContext::popValue() JITCompilation.txt .
, , « ». , , . Collection>>sort:
, . , , .
, . , , . , .
, . , 10% , , â . , :
branch , Y. , Y markArguments 1
, . , Y . , Y X, . .
Y X 1 ..X n , Ï- , SSA. X i , , . , .
, MethodCompiler::TJitContext::popValue() JITCompilation.txt .
, , « ». , , . Collection>>sort:
, . , , .
, . , , . , .
, . , 10% , , â . , :