Rust: Rustcμ—κ²Œ 꼬리 ν˜ΈμΆœμ„ ν•˜λ„λ‘ κ°€λ₯΄μΉ˜μ‹­μ‹œμ˜€.

에 λ§Œλ“  2011λ…„ 01μ›” 27일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: rust-lang/rust

RustcλŠ” 아직 꼬리 호좜('ret'κ°€ μ•„λ‹Œ 'be')을 μˆ˜ν–‰ν•˜λŠ” 방법을 λͺ¨λ¦…λ‹ˆλ‹€. 방법을 κ°€λ₯΄μΉ˜λŠ” 것은 λ„ˆλ¬΄ 어렡지 μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

A-LLVM

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

κ°€λŠ₯ν•˜λ‹€λ©΄ ꢁ극적으둜 보μž₯된 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_).

λͺ¨λ“  18 λŒ“κΈ€

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
...

이 λͺ¨λ“  것을 μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 우리 λͺ¨λ‘λŠ” 꼬리 호좜이 μœ λ•ν•œ μ–Έμ–΄ κΈ°λŠ₯μ΄λΌλŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.
    κ·Έλ“€μ˜ 미덕에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 우리 쀑 λ§Žμ€
    lisp 및 ML 배경이 있고 μ•„μ£Ό μ’‹μ•„ν•  κ²ƒμž…λ‹ˆλ‹€. κ·Έλ“€μ˜
    λΆ€μž¬λŠ” 마음의 고톡과 μŠ¬ν””μ΄λ©° κ°€λ³κ²Œ λ„μ°©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • κΌ¬λ¦¬λŠ” 결정둠적 파괴둜 "잘λͺ»λœ ν”Œλ ˆμ΄"λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 포함
    ~ μƒμžμ˜ 결정적 λ“œλ‘­. 그듀이 μ•„λ‹ˆλΌκ³  λ§ν•˜λŠ” 것이 μ•„λ‹ˆλΌ
    ꡬ성할 수 μžˆμ§€λ§Œ ꡬ성 μ˜΅μ…˜μ€ UIκ°€ μ–΄μƒ‰ν•©λ‹ˆλ‹€.
    μ„±λŠ₯ μ €ν•˜, 의미 λ³΅μž‘ν™” λ˜λŠ” μœ„μ˜ λͺ¨λ“  것.
  • 꼬리 ν˜ΈμΆœμ€ λ˜ν•œ
    ν”Œλž«νΌ ABI 및 동적 μ—°κ²°.
  • 꼬리 ν˜ΈμΆœμ—λŠ” μ„±λŠ₯ μ €ν•˜μΈ 호좜 κ·œμΉ™μ΄ ν•„μš”ν•©λ‹ˆλ‹€.
    C κ·œμΉ™κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€.
  • μš°λ¦¬λŠ” tail _recursion_ 의 λŒ€λΆ€λΆ„μ˜ κ²½μš°κ°€ ν•©λ¦¬μ μœΌλ‘œ 잘 λ³€ν™˜λœλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.
    루프 및 λŒ€λΆ€λΆ„μ˜ λΉ„μž¬κ·€ 꼬리 호좜의 경우 μƒνƒœλ₯Ό μΈμ½”λ”©ν•©λ‹ˆλ‹€.
    ν•©λ¦¬μ μœΌλ‘œ 잘 감싸진 λ£¨ν”„λ‘œ λ³€ν™˜ν•˜λŠ” 기계
    μ—΄κ±°. λ‘˜ λ‹€ _κ½€_ μ˜ˆμ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    꼬리 ν˜ΈμΆœμ„ μ‚¬μš©ν•˜λŠ” λ³€ν˜•μ΄μ§€λ§Œ μž‘λ™ν•˜κ³  "λΉ λ₯΄κ²Œ"*,
    뿐만 μ•„λ‹ˆλΌ C 및 C++ ν”„λ‘œκ·Έλž˜λ¨Έλ₯Ό μœ„ν•œ κ΄€μš©μ  ν‘œν˜„(우리의
    μ£Όμš” 청쀑).

이런 말씀을 λ“œλ € μ£„μ†‘ν•˜κ³  마음이 λ¬΄κ²μ§€λ§Œ μ €ν¬λŠ”
μ‹œλ„ν–ˆμ§€λ§Œ κ·Έλ“€κ³Ό κ΄€λ ¨λœ μ ˆμΆ©μ•ˆμ„ λ§Œλ“œλŠ” 방법을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
녹에 ν¬ν•¨λ˜λŠ” μ£Όμž₯을 μš”μ•½ν•©λ‹ˆλ‹€.

-κ·Έλ ˆμ΄λ“ 

  • 속도 μΈ‘λ©΄μ—μ„œ μŠ€μœ„μΉ˜ 인 μ–΄ 루프 μƒνƒœ 머신은 κ°„μ ‘ λ””μŠ€νŒ¨μΉ˜μ΄λ―€λ‘œ
    의 꼬리 ν˜ΈμΆœμ— μ˜ν•΄ μΈμ½”λ”©λœ μƒνƒœ 머신보닀 느리게 싀행될 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.
    μƒνƒœμ—μ„œ μƒνƒœλ‘œ; λ°˜λ©΄μ— 이 μ„±λŠ₯을 μ–»λŠ” 방법은
    "λ’€λ‘œ"λŠ” λͺ¨λ“  κ³³μ—μ„œ ν…ŒμΌ μ½œμ„ μΌœλŠ” κ²ƒμž…λ‹ˆλ‹€. μš°λ¦¬λŠ” 고립된 것을 κ±°λž˜ν•  κ²ƒμž…λ‹ˆλ‹€.
    λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 졜적의 μ„±λŠ₯이 μ•„λ‹Œ 경우 졜적의 μ„±λŠ₯이 μ•„λ‹Œ μ„ΈκΈˆ. 우리
    이 κ±°λž˜κ°€ ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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의 μ œμ•ˆμ— λŒ€ν•œ μΆ”κ°€ 컴파일 μ‹œκ°„ μ˜€λ²„ ν—€λ“œλ₯Ό 크게 μ™„ν™”ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰