Rustcλ μμ§ κΌ¬λ¦¬ νΈμΆ('ret'κ° μλ 'be')μ μννλ λ°©λ²μ λͺ¨λ¦ λλ€. λ°©λ²μ κ°λ₯΄μΉλ κ²μ λ무 μ΄λ ΅μ§ μμμΌ ν©λλ€.
Graydonμ λ°λ₯΄λ©΄ μ΄κ²μ ꡬννκΈ° μ μ νΈμΆ κ·μΉμ λν΄ μ’ λ μκ°ν΄ λ³Ό νμκ° μμ΅λλ€. LLVMμ 꼬리 νΈμΆμ ꡬννκΈ° μν΄ fastcc κ·μΉμ΄ νμνμ§λ§ μ°λ¦¬κ° μνλ λλ‘λ λμ§ μμ΅λλ€:
Graydon: brson: llvm-landμ μ견μΌλ‘ νλ¨νλ©΄ λ¬Έμ κ° μμ μ μμ΅λλ€. μ°λ¦¬λ fastccκ° μ€λ νλ μΌμ 보μν μ μμμ§ λͺ¨λ₯΄μ§λ§ λ΄μΌ λ§μμ λ°κΏ μ μμ΅λλ€.
Graydon: fastcc == x86_fastcallμ΄λΌκ³ μκ°νλλ° νλ Έμ΅λλ€.
Graydon: λ€λ₯Έ νΈμΆ κ·μΉμ
λλ€. fastccλ "μ΄λ² μ£Όμ llvmμ΄ μ΄λ€ λλμ΄λ κ°μ"μ
λλ€.
Graydon: x86_fastcallλ‘ μ νν λ€μ μ₯κΈ°μ μΌλ‘ μ체 νΈμΆ κ·μΉμ μμ±ν΄μΌ ν©λλ€.
μ΄κ²μ LLVMμ΄ κΌ¬λ¦¬ νΈμΆμ μ²λ¦¬νλ λ°©μμ λͺ κ°μ§ 볡μ‘ν λ¬Έμ λ‘ μΈν΄ νμ¬ μ λ°λ§ ꡬνλμμ΅λλ€. Rustcλ 'be' ννμ ꡬ문 λΆμνκ³ μ΄λ₯Ό call+ret μμΌλ‘ λ³νν©λλ€. μ΄λ λ¨μνκ³ μμ£Ό κΉμ§ μμ κ²½μ°μ 'μμ 'νλλ‘ νκΈ°μ μΆ©λΆν©λλ€. λΆνΈμ€νΈλ©μ μΆ©λΆν μ μμ΅λλ€.
보μ₯λ 꼬리 νΈμΆμ μ§μνλ CC(fastcc)λ λΆλͺ ν νλλΏμ΄λ©° μ΄μ μ μνλ €λ©΄ μ¬λ¬ μμΉμμ ABI κ°μ μ λ³κ²½ν΄μΌ ν©λλ€(-tailcallopt νλκ·Έλ₯Ό νμ±ννλ©΄ νΈμΆ μμ μ 볡μμΌλ‘ λ°λλλ€). λ°λΌμ νμμ λ°λΌ call+ret μμ 'tail'λ‘ μ£Όμμ λ¬λλΌλ μ€μ λ‘ LLVMμ ν΄λΉ μ΅μ ν μνμ μμνλλ‘ μ§μν μ μμ΅λλ€.
μ체 νΈμ€ν μ λν΄ μ¬κΈ°μ νμλ κ²λ³΄λ€ λ λ§μ ꡬνμ΄ νμνμ§ μμ κ²μΌλ‘ λνλ¬μ΅λλ€. λ€μ μ΄μ νλ₯Ό ν₯ν ννΈ.
μ°λ¦¬κ° μ€μ λ‘ λ μ΄μ μ΄κ²μ ν κ²μ΄λΌκ³ μκ°νλ μ¬λμ΄ μμ΅λκΉ?
μΌμ΄λ κ² κ°μ§ μμ΅λλ€.
LLVM λ° κΌ¬λ¦¬ νΈμΆμ μν©μ 무μμ λκΉ? νΈμΆ μμ μλ₯Ό 꼬리 νΈμΆλ‘ μ μΈνλ κ²κ³Ό κ°μ μΉ¨μ μ μΈ μμ μμ΄ μμ μ μΌλ‘ μλνλλ‘ λ§λ€ μ μλ€λ©΄ 꼬리 νΈμΆ(νΈμΆμμ μ체 μΈμ, μ€μΉΌλΌ) λ° μ€λ₯ λ°μ μ μ λ¬ν μ μλ μ νλ μ§ν©μ μ μν μ μμ΅λλ€. κ·Έλ μ§ μμΌλ©΄ ν΅κ³Όλ©λλ€. κ·Έλ¬λ μ΄λ¬ν 꼬리 νΈμΆμ μ€μ λ‘λ κ·Έλ€μ§ μ μ©νμ§ μμ μ μμ΅λλ€.
Haskellμ GHC LLVM λ°±μλλ₯Ό 보λ κ²μ΄ λμμ΄ λ μ μμ΅λκΉ?
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λ₯Ό μ ννλ λνΌλ₯Ό μ»΄νμΌνλ λ±μ λ°©λ²μΌλ‘ μ΄λ₯Ό ꡬνν μ μμ΅λλ€. λλ 꼬리 νΈμΆ μΉνμ μΈ ABIλ₯Ό μ¬μ©νλλ‘ λͺ¨λ κ³³μμ _every_ ν¨μλ₯Ό μ νν μ μμ΅λλ€. νμ¬ κ·Έλ κ² νκ³ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. μ°λ¦¬λ μ μ λμ μμμ§λ§ λ©μ·μ μλ μμ΅λλ€. μ°λ¦¬κ° λ μ΄μ μ¬μ©νμ§ μλ LLVM "fastcall" ABIμ λλ€.
μ΄μ¨λ μ’ μλ§μ λλ€.
μ΄μ νμ νΈμΆ μ΅μ νκ° μμ΅λλ€. μ°λ¦¬λ λ λ§μ κ²μ μλν κ³νμ λκΉ?
#2216μμ μΈκΈν λ²μλ₯Ό μ μΈνκ³ λ μΌμ΄λμ§ μμ κ²μ λλ€. #2216μ λν μ루μ μ μΌλ° μν λ¨Έμ μ½λ©μ μ§μνκΈ°μ μΆ©λΆν κ΄λ²μν΄μΌ ν©λλ€.
μ΄κ²μ λνμμ κ³μν΄μ λμ€κ³ , μ°λ¦¬λ be
λ₯Ό λ€μ μμ½νμ΅λλ€. μ¬κ°μ₯.
λ©μΌλ§ 리μ€νΈμ λν Graydonμ μ견μ λ€μκ³Ό κ°μ΅λλ€.
https://mail.mozilla.org/pipermail/rust-dev/2013-April/003557.html
μ΄ κ΄μ λͺ»μ λ°μ΅λλ€. μ¬κΈ°μμ μ¬ν:
2013λ 10μ 4μΌ μ€μ 5μ 43λΆμ Artella Codingμ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
μλ νμΈμ λ Ήμ΄ κΌ¬λ¦¬ νΈμΆ μ΅μ νλ₯Όν©λκΉ? λ΄κ° 묻λ μ΄μ λ
λ€μ 꼬리 νΈμΆ μ¬κ· ꡬν κ²°κ³Ό μ€ν
κ³Όλ€. κ°μ¬ ν΄μ.
μλμ, κ·Έλ μ§ μμ κ°λ₯μ±μ΄ ν½λλ€. μ΄κ²μ λν μ€λ λ²κ·Έκ° μμ΅λλ€.
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λ λ€λ₯Έ ν¨μ λ΄λΆμ μ μλ ν¨μκ° tailcall μ΅μ νμ μ ν©ν΄μΌ νλ€κ³ λ§ν¨μΌλ‘μ¨ μ μ μΈμ λ³νμ μ§μν μ μμ΅λλ€. λλ λ€λ₯Έ ν¨μ λ΄λΆμ μ€μ²©λ ν¨μ κ°μ 꼬리 νΈμΆμ΄ νμ μ΅μ νμ μ€ν¨ν κ²½μ° λ¨μν κ²½κ³ ν©λλ€. νμ¬ μν©μ΄ νμ€νμ§ μμ΅λλ€.
꼬리 μ¬κ·κ° ꡬνλμ§ μλλ€λ κ²μ μ¬ν μΌμ λλ€. κ·Έλ° λ€μ μ§λ¬Έμ΄ μμ΅λλ€. κΈ°λ₯μ νμ κΈ°λ₯μ΄ μλ κ²½μ° κΈ°λ₯ μΈμ΄ ꡬ문μ²λΌ 보μ΄λ μΈμ΄ ꡬ문μ λ§λλ μ΄μ λ 무μμ λκΉ?
λλ λ Ήμ¬κ³ λ§€μ° μ¬νλ€. λλ 꼬리 μ¬κ· ν¨μλ₯Ό μλνκ³ μ€λ²νλ‘λ₯Ό λ무 빨리 μμ΅λλ€. 릴리μ€μμ μ»΄νμΌ ν λ λμ λ³κ²½μ΄ κ°μ₯ μ΅μ μ λλ€. κ·Έλ λ΄ κΈ°λ₯μ νΈμΆνμ§ μμ΅λλ€. μΉκ΅¬κ° λμκ² 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λ₯Ό ꡬνν κ³νμ΄ μμ΅λλ€. μ°λ¦¬λ μ¬μ§μ΄ "becom"μ΄λΌλ ν€μλλ₯Ό μμ½νμ΅λλ€. RFC 리ν¬μ§ν 리λ₯Ό νμΈνμμμ€.
2016λ 8μ 3μΌ 19:46 -0400, Antoine PLASKOWSKI [email protected] μ΄ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
λλ λ Ήμ¬κ³ λ§€μ° μ¬νλ€. λλ 꼬리 μ¬κ· ν¨μλ₯Ό μλνκ³ μ€λ²νλ‘λ₯Ό λ무 빨리 μμ΅λλ€. 릴리μ€μμ μ»΄νμΌ ν λ λμ λ³κ²½μ΄ κ°μ₯ μ΅μ μ λλ€. κ·Έλ λ΄ κΈ°λ₯μ νΈμΆνμ§ μμ΅λλ€. μΉκ΅¬λ 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λ₯Ό ꡬνν κ³νμ΄ μμ΅λλ€. μ°λ¦¬λ μ¬μ§μ΄ "becom"μ΄λΌλ ν€μλλ₯Ό μμ½νμ΅λλ€. RFC 리ν¬μ§ν 리λ₯Ό νμΈνμμμ€.
2016λ 8μ 3μΌ 19:46 -0400, Antoine PLASKOWSKI [email protected] μ΄ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.