仿¥ã¯ ãRubyã§ã€ãããRubyã¿ãããªèšèªã®ã³ã³ãã€ã©ããšããããšã§ã ã³ã³ãã€ã©åå¿è ãããã€èšèªã®ã³ã³ãã€ã©ããRubyã䜿ã£ãŠäœã£ãŠã¿ããããšããã話ãšã ãã®äžã§åŸãçµéšãã³ãã«ã€ããŠã話ãããŸãã
ãŸãèªå·±ç޹ä»ã§ãã ã¯ããããŸããããšç³ããŸãã æ ªåŒäŒç€Ÿæ°žåã·ã¹ãã ãããžã¡ã³ããšããäŒç€Ÿã§ãRubyããã°ã©ããšããŠåããŠããŸãã ãŸããããžã£ã¬ã奜ããªã®ã§ãæãã€ããããžã£ã¬ãTwitterãžæŸæµãããããŠããŸãã ãã¡ãã¯ãæè¿ã®ãæ°ã«å ¥ããã€ãŒããã«ãªããŸãã
ãŸããè¶£å³ã§äœã¬ã€ã€ããã°ã©ãã³ã°ãããŠããŸãã CPUãèªäœãããã RISC-Vã®ã·ãã¥ã¬ãŒã¿ãäœã£ããã MinCamlã³ã³ãã€ã©ãç§»æ€ãããããŠããŸãã
è¶£å³ã® MinCaml ã³ã³ãã€ã©ã®ç§»æ€ãããŠãããã¡ã«ã1ããã³ã³ãã€ã©ãäœããããªã£ãŠããŸããŠãããã§ ä»æ¥ã話ããã TinyRuby ã®éçºãå§ããŸããã
仿¥ã話ãããããšã¯ã TinyRubyã®ç޹ä»ãšã TinyRubyã®äœæãéããŠåŸããã³ã³ãã€ã©äœæã®äŸ¿å©æ å ±ãTipsãã«ã€ããŠã ãããŠããã³ã³ãã€ã©ã®åãã®äžæ©ããšããããšã§ãå®éã«ã³ã³ãã€ã©ãäœæããæµãããèŠãããããšæããŸãã
ã§ã¯ TinyRuby ã«ã€ããŠã玹ä»ããŸããTinyRubyã¯ããããªæãã®Rubyã¿ãããªããã°ã©ãã³ã°èšèªã«ãªããŸãã
ããã»ã©æžãããµã³ãã«ããã°ã©ã ã®ãã«ãæé ã¯ãããªæãã§ãã ãŸããTinyRubyã³ã³ãã€ã©ã§ sample.rb ãã³ã³ãã€ã«ãããšãã³ã³ãã€ã«çµæã®ã¢ã»ã³ããªãæšæºåºåã«åºåãããŸããããã sample.s ãšãããã¡ã€ã«ã«ä¿åããŸãã æ¬¡ã«ãå ã»ã©çæããã¢ã»ã³ããªãã¡ã€ã« sample.s ããgcc ã³ãã³ãã§ã¢ã»ã³ãã«ãšãªã³ã¯ãè¡ããå®è¡ãã¡ã€ã« a.out ãçæããŸãã å®è¡ãã¡ã€ã« a.out ãå®è¡ãããšãããã°ã©ã ã®å®è¡çµæãç»é¢ã«åºåãããŸãã
次ã¯TinyRubyã®æ§æè§£æåšãããŒãµãŒã«ã€ããŠã§ãã TinyRubyã®ããŒãµãŒã¯MinRubyã®ããŒãµãŒããã®ãŸãŸå©çšããŠããŸãã MinRubyãšããã®ã¯ããRubyã§ã€ããRubyããšããæžç±ã«ç»å ŽãããRubyã®ãµãã»ããèšèªã§ãããã¡ãã®æžåœ±ããRubyã§ã€ããRubyãã«ãªããŸãã TinyRubyã¯MinRubyã®ããŒãµãŒã䜿ã£ãŠã¯ããŸãããã³ã³ãã€ã©ã®å®è£ ãç°¡åã«ãããããMinRubyããããã€ãã®æ©èœãèœãšãããŠããŸãã äŸãã°ã ãããŒã¿åã¯æŽæ°åã®ã¿ãã ã£ããã ãArrayãšHashããµããŒãããªããã ã£ããã ã颿°ã®åŒæ°ã¯6ã€ãŸã§ããªã©ã®å¶éããããŸãã ãã®ãããTinyRubyã¯MinRubyã®ãµãã»ããèšèªãšèšããŸãã
TinyRubyã³ã³ãã€ã©ã®ã¿ãŒã²ããç°å¢ã¯ãCPUã x86-64 ã§ãOSã Linux ãšãªããŸãã macOS ã Windows ãã䜿ãã®æ¹ã¯ãDocker äžã® Linux ç°å¢ãªã©ã§éçºã§ããŸãã ç§ã M1 Mac ã䜿ã£ãŠããã®ã§ãDocker äžã§éçºãè¡ããŸããã
次ã¯ãTinyRuby ã®äœæãéããŠåŠãã ãã³ã³ãã€ã©äœææã«äœ¿ããäŸ¿å©æ å ±ãTipsã玹ä»ããŸãã 1) Cã³ã³ãã€ã©ãåºåããã¢ã»ã³ããªã³ãŒãã®æŽ»çš 2) ã¬ãžã¹ã¿ãšABIãç¥ã 3) å°ããªã¹ãããã§é²ãã
ã§ã¯ã1ã€ç®ã®TipsãCã³ã³ãã€ã©ãåºåããã¢ã»ã³ããªã³ãŒããæŽ»çšãããã«ã€ããŠã話ãããŸãã ã¢ã»ã³ããªãæžããŠãããšããCèšèªã§ã¯ã©ãæžããã¯ããããã©ãã¢ã»ã³ããªã§ã©ãæžãã°ãããåãããªãïŒããšããããšããããããŸãã ãããªæã¯ãåžæããåŠçãè¡ãããã°ã©ã ãCã§æžããCã³ã³ãã€ã©ã«ã¢ã»ã³ããªã³ãŒããåºåãããããšã§ãã¢ã»ã³ããªã³ãŒãã確èªã§ããŸãã Cã³ã³ãã€ã©ã«ã¢ã»ã³ããªã³ãŒããåºåãããæ¹æ³ã¯ããã€ããããŸããããCompiler Explorerãäœ¿ãæ¹æ³ããšãGCCã® `-S` ãªãã·ã§ã³ãäœ¿ãæ¹æ³ãã®2ã€ããæè»œã§äŸ¿å©ã§ãã
https://godbolt.org/ ãŸã㯠Compiler Explorer ãäœ¿ãæ¹æ³ã玹ä»ããŸãã Compiler Explorer ã¯ãæ§ã ãªèšèªãæ§ã ãªCPUãåºåããã¢ã»ã³ããªã確èªã§ããã«ãã³ãããµã€ãã§ãã ïŒåç»ãåçïŒ ã»Compiler Explorer ã®ç»é¢ã¯2ã€ã®é åã«åãããŠããŠãå·ŠåŽã«ã¯ãœãŒã¹ããã°ã©ã ãæžããšãå³åŽã«ãã®ãœãŒã¹ã®ã¢ã»ã³ããªãåºåãããŸãã ã»Cã®ãœãŒã¹ããã°ã©ã ã®ã©ã®éšåããã¢ã»ã³ããªã³ãŒãã®ã©ã®éšåã«å¯Ÿå¿ããŠãããããè²ã«ãã£ãŠãããããã衚瀺ãããã®ã§ãã¢ã»ã³ããªã®çè§£ã«åœ¹ç«ã¡ãŸãã
次ã«ãGCCã®ã-Sããªãã·ã§ã³ãäœ¿ãæ¹æ³ã玹ä»ããŸãã éåžžãGCCã«Cèšèªã®ãœãŒã¹ã³ãŒããæž¡ããšãå®è¡ãã¡ã€ã«ããªããžã§ã¯ããã¡ã€ã«ãçæãããŸãã ããããgcc ã«ã-Sããªãã·ã§ã³ãä»ããããšã§ãã³ã³ãã€ã«ã®ã¿ãè¡ãããã®çµæãã¢ã»ã³ããªãã¡ã€ã«ãšããŠåºåããããšãã§ããŸãã äŸãã°ã次ã®ãããªCèšèªã®ãœãŒã¹ã³ãŒããã-Sããªãã·ã§ã³ãã€ããŠå®è¡ãããš...ïŒæ¬¡ã®ããŒãžïŒ
ãã®ãããªã¢ã»ã³ããªã³ãŒããåºåãããŸãã
ãCompiler ExplorerããšãGCCãã®äœ¿ãåãã«ã€ããŠã§ãã åºæ¬çã«ã¯ãCompiler Explorerãã䜿ã£ãŠããã°OKã§ããã Compiler Explorer ãåºåããã¢ã»ã³ããªã¯ãåºåãªãã·ã§ã³ã« Compiler Explorer ãåºåããã¢ã»ã³ããªã¯ãåºåãªãã·ã§ã³ã®èšå®ã«ãã£ãŠã¯ããã®ãŸãŸãã«ãã§ããªãããšããŸãŸãããŸãã ãã®ãããåºåããã¢ã»ã³ããªããã®ãŸãŸãã«ãã«ããããå Žåãªã©ã¯ãGCCãã§ã ããã§ãªãå Žåã¯ãCompiler Explorerãã䜿ããšè¯ãã§ãããã
äºã€ãã®Tipsã¯ãã¬ãžã¹ã¿ãšABIãç¥ããã§ãã ã³ã³ãã€ã©ãåºåããã¢ã»ã³ããªãçè§£ããããã«ã¯ã察象ãšãªãCPUã®ãã¬ãžã¹ã¿æ§æããšãABIããç¥ãå¿ èŠããããŸãã
ãŸãã¬ãžã¹ã¿ã«ã€ããŠèª¬æããŸãã CPUã«ã¯ãã¬ãžã¹ã¿ããšåŒã°ããããŒã¿ã®èšæ¶é åããããCPUãæŒç®ãè¡ãéã«å©çšããããäžæçãªããŒã¿ã®çœ®ãå ŽãšããŠå©çšãããããŸãã x86-64 ã¯ãããã«ç€ºã 16 æ¬ã® 64 ãããæ±çšã¬ãžã¹ã¿ããããŸãã ãŸãããã以å€ã«ãæµ®åå°æ°ç¹æ°çšã®ã¬ãžã¹ã¿ãããã©ã°ã¬ãžã¹ã¿ãªããã®ããã£ããããŸãããããã§ã¯çç¥ããŸãã
次ã«ãABI ã«ã€ããŠã話ãããŸãã ABI ãšã¯ãApplication Binary Interface ã®ç¥ã§ãã¢ã»ã³ããªèšèªã¬ãã«ã§ã®é¢æ°ã®åŒã³åºããªã©ã®èŠçŽã®ããšã§ãã
äŸãã°ãx86-64 ã§é¢æ°ãåŒã³åºãéã«ã¯ã 第äžåŒæ°ã¯ RDI ã¬ãžã¹ã¿ã 第äºåŒæ°ã¯ RSI ã¬ãžã¹ã¿ã ãšãã£ãããã«ãã第äžåŒæ°ãããã第å åŒæ°ããŸã§ã®å€ããæ±ºããããã¬ãžã¹ã¿ã«ã»ããããå¿ èŠããããŸãã ãŸãã第äžåŒæ°ä»¥éã¯ã¹ã¿ãã¯ã«åŒæ°ã®å€ãç©ãå¿ èŠããããŸãã ãããã ABI ã«ãã£ãŠå®ããããŠããŸãã 颿°ã®æ»ãå€ã®è¿ãæ¹ã ABI ã§æ±ºããããŠããŠãæ»ãå€ã¯ RAX ã¬ãžã¹ã¿ã«æž¡ããŠè¿ãå¿ èŠããããŸãã ABI ã§ããããèŠçŽãå®çŸ©ããããšã§ãèŠçŽã«åŸã£ãã¢ãžã¥ãŒã«éã§ã®çžäºåŒã³åºãããããŒã¿ã®é£æºãã§ããããã«ãªããŸãã
x86-64 ã® ABI ã®ããè©³çŽ°ãªæ å ±ã«ã€ããŠã¯ããã¡ãã®è³æãªã©ãåç §ããŠãã ããã ãŸãããã㯠x86-64 äžã§åäœãã Linux ã® ABI ãªã®ã§ãä»ã® OSãä»ã® CPU ã®å Žåã¯ã察象ãšãªãç°å¢ã® ABI ã調ã¹ãå¿ èŠããããŸãã
3ã€ç®ã®Tipsã¯ãå°ããªã¹ãããã§é²ãããã§ãã ã³ã³ãã€ã©ãäœæããéã«ãäžåºŠã«å šãŠã®æ©èœãå®è£ ããã®ã§ã¯ãªããå°ããªã¹ããããå»ã¿ãªããæ©èœãå®è£ ããŠãããšãã³ã³ãã€ã©ã®å®è£ ããããããæ«æããã«ãããªããŸãã TinyRuby ã®éçºã§ã¯ã æŽæ°ãªãã©ã«ã®è©äŸ¡ããã¹ã¿ãŒãããŠã ååæŒç®ãããªã³ã颿°åŒã³åºããè€æ°ã¹ããŒãã¡ã³ãã倿°ã®ä»£å ¥ãšåç §ãæ¯èŒæŒç®ãæ¡ä»¶åå²ã颿°åŒã³åºãã颿°å®çŸ©ãã®é çªã§æ©èœã远å ããŠãããŸããã
ãŸããæ©èœã远å ããéã«ãã·ã§ã«ã¹ã¯ãªããã§ãã¹ããæžããŠããæ©èœã1ã€ãã€å®è£ ããŠããããã¹ãé§åéçºãã§éçºãè¡ããŸããã ãŸãã¯æŽæ°ãªãã©ã«ã®ãã¹ããæžããŠãã³ã³ãã€ã©ãå®è£ ã æ¬¡ã«ååæŒç®ã®ãã¹ããæžããŠãã³ã³ãã€ã©ãå®è£ ã ãã®æ¬¡ã«è€æ°ã¹ããŒãã¡ã³ãã®ãã¹ããæžããŠãã³ã³ãã€ã©ãå®è£ ã ãšãããããªãµã€ã¯ã«ãããã¹ãŠã®æ©èœã®å®è£ ãçµãããŸã§ç¹°ãè¿ããŸãã
ãŸããå°ããªã¹ãããã§é²ããããšã®ã¡ãªããã¯ã - ã³ã³ãã€ã©ã«å¿ èŠãªç¥èãæ®µéçã«ç¿åŸã§ãã - é©åºŠãªç²åºŠã§ãã¹ããæžããããããããã¹ãé§åéçºãè¡ãããã ãšããã®ãã¡ãªããã«ãªããŸãã
ãã¹ãé§åéçºã§é²ããããšã®ã¡ãªããã¯ã - ç®ã®åã®åé¡ã«ã ãéäžã§ãã - ãã¹ã宿œã容æ - ãã£ãŒãããã¯ã峿ã«åŸããã - çããµã€ã¯ã«ã§éææãåŸããããããã¢ãããŒã·ã§ã³ãç¶æãããã ãªã©ããããŸãã
ãå°ããªã¹ãããã§ã³ã³ãã€ã©éçºãé²ããæ¹æ³ããããã¹ãé§åã§ã®ã³ã³ãã€ã«éçºãã«ã€ããŠã¯ããã®2ã€ã®åèè³æãå ã«ãªã£ãŠããŸãããã²ããã¡ããèªãã§ã¿ãŠãã ããã
ã³ã³ãã€ã©ã®äœææé ã«ã€ããŠã®èª¬æã¯ä»æ¥ã¯ãããŸã§ã§ããã ããè©³çŽ°ãªæ å ±ã Cosense ã«ãŸãšããããŠããŸãã®ã§ãæ°ã«ãªãæ¹ã¯ãã¡ããã芧ãã ããã
ã§ã¯ãæ¬æ¥ã®ãŸãšãã§ãã TinyRubyã®ç޹ä»ãšã ã³ã³ãã€ã©äœæã®Tipsã玹ä»ããŸããã ä»åã®çºè¡šã§ãã³ã³ãã€ã©äœã£ãŠã¿ããïŒãšæã£ãŠããã ãããå¬ããã§ãã ãã²ãã³ã³ãã€ã©ãéããŠäœã¬ã€ã€ã®äžçã«è§ŠããŠã¿ãŠãã ããã