Rustcã¯ãæ«å°ŸåŒã³åºãïŒ'ret'ã§ã¯ãªã'be'ïŒãå®è¡ããæ¹æ³ããŸã ç¥ããŸããã ãã®æ¹æ³ãæããã®ã¯ããã»ã©é£ããããšã§ã¯ãããŸããã
ã°ã¬ã€ãã³ã«ããã°ããããå®è£ ããåã«ãèŠçŽã®åŒã³åºãã«ã€ããŠããå°ãèããå¿ èŠããããŸãã LLVMã¯æ«å°ŸåŒã³åºããå®è£ ããããã«fastccèŠåãå¿ èŠãšããŸãããããã¯ç§ãã¡ãæãããšãå®å šã«ã¯è¡ããŸããïŒ
ã°ã¬ã€ãã³ïŒbrsonïŒllvm-landã®ã³ã¡ã³ãããå€æãããšãåé¡ãçºçããŠããå¯èœæ§ããããŸãã fastccãä»æ¥è¡ã£ãŠããããšãè£ãããšãã§ãããããããŸããããææ¥ã¯èããå€ããããšãã§ããŸãã
ã°ã¬ã€ãã³ïŒfastcc == x86_fastcallã ãšæããŸããããééã£ãŠããŸããã
ã°ã¬ã€ãã³ïŒãããã¯ç°ãªãåŒã³åºãèŠçŽã§ãã fastccã¯ãä»é±ã®llvmã®æãã¯äœã§ããã§ã
ã°ã¬ã€ãã³ïŒx86_fastcallã«åãæ¿ããŠãããé·æçã«ã¯ç¬èªã®åŒã³åºãèŠçŽãäœæããå¿
èŠããããŸãã
ããã¯ãLLVMãæ«å°ŸåŒã³åºããåŠçããæ¹æ³ã«ããã€ãã®è€éãããããããçŸåšååå®è£ ãããŠããŸãã Rustcã¯ããbeãåŒã解æããããããcall + retãã¢ãšããŠå€æããŸããããã¯ãåçŽã§ããã»ã©æ·±ããªãã±ãŒã¹ã§ãäœæ¥ãããã®ã«ååã§ãã ããŒãã¹ãã©ããããã«ã¯ååãããããŸããã
ä¿èšŒãããæ«å°ŸåŒã³åºãããµããŒãããCCïŒfastccïŒã¯æããã«1ã€ã ãã§ãããããã«é©å¿ããã«ã¯ãããã€ãã®å Žæã§ABIã®ä»®å®ãå€æŽããå¿ èŠããããŸãïŒ-tailcalloptãã©ã°ãæå¹ã«ãããšcallee-restoreã«å€ãããŸãïŒã ãããã£ãŠãå¿ èŠã«å¿ããŠcall +retãã¢ã«ãtailãã®æ³šéãä»ããŠããå®éã«ã¯ãŸã ãã®æé©åã®å®è¡ãéå§ããããã«LLVMã«æ瀺ããããšã¯ã§ããŸããã
ã»ã«ããã¹ãã£ã³ã°ã®ããã«ããã«ç€ºãããŠãããããå€ãã®å®è£ ãå¿ èŠãšããªãããšãå€æããŸããã 次ã®ãã€ã«ã¹ããŒã³ãžã®ãã³ãã
誰ããç§ãã¡ãå®éã«ãããããããããšããŠãããšæããŸããïŒ
ãããèµ·ããããã«ã¯æãããŸããã
LLVMãšæ«å°ŸåŒã³åºãã®ç¶æ³ã¯ã©ãã§ããïŒ åŒã³åºãå ãæ«å°ŸåŒã³åºãã§ãããšå®£èšãããªã©ã®äŸµè¥²çãªãã®ãªãã§ç¢ºå®ã«æ©èœããããã«ã§ããå Žåã¯ãæ«å°ŸåŒã³åºãã«æž¡ãããšãã§ãããã®ã®éå®ãããã»ããïŒåŒã³åºãå èªèº«ã®åŒæ°ãã¹ã«ã©ãŒïŒãããã³äœããçºçãããšãã®ãšã©ãŒãå®çŸ©ã§ããŸãããã以å€ã®å Žåã¯æž¡ãããŸãã ãã ãããã®ãããªæ«å°ŸåŒã³åºãã¯å®éã«ã¯ããŸã圹ã«ç«ããªãå ŽåããããŸãã
Haskellã®GHCLLVMããã¯ãšã³ããèŠãããšã圹ç«ã€å¯èœæ§ã¯ãããŸããïŒ
http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/Backends/LLVM
http://llvm.org/docs/LangRef.html#callingconv
http://llvm.org/docs/CodeGenerator.html#tailcallopt
ãããã¯ãæ«å°ŸåŒã³åºã以å€ã®å Žåã«ã¯æé©ã§ã¯ãªãåŒã³åºãå ABIã§ã®ã¿æ©èœããŸãã ãããã£ãŠãããæå³ã§ã¯ãããã§ãã圌ãã¯ãåŒã³åºãå ãããŒã«ã³ãŒã«ãããããã«å®£èšãããããšãèŠæ±ããŸãã
ãããå®è£ ããã«ã¯ãããšãã°ãã¯ã¬ãŒããåæããæ«å°ŸåŒã³åºãã®é¢æ°ãèŠã€ããããæ«å°ŸåŒã³åºãã«é©ããABIã§åå¥ã«ã³ã³ãã€ã«ãããããšã³ããªæã«ABIãåãæ¿ããã©ãããŒãã³ã³ãã€ã«ããŸãã ãŸãã¯ãã©ãã§ã_every_é¢æ°ãæ«å°ŸåŒã³åºãã«é©ããABIã䜿çšããããã«åãæ¿ããããšãã§ããŸãã çŸåšãããè¡ã£ãŠãããã©ããã¯ããããŸããã ãã°ããããŸããããããããããããŸããã ããã¯LLVMã®ãfastcallãABIã§ãããããã¯ãã䜿çšããŠããªããšæããŸãã
ãããã«ãããããã¯å°ãæ··ä¹±ã§ãã
çŸåšãå åŒåŒã³åºãã®æé©åããããŸãã ãã£ãšããããšæã£ãŠããŸããïŒ
ïŒ2216ã§å¯ŸåŠãããŠããç¯å²ãé€ããŠãçºçããŸããã ïŒ2216ã®ãœãªã¥ãŒã·ã§ã³ã¯ãäžè¬çãªã¹ããŒããã·ã³ã³ãŒãã£ã³ã°ããµããŒãããã®ã«ååãªåºãã§ããå¿ èŠããããŸãã
ããã¯åŒãç¶ãäŒè©±ã®äžã§çºçãã be
ãå床äºçŽããŸããã åéã
ã¡ãŒãªã³ã°ãªã¹ãã«å¯ŸããGraydonã®ã³ã¡ã³ãã¯æ¬¡ã®ãšããã§ãã
https://mail.mozilla.org/pipermail/rust-dev/2013-April/003557.html
ãã®æ£ºã«éãå ¥ããŸãã ããã§åçŸïŒ
2013幎10æ4æ¥åå5æ43åãArtellaCodingã¯æ¬¡ã®ããã«æžããŠããŸãã
ããã«ã¡ã¯ãéã¯æ«å°ŸåŒã³åºãã®æé©åãè¡ããŸããïŒ ç§ãå°ããŠããçç±ã¯
次ã®æ«å°ŸåŒã³åºãã®ååž°çãªå®è£ ã¯ãã¹ã¿ãã¯ã«ãªããŸã
ãªãŒããŒãããŒã ããããšãã
ããããããã¯ãªããªãã§ãããã ããã«ã¯é·å¹Žã®ãã°ããããŸãïŒ
https://github.com/mozilla/rust/issues/217
ãŠã£ãããŒãžãšããã€ãã®ã¡ãŒãªã³ã°ãªã¹ãã¹ã¬ãããšåæ§ã«ïŒ
https://github.com/mozilla/rust/wiki/Bikeshed-tailcall
https://mail.mozilla.org/pipermail/rust-dev/2011-August/000689.html
https://mail.mozilla.org/pipermail/rust-dev/2012-January/001280.html
..ã
ãã®ãã¹ãŠã®èŠçŽã¯æ¬¡ã®ãšããã§ãã
ç³ãèš³ãããŸããããå¿ãéãã§ããã
ãããã«é¢é£ãããã¬ãŒããªããè¡ãæ¹æ³ãè©ŠããŸãããèŠã€ãããŸããã§ãã
ãã³ã«å«ããããã®è°è«ã«èŠçŽããŸãã
-ã°ã¬ã€ãã³
Haskellã¯éåžžãã€ã³ã©ã€ã³åãèåãªã©ã®ããã«éçãªåŒæ°å€æãå¿ èŠãšããããšã«æ³šæããŠãã ãããhttp://stackoverflow.com/a/9660027/667457
Rustã¯ãå¥ã®é¢æ°å ã§å®çŸ©ãããé¢æ°ã¯æ«å°ŸåŒã³åºãã®æé©åã®ããã«é€å€å¯èœã§ããå¿ èŠããããšèšãããšã§ãéçåŒæ°å€æããµããŒãã§ããŸãã ãŸãã¯ãå¥ã®é¢æ°å ã«ãã¹ããããé¢æ°éã®ããŒã«ã³ãŒã«ãå åŒã®æé©åã«å€±æããå Žåã¯ãåã«èŠåããŸãã çŸåšã®ç¶æ³ãããããªãã
æ«å°Ÿååž°ãå®è£ ãããªãã®ã¯æ²ããããšã§ãã ããããç§ã¯è³ªåããããŸãïŒé¢æ°åã®æ¬è³ªçãªæ©èœãæ¬ ããŠããã®ã«ããªãé¢æ°åèšèªæ§æã®ããã«èŠããèšèªæ§æãäœæããã®ã§ããïŒ
ç§ã¯ãã³ããã¥ãŒã¹ã§ããšãŠãæ²ããã§ãã æ«å°Ÿååž°é¢æ°ãè©ŠããŠã¿ãŸãããããªãŒããŒãããŒãéåžžã«éãã¹ã¿ãã¯ããŸããã ãªãªãŒã¹ã§ã³ã³ãã€ã«ãããšãåäœãå€åããŸãã 圌ã¯ç§ã®é¢æ°ãåŒã³åºããªãã ãã§ãã å人ãããLLVMã¯æªå®çŸ©ã®å€ã«æé©åããããšèšãããŸããïŒLLVMã¯ãæ«å°Ÿååž°ãç¡éã§ããããšãç¥ã£ãŠããŸããïŒïŒïŒïŒã
fn rec(i: i32) {
rec(i + 1)
}
fn main() {
println!("{}", rec(0));
}
ç§ã¯ãæ«å°ŸåŒã³åºããå®è£ ããªãæ©èœæ©èœãåããèšèªã§ããBoiethiosã«åæããŸãã
ç§ã¯CãšC++ã§æžããŠããŸãããæ«å°ŸåŒã³åºããä¿èšŒãããã®ã§ã¯ãããŸããããå®éã«ã¯éåžžã«ããŸãåŠçãããŸãã ãã³ãåŠã¶ã®ãæ¢ããã€ããã¯ãããŸãããä»ç§ã¯ãã³ããããåŠçããªãããšãç¥ã£ãŠããŸãã ããã«ã³ãŒãã£ã³ã°ããã®ã§ã倧ããªåé¡ã§ã¯ãããŸããã
ããããããã¯çŸä»£èªã«ãšã£ãŠéåžžã«åªããæ©èœã ãšæããŸãã
ãã®ããšã«æ³šæããŠãã ãã
fn rec(i: i32) {
println!("Hello");
rec(i + 1)
}
貚ç©ã®ãªãªãŒã¹ã¢ãŒãã§ãã¹ã¿ãã¯ãªãŒããŒãããŒ
å¯èœã§ããã°ãæçµçã«ä¿èšŒä»ãTCOãå®è£ ããäºå®ã§ãã ãã®ããã®ããŒã¯ãŒããbecomeããäºçŽããŸããã RFCãªããžããªã確èªããŠãã ããã
2016幎8æ3æ¥ã19ïŒ46 -0400ã AntoinePLASKOWSKInotifications @github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
ç§ã¯ãã³ããã¥ãŒã¹ã§ããšãŠãæ²ããã§ãã æ«å°Ÿååž°é¢æ°ãè©ŠããŠã¿ãŸãããããªãŒããŒãããŒãéåžžã«éãã¹ã¿ãã¯ããŸããã ãªãªãŒã¹ã§ã³ã³ãã€ã«ãããšãåäœãå€åããŸãã 圌ã¯ç§ã®é¢æ°ãåŒã³åºããªãã ãã§ãã å人ãç§ã«ãLLVMã¯å€ãå®çŸ©ããªãããã«æé©åãããšèšããŸããïŒLLVMã¯ãããç¡éååž°ã§ãããšç¥ã£ãŠããŸããïŒïŒïŒïŒã
fn recïŒiïŒi32ïŒ{recïŒi + 1ïŒ} fn mainïŒïŒ{printlnïŒïŒ "{}"ãrecïŒ0ïŒïŒ; }
ç§ã¯ãæ«å°ŸåŒã³åºããå®è£ ããªãæ©èœæ©èœãåããèšèªã§ããBoiethiosã«åæããŸãã
ç§ã¯CãšC++ã§æžããŠããŸãããæ«å°ŸåŒã³åºããä¿èšŒãããã®ã§ã¯ãããŸããããå®éã«ã¯éåžžã«ããŸãåŠçãããŸãã ãã³ãåŠã¶ã®ãæ¢ããã€ããã¯ãããŸããããã³ã¯ãããåŠçããªãããšãããã£ãã®ã§ããããªãã§ã³ãŒãã£ã³ã°ããã®ã§ã倧ããªåé¡ã§ã¯ãããŸããã
ããããããã¯çŸä»£èªã«ãšã£ãŠéåžžã«åªããæ©èœã ãšæããŸãã
â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubïŒhttps://github.com/rust-lang/rust/issues/217#issuecomment-237409642ïŒã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãïŒhttps://github.com/notifications/unsubscribe -auth / AABsipoedHrbnKDekmzCr-dl8M6g-Gojks5qcShKgaJpZM4AC-q_ïŒã
質åïŒå°ãªããšãåäžã®ã¯ã¬ãŒãå ã§ãã³ãŒã«ã°ã©ãåæãå®è¡ããæ«å°ŸåŒã³åºããã«ãŒãã«å€æããããšã¯ä»®æ³çã«å¯èœã§ãããã³ã³ãã€ã«æã«èšç®ã³ã¹ããé«ããã³ãŒãã£ã³ã°ãéåžžã«å°é£ã§ãã ãã®å¯èœæ§ã«ã€ããŠã®è°è«ã¯ãããŸãããïŒ åŒã³åºãèŠçŽã®éžæã«é¢ä¿ãªããããã¯ä»ã§ããªãã·ã§ã³ã§ãã
lbstanzaã®ã¢ãããŒãã¯ãé¢æ°ãTCOïŒdefnã§ã¯ãªãdefn +ïŒã«é©æ Œã«ããããã«ãé¢æ°ã®æ³šéãèŠæ±ããããšã§ãã ãã³ãå Žåãæåéãã©ãã§ãæ«å°ŸåŒã³åºãã䜿çšããŠããªãéããããã¯timthelionã®ææ¡ã«å¯Ÿããäœåãªã³ã³ãã€ã«æéã®ãªãŒããŒããããå€§å¹ ã«è»œæžããŸãïŒç¬ïŒã
æãåèã«ãªãã³ã¡ã³ã
å¯èœã§ããã°ãæçµçã«ä¿èšŒä»ãTCOãå®è£ ããäºå®ã§ãã ãã®ããã®ããŒã¯ãŒããbecomeããäºçŽããŸããã RFCãªããžããªã確èªããŠãã ããã
2016幎8æ3æ¥ã19ïŒ46 -0400ã AntoinePLASKOWSKInotifications @github.comã¯æ¬¡ã®ããã«æžããŠããŸãã