์์ ํ ๋์: 1.38.0(๋ฒ ํ ์ปท 2019-08-15)
์ด๊ฒ์ ๋ค์์ ํฌํจํ์ฌ ์คํ ๊ฐ๋ฅํ ์ต์ ๋น๋๊ธฐ/๋๊ธฐ ๊ธฐ๋ฅ์ ์์ ํํ๊ธฐ ์ํ ์ ์์ ๋๋ค.
async
์ฃผ์์ผ๋ก ์ธํด ํ๊ฐ๊ฐ ์ง์ฐ๋๊ณ ๋์ ๋ฏธ๋๋ก ํ๊ฐ๋ฉ๋๋ค.await
์ฐ์ฐ์๋ async
์ปจํ
์คํธ ๋ด์์๋ง ์ ํจํฉ๋๋ค. ์ด ์ฐ์ฐ์๋ ๋ฏธ๋๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๊ณ ๋๊ธฐ ์ค์ธ ๋ฏธ๋๊ฐ ์๋ฃ๋ ๋๊น์ง ์ธ๋ถ ๋ฏธ๋๊ฐ ์ ์ด๋ฅผ ์๋ณดํ๋๋ก ํฉ๋๋ค.RFC:
std::task
๋ฐ std::future::Future
์์ ํ์ถ์ ๋ฌธ์ :
์์ ํ:
return
ํํ์๊ณผ ์ผ์นํ๋ ์ ํ)์ ์ฌ์ฉํฉ๋๋ค.await expression
๋๋ ๋ค๋ฅธ ๋์ฒด ๊ตฌ๋ฌธ๊ณผ ๋ฌ๋ฆฌ "์ ๋ฏธ์ฌ ์ ๊ตฌ๋ฌธ" expression.await
์
๋๋ค.async
๋ฐ await
ํ์ฌ ์๋ํ๊ธฐ ์ํด TLS์ ์์กดํฉ๋๋ค. ์ด๊ฒ์ ์ค๊ณ์ ์ผ๋ถ๊ฐ ์๋ ๊ตฌํ ๋ฌธ์ ์ด๋ฉฐ ์์ ํ๋ฅผ ์ฐจ๋จํ์ง๋ ์์ง๋ง ๊ฒฐ๊ตญ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์
๋๋ค.async
ํด๋ก์ ๋ฆฌํฐ๋ด์ ๋ํ ์์ ์๋ก์ ์ฌ๊ธฐ์์ ์์ ํ๋์ง ์์์ต๋๋ค. ์๋ช
์ด ์๋ ๋น๋๊ธฐ ํด๋ก์ ๋ฅผ ํตํ ์บก์ฒ ๋ฐ ์ถ์ํ์ ๊ด๋ จํ์ฌ ๋ ๋ง์ ๋์์ธ ์์
์ด ํ์ํฉ๋๋ค.๋น์ฐจ๋จ IO๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ ์ฑ๋ฅ ๋คํธ์ํฌ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ๋ฉฐ, ํ๋ก๋์ ์ฌ์ฉ์์ ์๋นํ ๊ด์ฌ์ ๋ฐ๊ณ ์๋ Rust์ ๋์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋น์ฐจ๋จ IO๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ธ์ฒด ๊ณตํ์ ์ด๊ณ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์๋ฃจ์ ์ ์ค๋ซ๋์ Rust์ ๋ชฉํ์์ต๋๋ค. async/await ๊ธฐ๋ฅ์ ์ด๋ฌํ ๋ ธ๋ ฅ์ ์ ์ ์ ๋๋ค.
1.0 ์ด์ ์๋ Rust๊ฐ ๋น์ฐจ๋จ IO ์์ ๊ตฌ์ถ๋ ๋์์ ์ธ ์ธ์ด ์์ค ์ค๋ ๋ฉ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ ๊ณตํ๋ ๊ทธ๋ฆฐ์ค๋ ๋ฉ ์์คํ ์ด ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์์คํ ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฌ์ฉํ์ง ์๋ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ ์ธ์ด ๋ฐํ์ ๋์ , FFI ์ค๋ฒํค๋์ ํฌ๊ฒ ์ถ๊ฐ, ๊ทธ๋ฆฐ์ค๋ ๋ ์คํ ๊ตฌํ๊ณผ ๊ด๋ จํ์ฌ ๋ช ๊ฐ์ง ์ฃผ์ ๋ฏธํด๊ฒฐ ์ค๊ณ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. .
๊ทธ๋ฆฐ์ค๋ ๋๋ฅผ ์ ๊ฑฐํ ํ Rust ํ๋ก์ ํธ์ ๊ตฌ์ฑ์์ ๋ฏธ๋ ์ถ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋์ฒด ์๋ฃจ์ ์์ ์ ์์ํ์ต๋๋ค. ๋๋๋ก ์ฝ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ future๋ ๋น์ฐจ๋จ IO์ ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ ์ถ์ํ๋ก์ ๋ค๋ฅธ ์ธ์ด์์ ๋งค์ฐ ์ฑ๊ณต์ ์ด์๊ณ ์ฅ๊ธฐ์ ์ผ๋ก ๊ทธ๊ฒ๋ค์ async/await ๊ตฌ๋ฌธ์ ์ ๋งคํ๋์ด ์์ ํ ๋ณด์ด์ง ์๋ ๊ทธ๋ฆฐ์ค๋ ๋ฉ ์์คํ .
Future ์ถ์ํ ๊ฐ๋ฐ์ ์ฃผ์ ๋ํ๊ตฌ๋ ํฌํ ๊ธฐ๋ฐ ์ ๋ฌผ ๋ชจ๋ธ์ ๋์ ์ด์์ต๋๋ค. ๋ค๋ฅธ ์ธ์ด๊ฐ ์ฝ๋ฐฑ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๋ฐ๋ฉด, ๋ฏธ๋ ์์ฒด๋ ์ฝ๋ฐฑ์ด ์๋ฃ๋ ๋ ์คํ๋๋๋ก ์ค์ผ์ค๋งํ๋ ์ฑ ์์ด ์๋ ๋ฐ๋ฉด, Rust๋ ์คํ์๊ฐ ๋ฏธ๋๋ฅผ ์๋ฃ๊น์ง ํด๋งํ๋ ์ฑ ์์ด ์๋ ํด ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. future๋ ์คํ์์๊ฒ Waker ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ๋ก ์งํํ ์ค๋น๊ฐ ๋์์์ ์๋ฆฌ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ด ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ด์ ๋ก ์ ์๋ํ์ต๋๋ค.
(๋ง์ง๋ง ๋ ๊ฐ์ง ์ ์ ๋ํ ์ฌ์ค์ด ์๋ ๋ค๋ฅธ ์ธ์ด์์ ์จ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์์ธ์ด ๋๋ฉฐ ํด๋น ์ธ์ด์์ ๊ธฐ๋๋ฅผ ๋ถ๋ฌ์ผ์ผํค๋ ๊ฒ์ผ๋ก ํ์ธ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์์ฑ์ ๋ชจ๋ ์ค๋ฌธ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ํผํ ์ ์๋ ์์ฑ์ ๋๋ค. ๋ค๋ฅธ ๋ถ๋ช ํ ์ฅ์ ์ด ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ดํดํ๋ฉด ์ ์ตํ ์์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.)
๊ทธ๋ฌ๋ ์ฌ๋ก ์กฐ์ฌ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ฐธ์กฐ์ ์ํธ ์์ฉํ ๋ ์ฌ๊ฐํ ์ธ์ฒด ๊ณตํ์ ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ์๋ณด์ ์ ๋ํ ์ฐธ์กฐ๋ ์์ ํด์ผ ํ์ง๋ง ํด๊ฒฐํ ์ ์๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผฐ์ต๋๋ค. ์ด๋ก ์ธํด ํธ, ๋ฎคํ ์ค ๋ฐ ์ด๋ ํด๋ก์ ๋ก ๊ฐ๋ ์ฐฌ ๋ณต์กํ๊ณ ์ก์์ด ๋ง์ ์ฝ๋๊ฐ ์์ฑ๋์์ผ๋ฉฐ, ์ด ์ค ์ด๋ ๊ฒ๋ ์๊ฒฉํ๊ฒ ํ์ํ์ง ์์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ ์ณ๋๊ณ ๋ ์ธ์ด ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์์ผ๋ฉด ์ฌ์ฉ์๊ฐ ๊ณ ๋๋ก ์ค์ฒฉ๋ ์ฝ๋ฐฑ์ ์์ฑํ๋ ์คํ์ผ๋ก ํจ์ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์ฐ๋ฆฌ๋ yield point์์ ์ฐธ์กฐ์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์ง์ํ๋ async/await ๊ตฌ๋ฌธ ์คํ์ ์ถ๊ตฌํ์ต๋๋ค. ์ง์ํ๊ธฐ์ ์์ ํ yield point์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ง๋๋ Pin
์ถ์ํ๋ฅผ ๋์
ํ ํ, ์ฐ๋ฆฌ๋ ํจ์๋ฅผ ํด ๊ธฐ๋ฐ ํจ์ฒ๋ก ์ปดํ์ผํ๋ ๋ค์ดํฐ๋ธ async/await ๊ตฌ๋ฌธ์ ๊ฐ๋ฐํ์ฌ ์ฌ์ฉ์๊ฐ ๋ค์์ ํตํด ๋น๋๊ธฐ IO์ ์ฑ๋ฅ ์ด์ ์ ์ป์ ์ ์๋๋ก ํ์ต๋๋ค. ํ์ค ๋ช
๋ นํ ์ฝ๋์ ๋งค์ฐ ์ ์ฌํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ ๋ฏธ๋. ๊ทธ ๋ง์ง๋ง ๊ธฐ๋ฅ์ ์ด ์์ ํ ๋ณด๊ณ ์์ ์ฃผ์ ์
๋๋ค.
async
์์ ์async
ํค์๋๋ ๋ค์ ๋ ์์น์ ์ ์ฉํ ์ ์์ต๋๋ค.
_(๋น๋๊ธฐ ํจ์๋ฅผ ์ํ ๋ค๋ฅธ ์์น - ์๋ฅผ ๋ค์ด ํด๋ก์ ๋ฆฌํฐ๋ด ๋ฐ ํน์ฑ ๋ฉ์๋๋ ์์ผ๋ก ๋ ๊ฐ๋ฐ๋๊ณ ์์ ํ๋ ๊ฒ์ ๋๋ค.)_
async ์์ ์๋ ์์ ํ๋ ํญ๋ชฉ์ "๋ฏธ๋๋ก ์ ํ"ํ์ฌ ์กฐ์ ํฉ๋๋ค. ๋ธ๋ก์ ๊ฒฝ์ฐ ๋ธ๋ก์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ๊ฒฐ๊ณผ์ ๋ฏธ๋๋ก ํ๊ฐ๋ฉ๋๋ค. ํจ์์ ๊ฒฝ์ฐ ํด๋น ํจ์์ ๋ํ ํธ์ถ์ ๋ฐํ ๊ฐ์ด ์๋ ๋ฐํ ๊ฐ์ ๋ฏธ๋๋ฅผ ๋ฐํํฉ๋๋ค. async ํ์ ์์ ์ํด ์์ ๋ ํญ๋ชฉ ๋ด๋ถ์ ์ฝ๋๋ฅผ ๋น๋๊ธฐ ์ปจํ ์คํธ์ ์๋ค๊ณ
async ์์ ์๋ ํญ๋ชฉ์ด ๋ฏธ๋์ ์์ํ ์์ฑ์๋ก ํ๊ฐ๋๋๋ก ํ์ฌ ์ด ์์ ์ ์ํํ๊ณ ์ธ์์ ์บก์ฒ๋ฅผ ๋ฏธ๋์ ํ๋๋ก ์ฌ์ฉํฉ๋๋ค. ๊ฐ ๋๊ธฐ ์ง์ ์ ์ด ์ํ ๋จธ์ ์ ๊ฐ๋ณ ๋ณํ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ ๋ฏธ๋์ "ํด๋ง" ๋ฉ์๋๋ ์ต์ข ์ํ์ ๋๋ฌํ ๋๊น์ง ์ฌ์ฉ์๊ฐ ์์ฑํ ์ฝ๋์ ๋ณํ์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฌํ ์ํ๋ฅผ ํตํด ๋ฏธ๋๋ฅผ ์งํํฉ๋๋ค.
async move
์์ ์ํด๋ก์ ์ ์ ์ฌํ๊ฒ ๋น๋๊ธฐ ๋ธ๋ก์ ์ฃผ๋ณ ๋ฒ์์ ๋ณ์๋ฅผ ๋ฏธ๋์ ์ํ๋ก ์บก์ฒํ ์ ์์ต๋๋ค. ํด๋ก์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฌํ ๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐธ์กฐ๋ก ์บก์ฒ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ move
์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ผ๋ก ์บก์ฒํ ์ ์์ต๋๋ค(ํด๋ก์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก). async
๋ move
์์ ์์ ์ด๋ฌํ ๋ธ๋ก์ async move { }
๋ธ๋ก์ผ๋ก ๋ง๋ญ๋๋ค.
await
์ฐ์ฐ์๋น๋๊ธฐ ์ปจํ
์คํธ ๋ด์์ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํํ์์ await
์ฐ์ฐ์์ ๊ฒฐํฉํ์ฌ ์ ํํ์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
expression.await
await ์ฐ์ฐ์๋ ๋น๋๊ธฐ ์ปจํ
์คํธ ๋ด์์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ ์ฉ๋๋ ํํ์์ ์ ํ์ Future
ํน์ฑ์ ๊ตฌํํด์ผ ํฉ๋๋ค. wait ํํ์์ ์ ์ฉ๋๋ ๋ฏธ๋์ ์ถ๋ ฅ ๊ฐ์ผ๋ก ํ๊ฐ๋ฉ๋๋ค.
await ์ฐ์ฐ์๋ ๋น๋๊ธฐ ์ปจํ
์คํธ๊ฐ ์ ์ฉ๋๋ ๋ฏธ๋๊ฐ ์๋ฃ๋ ๋๊น์ง ํ๊ฐ๋๋ ๋ฏธ๋์ ๋ํ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ์ด๋ฅผ ์๋ณดํ๋ ์ด ์์
์ ํ๋ฉด ๊ตฌ๋ฌธ์ผ๋ก ์์ฑํ ์ ์์ง๋ง ๊ฐ๋ฅํ๋ค๋ฉด(์ด ์์์ YIELD_CONTROL!
๊ตฌ๋ฌธ ์ฌ์ฉ) await์ ๋์๊ฐ๋ง์ ๋๋ต ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
loop {
match $future.poll(&waker) {
Poll::Ready(value) => break value,
Poll::Pending => YIELD_CONTROL!,
}
}
์ด๋ ๊ฒ ํ๋ฉด ๋น๋๊ธฐ ์ปจํ
์คํธ์์ ํ๊ฐ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ผ๋ฉฐ Poll::Pending
ํตํด ์ ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ๋น๋๊ธฐ ์ปจํ
์คํธ๋ก, ๊ถ๊ทน์ ์ผ๋ก Future๊ฐ ์์ฑ๋ ์คํ๊ธฐ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์ ๋น๋๊ธฐ ํจ์์ ๋ธ๋ก์ "์ฆ์ ์์ฑ"๋ฉ๋๋ค. ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋น๋๊ธฐ ์ปจํ ์คํธ์ ๋ณธ๋ฌธ์์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด๊ธฐ ์ํ๋ก ๋๋ ์์ ํจ์์ ๋๋ค. ํด๋น ๋ฏธ๋์ ํด๋ง์ ์์ํ ๋๊น์ง ๋ณธ๋ฌธ ์ฝ๋๋ ์คํ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋น๋๊ธฐ ํจ์์ ๋ํ ํธ์ถ์ด ์ฆ์ ์์๋๋๋ก ์๋ํ๋ ๋ค๋ฅธ ๋ง์ ์ธ์ด์ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๋ค๋ฅธ ์ธ์ด์์ ๋น๋๊ธฐ๋ ๋ณธ์ง์ ์ผ๋ก ๋์ ๊ตฌ์ฑ์ ๋๋ค. ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ์์ ๊ณผ ๋์์ ์คํ์ ์์ํ๋๋ก ๋ค๋ฅธ ์์ ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ๊ทธ๋ฌ๋ Rust์์ ์ ๋ฌผ์ ๋ณธ์ง์ ์ผ๋ก ๋์ ์คํ ๋ฐฉ์์ผ๋ก ์คํ๋์ง ์์ต๋๋ค.
๋น๋๊ธฐ ํญ๋ชฉ์ด ์์ฑ๋ ๋ ์์ํ๊ฒ ๋ง๋๋ ๋์ ์ฒซ ๋ฒ์งธ ๋๊ธฐ ์ง์ ๊น์ง ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ ํผ๋์ค๋ฝ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ์ฝ๋๊ฐ ๋ฏธ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋์ ์คํ๋๋์ง ์๋๋ฉด ํด๋ง์ด ์คํ๋๋์ง ์ฌ๋ถ๋ ๋ณธ๋ฌธ์ ์ฒซ ๋ฒ์งธ ๋๊ธฐ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ชจ๋ ์ฝ๋๊ฐ ํด๋ง ์ค์ ์คํ๋๊ณ ๊ตฌ์ฑ ์ค์๋ ์คํ๋์ง ์๋๋ก ํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค.
์ฐธ์กฐ:
๋น๋๊ธฐ ํจ์์ ๊ตฌ๋ฌธ์ "์ธ๋ถ" ๋ฐํ ์ ํ์ด ์๋ "๋ด๋ถ" ๋ฐํ ์ ํ์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ํด๋น ์ ํ์ ๋ฏธ๋๋ฅผ ๋ฐํํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ์ต์ข ์ ์ผ๋ก ํ๊ฐํ ์ ํ์ ๋ฐํํ๋ค๊ณ ๋งํฉ๋๋ค.
ํ ์์ค์์ ์ด๊ฒ์ ์ด๋ค ์ข
๋ฅ์ ๋ช
ํ์ฑ์ด ์ ํธ๋๋์ง์ ๋ํ ๊ฒฐ์ ์
๋๋ค. ์๋ช
์๋ async
์ฃผ์๋ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฏธ๋๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ด ์๋ช
์ ๋ช
์๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ async ํค์๋๋ ์์์ฐจ๋ฆฌ์ง ์๊ณ ๋ ํจ์๊ฐ future๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ํ์ธํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ณด๊ฐ async
ํค์๋๋ก๋ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๋ ์์ฉ๊ตฌ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ฐ๋ฆฌ์๊ฒ ์ค์ ๋ก ๋์์ด ๋ ๊ฒ์ ํ์ ์์ค ๋ฌธ์ ์์ต๋๋ค. ๋ชจ๋ ๋น๋๊ธฐ ํจ์์ "์ธ๋ถ" ๋ฐํ ์ ํ์ impl Future<Output = T>
. ์ฌ๊ธฐ์ T
๋ ๋ด๋ถ ๋ฐํ ์ ํ์
๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฏธ๋๋ ๋ํ ๊ทธ ์์ฒด๋ก ๋ชจ๋ ์
๋ ฅ ์ธ์์ ์๋ช
์ ์บก์ฒํฉ๋๋ค. ์ด๋ ์ง์ ํ์ง ์๋ ํ ์
๋ ฅ ์๋ช
์ ์บก์ฒํ๋ค๊ณ ๊ฐ์ ํ์ง ์๋ impl Trait์ ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ฐ๋์
๋๋ค. ์ฆ, ์ธ๋ถ ๋ฐํ ์ ํ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋น๋๊ธฐ ํจ์๊ฐ ํ์ ์ ๊ฑฐ์ ์ด์ ์ ์ป์ง ๋ชปํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค(์๋ช
์ ๊ฑฐ ๊ท์น์ด ๋น๋๊ธฐ ํจ์ ๋ฐ ๊ธฐํ ํจ์์ ๋ํด ๋ค๋ฅด๊ฒ ์๋ํ๋๋ก ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ํจ์ฌ ๋ ํน์ดํ ๊ฒ์ ํ์ง ์๋ ํ).
์ฐ๋ฆฌ๋ ์ธ๋ถ ๋ฐํ ์ ํ์ด ์ค์ ๋ก ์์ฑํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฅํฉํ๊ณ ์์งํ ํผ๋๋๋์ง๋ฅผ ๊ฐ์ํ ๋ ์ฌ์ฉ์๊ฐ ์์ฑํ๋๋ก ์๊ตฌํ๋ ๋ฏธ๋๋ฅผ ๋ฐํํ๋ค๋ ์ถ๊ฐ ์ ํธ๋ฅผ ๋ณด๋ผ ๊ฐ์น๊ฐ ์๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค.
๋น๋๊ธฐ ์ปจํ ์คํธ์์ ์๋ฉธ์์ ์์๋ ๋น๋๊ธฐ ์ปจํ ์คํธ์์์ ๋์ผํฉ๋๋ค. ์ ํํ ๊ท์น์ ์ฌ๊ธฐ์์ ์ฝ๊ฐ ๋ณต์กํ๊ณ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์๋ฉธ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ฌ์ฉ ํ ์ ๋ฆฌ๋ ๋๊น์ง ์ผ์ ์๊ฐ ๋์ ๊ณ์ ์กด์ฌํจ์ ์๋ฏธํฉ๋๋ค. ํด๋น ์๊ฐ์ await ๋ฌธ์ด ํฌํจ๋ ๊ฒฝ์ฐ ํด๋น ํญ๋ชฉ์ ์๋ฉธ์๊ฐ ์ ์ ํ ์๊ฐ์ ์คํ๋ ์ ์๋๋ก ๋ฏธ๋ ์ํ์์ ๋ณด์กด๋์ด์ผ ํฉ๋๋ค.
๋ฏธ๋ ์ํ์ ํฌ๊ธฐ์ ๋ํ ์ต์ ํ๋ก ์๋ฉธ์๋ฅผ ์ผ๋ถ ๋๋ ๋ชจ๋ ์ปจํ ์คํธ์์ ๋ ์ผ์ฐ ์ฌ์ ๋ ฌํ ์ ์์ต๋๋ค(์: ์ฌ์ฉํ์ง ์๋ ํจ์ ์ธ์๋ ๋ฏธ๋ ์ํ์ ์ ์ฅ๋๋ ๋์ ์ฆ์ ์ญ์ ๋ ์ ์์). ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์๋ฉธ์์ ์์๋ ์ฌ์ฉ์์๊ฒ ๋ณต์กํ๊ณ ํผ๋์ค๋ฌ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฉฐ ๋๋ก๋ ํ๋ก๊ทธ๋จ ์๋ฏธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ ์๋ฉธ์ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ด ์ต์ ํ๋ฅผ ํฌ๊ธฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ชจ๋ async ๋ฐ await ํค์๋๊ฐ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ ๋์ผํ ์๋ฉธ์ ์์๊ฐ ์ง์ ๋ฉ๋๋ค.
(์ธ์ ๊ฐ ์ฐ๋ฆฌ๋ ์๋ฉธ์๋ฅผ ์์ํ๊ณ ์ฌ์ ๋ ฌ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ถ๊ตฌํ๋ ๋ฐ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ async/await์ ๊ด๋ จ์ด ์๋ ๋ฏธ๋ ๋์์ธ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค.)
์ฐธ์กฐ:
๋ค๋ฅธ ์ธ์ด์ async/await ๊ธฐ๋ฅ๊ณผ์ ์ฃผ์ ์ฐจ์ด์ ์ค ํ๋๋ await ์ฐ์ฐ์์ ๊ตฌ๋ฌธ์ ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ Rust๋ฅผ ๋์์ธํ๋ฉด์ ๋ด๋ฆฐ ๊ทธ ์ด๋ค ๊ฒฐ์ ๋ณด๋ค๋ ๋ง์ ํ ๋ก ์ ์ฃผ์ ์์ต๋๋ค.
2015๋
๋ถํฐ Rust๋ ์ธ์ฒด ๊ณตํ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ๋ฏธ์ฌ ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. 1.0 ์ด์ ๋ถํฐ Rust๋ ํ๋ ์ก์ธ์ค ๋ฐ ๋ฉ์๋ ํธ์ถ์ ์ํ ์ ๋ฏธ์ฌ .
์ฐ์ฐ์๋ ์์์ต๋๋ค. ์ ๋ฌผ์ ํต์ฌ ์ฌ์ฉ ์ฌ๋ก๋ ์ผ์ข
์ IO๋ฅผ ์ํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค์์ ์ ๋ฌผ์ ์ผ๋ถ๊ฐ ํฌํจ๋ Result
๋ก ํ๊ฐ๋ฉ๋๋ค.
์ผ์ข
์ ์ค๋ฅ. ์ด๊ฒ์ ์ค์ ๋ก ๊ฑฐ์ ๋ชจ๋ ๋๊ธฐ ์์
์ด ?
๋๋ ๊ทธ ์ดํ์ ๋ฉ์๋ ํธ์ถ๋ก ์์๊ฐ ์ง์ ๋จ์ ์๋ฏธํฉ๋๋ค. ์ ๋์ฌ์ ํ์ ์ฐ์ฐ์์ ๋ํ ํ์ค ์ฐ์ ์์๋ฅผ ๊ฐ์ํ ๋ ๊ฑฐ์ ๋ชจ๋ await ์ฐ์ฐ์๊ฐ (await future)?
์์ฑ๋๋๋ก ํ์ ๊ฒ์
๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ๋งค์ฐ ๋น์ธ๊ฐ์ ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ?
๋ฐ .
์ฐ์ฐ์์ ๋งค์ฐ ์ ์กฐํฉ๋๋ ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ค์ํ ๊ตฌ๋ฌธ ์ต์
์ ๊ณ ๋ คํ ํ .
์ฐ์ฐ์์ await ํค์๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ฐธ์กฐ:
Rust๋ ๋จ์ผ ์ค๋ ๋์์ ์คํ๋๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ์ฌ๋๋ค์๊ฒ ๋น์ฉ์ ๋ถ๊ณผํ์ง ์๊ณ ๋์ ๋ฐ ๋ณ๋ ฌ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋จ์ผ ์ค๋ ๋ ์คํ๊ธฐ์ ๋ค์ค ์ค๋ ๋ ์คํ๊ธฐ ๋ชจ๋์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์คํํ ์ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๋ ์ฌ์ฉ ์ฌ๋ก์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ฉํฐ์ค๋ ๋ ์คํ๊ธฐ๋ Send
์์ฑํ ์ ์๋ ํจ์ฒ๋ฅผ ๋ฐ์ธ๋ฉํ๊ณ ๋จ์ผ ์ค๋ ๋ ์คํ๊ธฐ๋ ๋ฐ์ธ๋ฉํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
impl Trait
๊ตฌ๋ฌธ์ ๊ธฐ์กด ๋์๊ณผ ์ ์ฌํ๊ฒ ๋น๋๊ธฐ ํจ์๋ ๋ฐํํ๋ ๋ฏธ๋์ ์๋ ํน์ฑ์ "๋์ถ"ํฉ๋๋ค. ์ฆ, ์ธ๋ถ ๋ฐํ ์ ํ์ด ๋ฏธ๋์์ ๊ด์ฐฐํ๋ ๊ฒ ์ธ์๋ ํธ์ถ์๋ ๋ณธ๋ฌธ ๊ฒ์ฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์ ํ์ด Send์ธ์ง ๋๋ Sync์ธ์ง ๊ด์ฐฐํ ์๋ ์์ต๋๋ค. ์ด๋ async fn์ ๋ฐํ ์ ํ์ด ๋ค์ค ์ค๋ ๋ ์คํ๊ธฐ์ ์์ฝ๋ ๋ ์ด๊ฒ์ด ์์ ํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ์ด ๋ฐ๋์ Send์ผ ํ์ ๋ ์์ผ๋ฏ๋ก ๋จ์ผ ์ค๋ ๋ ์คํ๊ธฐ์ ์ฌ์ฉ์๋ ๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ณธ์ ํ์ฉํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ๊ธฐ๋ฅ์ ๋ฉ์๋๋ก ํ์ฅํ๋ฉด ์ ๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ฐ๋ ค๋ ์์์ง๋ง, ๋ ผ์ ๋์ ์ํฉ์ด ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒฐ๋ก ์ด ๋์๋ค.
์ฐธ์กฐ:
๋ฌธ์ : #52924
์ํ ๋จธ์ ์ ๋ํ ๋น๋๊ธฐ ๋ณํ์ด ํ์ฌ ๊ตฌํ๋๋ ๋ฐฉ์์ ์ต์ ์ด ์๋๋ฏ๋ก ์ํ๊ฐ ํ์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ์ปค์ง๋๋ค. ์ํ ํฌ๊ธฐ๊ฐ ์ค์ ๋ก ์ด์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ํ ํฌ๊ธฐ๊ฐ ์ผ๋ฐ ์์คํ ์ค๋ ๋์ ํฌ๊ธฐ๋ณด๋ค ์ปค์ง ๋ ์ค์ ์คํ์์ ์คํ ์ค๋ฒํ๋ก๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ํฌ๊ธฐ๊ฐ ๋ ํฉ๋ฆฌ์ ์ด๋๋ก ์ด codegen์ ๊ฐ์ ํ๋ ๊ฒ์ ์ ์ด๋ ์ ์์ ์ธ ์ฌ์ฉ์์ ์คํ ์ค๋ฒํ๋ก๋ฅผ ์ผ์ผํฌ ๋งํผ ๋์์ง๋ ์์ต๋๋ค. ์ด๋ ์ฐจ๋จ ๋ฒ๊ทธ ์์ ์ ๋๋ค.
๋ฌธ์ : #56238
๋น๋๊ธฐ ํจ์๋ ์๋ช
์ ์ฌ๋ฌ ์๋ช
์ ๊ฐ์ง ์ ์์ด์ผ ํ๋ฉฐ ๋ชจ๋ ์๋ช
์ ํธ์ถ๋ ๋ ํจ์๊ฐ ํ๊ฐ๋๋ ๋ฏธ๋์ "์บก์ฒ"๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ์ปดํ์ผ๋ฌ ๋ด์์ impl Future
๋ฎ์ถ๋ ๊ฒ์ ๋ค์ค ์
๋ ฅ ์๋ช
์ ์ง์ํ์ง ์์ต๋๋ค. ๋ง๋ค๊ธฐ ์ํด ๋ ๊น์ ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค.
์ด ์ผ. ์ฌ์ฉ์๋ ์ฌ๋ฌ ์
๋ ฅ ์๋ช
(์๋ง๋ ๋ชจ๋ ์๋ต๋จ)์ผ๋ก ํจ์๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ์ฐจ๋จ ๋ฒ๊ทธ ์์ ์
๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ์ด๊ธฐ ๋ฒ์ ์ async/await๋ฅผ ์ถ์ํ๋ ์ฆ์ ์์ ์ ์์ํ๋ ค๋ MVP์ ๋ํ ์๋ ค์ง ๋งค์ฐ ๋์ ์ฐ์ ์์ ํ์ฅ์ ๋๋ค.
์ด๊ธฐ RFC์์๋ ํด๋ก์ ๋ฆฌํฐ๋ด์ ๋ํ ์์ ์๋ก async ์์ ์๋ฅผ ์ง์ํ์ฌ ์ต๋ช ์ ๋น๋๊ธฐ ํจ์๋ฅผ ์์ฑํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ ํํ๊ธฐ ์ ์ ํด๊ฒฐํด์ผ ํ ์ค๊ณ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ๋ง์ต๋๋ค.
await ์ฐ์ฐ์์ ํ์ฌ ๊ตฌํ์์๋ TLS๊ฐ ๋ด๋ถ ๋ฏธ๋๋ฅผ ํด๋งํ ๋ ๊นจ์ฐ๊ธฐ๋ฅผ ์๋์ชฝ์ผ๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ TLS๋ฅผ ์ฌ์ฉํ๋ ์์คํ ์์ ๊ตฌ๋ฌธ์ด ์๋ํ๋๋ก ํ๋ "ํดํน"์ ๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ด๋ฌํ TLS ์ฌ์ฉ์ ์ฝ์ํ ์๊ฐ์ด ์์ผ๋ฉฐ ๊นจ์ฐ๊ธฐ๋ฅผ ์ผ๋ฐ ํจ์ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ํ ๋จธ์ ์์ฑ ์ฝ๋๋ฅผ ๋ ๋ง์ด ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
์ด ๋ณ๊ฒฝ์ ๊ตฌํํ๋ ๊ฒ์ ์ฐจ๋จํ์ง๋ ์์ง๋ง TLS ์ง์์ด ์๋ ์์คํ ์์ async/await ์ฌ์ฉ์ ๋ฐฉ์งํ๋ฏ๋ก ์ฐ์ ์์๊ฐ ๋์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. ์ด๊ฒ์ ์์ํ ๊ตฌํ ๋ฌธ์ ์ ๋๋ค. ์์คํ ์ค๊ณ์ ์ด๋ค ๊ฒ๋ TLS ์ฌ์ฉ์ ์๊ตฌ ํ์ง ์์ต๋๋ค.
ํ์ฌ ํน์ฑ์์ ๋น๋๊ธฐ ๊ด๋ จ ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. fn
๋ ์ธ ์ ์์ง๋ง async fn
๋ ์ธ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ๋ฉ์๋๋ ๋ถ๋ช
ํ ๊ฐ๋ ฅํ ์ถ์ํ์ด๋ฉฐ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ง์ํ๊ณ ์ ํฉ๋๋ค.
๋น๋๊ธฐ ๋ฉ์๋๋ ๊ธฐ๋ฅ์ ์ผ๋ก ๋ฏธ๋๋ฅผ ๊ตฌํํ๋ ์ฐ๊ฒฐ๋ ํ์์ ๋ฐํํ๋ ๋ฉ์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ฐ ๋น๋๊ธฐ ๋ฉ์๋๋ ํด๋น ๋ฉ์๋๊ฐ ๋ณํ๋๋ ์ํ ์์คํ ์ ๋ํด ๊ณ ์ ํ ๋ฏธ๋ ์ ํ์ ์์ฑํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ๋ฏธ๋๋ ๋ชจ๋ ์ ๋ ฅ์ ์บก์ฒํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ ๋ ฅ ์๋ช ๋๋ ์ ํ ๋งค๊ฐ๋ณ์๋ ํด๋น ์ํ์์ ์บก์ฒํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ค๋ซ๋์ ์ํ์ง๋ง ์์ง ์ ๋๋ก ๊ตฌํ๋์ง ์์ ๊ธฐ๋ฅ์ธ ์ผ๋ฐ ๊ด๋ จ ์ ํ ์ด๋ผ๋ ๊ฐ๋ ๊ณผ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ ๋ฉ์๋์ ํ์ธ์ ์ ๋ค๋ฆญ ๊ด๋ จ ํ์์ ํ์ธ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค.
๋ฐ์ด๋ ๋์์ธ ๋ฌธ์ ๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์๋ช ์ ๊ฐ์ง ๋ฏธ๋ ์ ํ์ ๋ฐํํ๋ ๋ฉ์๋์ ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ๊ตํํ ์ ์์ต๋๊น? ๋ํ, ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ ์ดํธ๋ฅผ ์ถ์ํํ ๋ ์ผ๋ถ ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ฐํ๋ ํจ์ฒ๊ฐ ์๋ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋๋ก ์๊ตฌํด์ผ ํ ์ ์์ผ๋ฏ๋ก ๋น๋๊ธฐ ๋ฉ์๋๋ ์๋ ํน์ฑ๊ณผ ๊ด๋ จ๋ ์ถ๊ฐ ๋ฌธ์ ๋ฅผ ๋ํ๋ ๋๋ค.
์ด ์ต์ํ์ ์ง์๋ง ์์ผ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ "๊ฐ์ฒด๋ก๋ถํฐ ์์ ํ๊ฒ" ๋ง๋๋ ๊ฐ๋ฅ์ฑ๊ณผ ๊ฐ์ ํฅํ ํ์ฅ์ ๋ํ ๋ค๋ฅธ ์ค๊ณ ๊ณ ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
๋์ผํ ์ฝ๋ฃจํด ์ํ ๋จธ์ ๋ณํ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์์ฑํ๊ณ ์ํ ๋จธ์ ์ผ๋ก ๋ณํํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ์์ ํ ์์ฑ๊ธฐ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ฐ์ฅ ๋ถ๋ช
ํ ์ฌ์ฉ ์ฌ๋ก๋ ๋น๋๊ธฐ ํจ์๊ฐ ๋ค์์ผ๋ก ์ปดํ์ผ๋๋ ๊ฒ์ฒ๋ผ "๋ฐ๋ณต์"๋ก ์ปดํ์ผ๋๋ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค.
์ ๋ฌผ. ์ ์ฌํ๊ฒ, ์ฐ๋ฆฌ๋ ์ด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ตฌ์ฑํ์ฌ ๋น๋๊ธฐ ์์ฑ๊ธฐ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฆ, "์คํธ๋ฆผ"์ผ๋ก ์ปดํ์ผ๋๋ ํจ์(๋ฐ๋ณต์์ ๋์ผํ ๋น๋๊ธฐ)์
๋๋ค. ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์๋ ์ด์ ๋ํ ์ ๋ง ๋ช
ํํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์ข
์ข
์์คํ
๊ฐ์ ์ ์ก๋๋ ๋ฉ์์ง ์คํธ๋ฆผ์ ํฌํจํฉ๋๋ค.
์์ฑ๊ธฐ๋ ๊ฐ๋ฅํ ๋ง์ ์ต์ ์ด ์๋ ๋งค์ฐ ์ ์ฐํ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐฉํ ์ค๊ณ ์ง๋ฌธ์ด ์์ต๋๋ค. ๊ตฌ๋ฌธ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API ์ธก๋ฉด์์ Rust์ ์์ฑ๊ธฐ์ ๋ํ ์ต์ข ๋์์ธ์ ์์ง ๊ณต๊ฐ๋์ง ์์ ์ํ์ด๋ฉฐ ๋ถํ์คํฉ๋๋ค.
@rfcbot fcp ๋ณํฉ
ํ์ @withoutboats ๊ฐ ์ด๋ฅผ ๋ณํฉํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๊ทธ๊ฐ ์ง์ ๋ ๋๋จธ์ง ํ์์ด ๊ฒํ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ ค ์ฌํญ:
๊ณผ๋ฐ์์ ๊ฒํ ์๊ฐ ์น์ธํ๋ฉด(์ต๋ 2๊ฐ์ ์น์ธ์ด ๋ฏธ๊ฒฐ ์ํ์) ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์ ์ด๋ ์์ ์์๋ ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ๊ฐ ์ง์ ๋ ํ ๊ตฌ์ฑ์์ด ๋์๊ฒ ์ค ์ ์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
(์ ๋ฆฌํฌํธ์ ๊ธฐ์กด ์ฐจ๋จ์ ๋ง ๋ฑ๋กํ๋ฉด ๋ฏธ๋๋ฌ์ง์ง ์์ต๋๋ค)
@rfcbot ์ฐ๋ ค ๊ตฌํ-์์ -์ฐจ๋จ-์์ ํ
ํ์์ด ...์ด๋ฅผ ๋ณํฉ ํ๋๋ก ์ ์ํ์ต๋๋ค.
์ด๋ป๊ฒ Github ์ด์๋ฅผ ๋ณํฉํ ์ ์์ต๋๊น(ํ ๋ฆฌํ์คํธ๊ฐ ์๋)?
@vi ๋ด์ ์ฝ๊ฐ
์์ฐ, ์ข ํฉ์ ์ธ ์์ฝ ๊ฐ์ฌํฉ๋๋ค! ๋๋ ๋จ์ง ์ ์ ์ ์ผ๋ก ๋ฐ๋์ง๋ง ๋น์ ์ด ๋ชจ๋ ๊ฒ์ ์ ์์ ์๋ค๊ณ ์์ ํ ํ์ ํฉ๋๋ค.
@rfcbot์ด ๊ฒํ ํ์ต๋๋ค.
์์ ํ ์ฐจ๋จ๊ธฐ์ "AsyncAwait-Unclear ๋ฌธ์ ๋ถ๋ฅ"๋ฅผ ๋ช ์์ ์ผ๋ก ์ถ๊ฐ(๋ฐ/๋๋ ์ด์ ๋ํ ์ฐ๋ ค ๋ฑ๋ก)ํ ์ ์์ต๋๊น?
๋๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ https://github.com/rust-lang/rust/issues/60414 ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ(๋ถ๋ช ํ ๋ด ๋ฒ๊ทธ์ ๋๋ค. p), ์ ์ด๋ ์์ ํ ์ ์ ๋ช ์์ ์ผ๋ก ์ฐ๊ธฐํ๊ณ ์ถ์ต๋๋ค. :)
Rust ํ์ด ์ด ๊ธฐ๋ฅ์ ์์ ๋ ธ๋ ฅ์ ๋ํด ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฌ๋ฅผ ํํ๊ณ ์ถ์ต๋๋ค! ๋ง์ ์ค๊ณ, ํ ๋ก , ์์ฌ์ํต์ ๋จ์ ์ด ์์์ง๋ง ์ ์ด๋ ์ ์ ๋ง์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด ๋ชจ๋ ๊ฒ์ ํตํด ์ฐ๋ฆฌ๊ฐ Rust๋ฅผ ์ํ ์ต์์ ์๋ฃจ์ ์ ์ฐพ์๋ค๊ณ ํ์ ํฉ๋๋ค. :๋ฐ๋ค:
(์ฆ, ๋ฏธ๋ ๊ฐ๋ฅ์ฑ์์ ์๋ฃ ๊ธฐ๋ฐ ๋ฐ ๋น๋๊ธฐ ์ทจ์ ์์คํ
API์ ๋ํ ๋ธ๋ฆฌ์ง ๋ฌธ์ ์ ๋ํ ์ธ๊ธ์ ๋ณด๊ณ ์ถ์ต๋๋ค. TL;DR ์ฌ์ ํ ์์ ๋ฒํผ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ์ด์ง๋ง ํ๋ ์ธ๊ธํ๋ฉด์.)
๋ํ ์์ฑ ๊ธฐ๋ฐ API์ ๋ฌธ์ ์ ๋ํ ์ธ๊ธ์ ๋ณด๊ณ ์ถ์ต๋๋ค. (์ปจํ
์คํธ๋ ์ด ๋ด๋ถ ์ค๋ ๋ ์ฐธ์กฐ) IOCP ๋ฐ io_uring
๋์
์ ๊ณ ๋ คํ ๋ Linux์์ The Way for async IO๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช
ํํ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. IIUC ๊ฐ์์ ๋น๋๊ธฐ ๋๋กญ ์์ด๋์ด๋ ์์ ํ๊ฒ ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ์์ ๋ฒํผ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋ ํธ๋ฆฌํ๊ณ ์ ์ฌ์ ์ผ๋ก ์ฑ๋ฅ์ด ๋จ์ด์ง ๊ฒ์
๋๋ค(์: ๋ ๋์ ์ง์ญ ๋๋ ์ถ๊ฐ ๋ณต์ฌ๋ณธ์ผ๋ก ์ธํด).
@newpavlov ๋๋ Fuchsia์ ๋ํด ๋น์ทํ ๊ฒ์ ๊ตฌํํ์ผ๋ฉฐ ๋น๋๊ธฐ ๋๋กญ ์์ด ์์ ํ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ์ํํ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฆฌ์์ค๋ฅผ ํ๋ํ ๋ ์ด์ ๋ฆฌ์์ค์์ ์ผ๋ถ ์ ๋ฆฌ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ฆฌ์์ค ํ๋ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ํ์ฌ futures API๋ ํ๋ก๋์ ์์คํ ์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๊ณ ์ฌ์ฉ๋์ด ์์ต๋๋ค.
๋ค๋ง, ์ด ๋ฌธ์ ๋ ์ด๋ฏธ ์์ ํ๋ futures API ์ค๊ณ์ ์ง๊ตํ๋ async/await์ ์์ ํ์ ๊ดํ ๊ฒ์ด๋ค. ์ถ๊ฐ ์ง๋ฌธ์ ํ๊ฑฐ๋ future-rs repo์ ๋ํ ํ ๋ก ์ ์ํด ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
@Ekleog
์์ ํ ์ฐจ๋จ๊ธฐ์ "AsyncAwait-Unclear ๋ฌธ์ ๋ถ๋ฅ"๋ฅผ ๋ช ์์ ์ผ๋ก ์ถ๊ฐ(๋ฐ/๋๋ ์ด์ ๋ํ ์ฐ๋ ค ๋ฑ๋ก)ํ ์ ์์ต๋๊น?
๋ค, ๋งค์ฃผ ํ๊ณ ์๋ ์ผ์
๋๋ค. ํด๋น ํน์ ๋ฌธ์ (#60414)๋ฅผ WRTํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๊ณ ์์ ๋์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ํนํ -> impl Trait
์์ ์ด๋ฏธ ๊ด์ฐฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ๋ฅผ ์ฐจ๋จํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์์ง ๊ฒฐ์ ํ ์ ์์์ต๋๋ค
@cramertj ๊ฐ์ฌํฉ๋๋ค! #60414 ์ ๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก "์ง๊ธ ์ค๋ฅ๊ฐ ์ ๋ง ๋นจ๋ฆฌ ๋ฐ์ํ ์ ์์ต๋๋ค"๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ฉด -> impl Trait
๊ฒฝ์ฐ ์ด์ ์๋ ์๋ฌด๋ ๋์น์ฑ์ง ๋ชปํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด์จ๋ ์ง์ฐ๋๋ฉด ๊ด์ฐฎ์ต๋๋ค. ์ผ๋ถ ๋ฌธ์ ํด์ผ ํ ๊ฒ์
๋๋ค :) (FWIW ํ ๊ณณ์์ ()
์ ๋ค๋ฅธ ๊ณณ์์ T::Assoc
๋ฅผ ๋ชจ๋ ๋ฐํํ๋ ํจ์์ ์์ฐ ์ฝ๋์์ ๋ฐ์ํ์ฌ IIRC์์ ์ปดํ์ผํ ์ ์์์ต๋๋ค. #60414๋ฅผ ์ฐ ์ดํ๋ก ์ฝ๋๋ฅผ ํ์ธํ์ง ์์์ผ๋ฏ๋ก ์๋ง๋ ๋ด ๊ธฐ์ต์ด ํ๋ฆด ์ ์์ต๋๋ค)
@Ekleog ๋ค ์ดํด๊ฐ ๋ฉ๋๋ค! ๋๋ ๊ทธ๊ฒ์ด ๊ณ ํต์ค๋ฌ์ด ์ด์ ๋ฅผ ํ์คํ ์ ์ ์์ต๋๋ค. ํน์ ๋ฌธ์ ์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ธฐ ์ํด zulip ์คํธ๋ฆผ ์ ๋ง๋ค์์ต๋๋ค.
ํธ์ง: ์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์. 1.38
๋ชฉํ๋ฅผ ๋์ณค์ต๋๋ค.
@cramertj
์ด๋ฅผ ์ํํ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฆฌ์์ค๋ฅผ ํ๋ํ ๋ ์ด์ ๋ฆฌ์์ค์์ ์ผ๋ถ ์ ๋ฆฌ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ฆฌ์์ค ํ๋ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
๋ฒํผ๋ฅผ ๋ฏธ๋ ์ํ์ ์ผ๋ถ๋ก ์ ์งํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ ํจ์จ์ ์ด์ง ์์ต๋๊น? ๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ํ์ฌ ๋์์ธ์ด ๋น์ฉ์ด ์ ํ ๋ค์ง ์๊ณ ( async
์ถ์ํ๋ฅผ ์ญ์ ํ์ฌ ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์๋ฏธ์์) ์์ฑ ๊ธฐ๋ฐ API์์ ์ธ์ฒด ๊ณตํ์ ์ด์ง ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ๊ณ ์น ๋ช
ํํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฑํ ๋ฝ๋ผ ์ ๋๋ ์๋์ง๋ง, ๊ทธ๋ฐ ๋์์ธ์ ๋ฏธ๋นํจ์ ์์ง ์๊ณ OP์์ ์ธ๊ธํด๋ฌ๋ผ๋ ์์ฒญ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@๊ณต์
๋ฌผ๋ก lang ํ์ ์ด๊ฒ์ ๋๋ณด๋ค ๋ ์ ํ๋จํ ์ ์์ง๋ง ์์ ์ ์ธ ๊ตฌํ์ ์ํด
1.38
๋ก ์ฐ๊ธฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค.
์ด ๋ฌธ์ ๋ 1.38์ ๋์์ผ๋ก ํฉ๋๋ค. ์ค๋ช ์ ์ฒซ ๋ฒ์งธ ์ค์ ์ฐธ์กฐํ์ญ์์ค.
@huxi ๊ฐ์ฌํฉ๋๋ค, ๋๋ ๊ทธ๊ฒ์ ๋์ณค์ต๋๋ค. ๋ด ๋๊ธ์ ์์ ํ์ต๋๋ค.
@newpavlov
๋ฒํผ๋ฅผ ๋ฏธ๋ ์ํ์ ์ผ๋ถ๋ก ์ ์งํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ ํจ์จ์ ์ด์ง ์์ต๋๊น? ๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ํ์ฌ ๋์์ธ์ด ๋น์ฉ์ด ์ ํ ๋ค์ง ์๊ณ (๋น๋๊ธฐ ์ถ์ํ๋ฅผ ์ญ์ ํ์ฌ ๋ณด๋ค ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์๋ฏธ์์) ์์ฑ ๊ธฐ๋ฐ API์์ ์ธ์ฒด๊ณตํ์ ์ด์ง ์๊ณ ์์ ์ ์ํ ๋ช ํํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ. ๋ฑํ ๋ฝ๋ผ ์ ๋๋ ์๋์ง๋ง, ๊ทธ๋ฐ ๋์์ธ์ ๋ฏธ๋นํจ์ ์์ง ์๊ณ OP์์ ์ธ๊ธํด๋ฌ๋ผ๋ ์์ฒญ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋์, ๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋์ง๋ง ๋น๋๊ธฐ/๋๊ธฐ์ ์์ ํ์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ ผ์๋ฅผ ๋ณ๋์ ์ค๋ ๋์ ์๋ ๋ฌธ์ ๋ก ์ฎ๊ธฐ๊ฒ ์ต๋๋ค.
(์ฆ, ๋ฏธ๋ ๊ฐ๋ฅ์ฑ์์ ์๋ฃ ๊ธฐ๋ฐ ๋ฐ ๋น๋๊ธฐ ์ทจ์ ์์คํ API์ ๋ํ ๋ธ๋ฆฌ์ง ๋ฌธ์ ์ ๋ํ ์ธ๊ธ์ ๋ณด๊ณ ์ถ์ต๋๋ค. TL;DR ์ฌ์ ํ ์์ ๋ฒํผ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ์ด์ง๋ง ํ๋ ์ธ๊ธํ๋ฉด์.)
๋ํ ์์ฑ ๊ธฐ๋ฐ API์ ๋ฌธ์ ์ ๋ํ ์ธ๊ธ์ ๋ณด๊ณ ์ถ์ต๋๋ค. (์ปจํ ์คํธ๋ ์ด ๋ด๋ถ ์ค๋ ๋ ์ฐธ์กฐ) IOCP ๋ฐ Linux์์ ๋น๋๊ธฐ IO๋ฅผ ์ํ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ io_uring์ ๋์ ์ ๊ณ ๋ คํ ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ช ํํ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ฌธ์ ๊ณต๊ฐ์์ API ์ค๊ณ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ด ์ฃผ์ ์์ ๋ฒ์ด๋๋ค๋ Taylor์ ์๊ฒฌ์ ๋์ํ์ง๋ง ๋น๋๊ธฐ/๋๊ธฐ ์์ ํ์ ๊ด๋ จ๋ ์ด๋ฌํ ์ฃผ์(๋ฐ ์ผ๋ฐ์ ์ผ๋ก io_uring์ ๋ํ ์ด ๋ ผ์)์ ํ ๊ฐ์ง ํน์ ์ธก๋ฉด์ ๋ค๋ฃจ๊ณ ์ถ์ต๋๋ค. ํ์ด๋ฐ.
io_uring์ 2019 ๋ ์ฌํด Linux์ ์ถ์๋ ์ธํฐํ์ด์ค์ ๋๋ค. Rust ํ๋ก์ ํธ๋ 4๋ ์ ์ธ 2015๋ ๋ถํฐ ๋ฏธ๋ ์ถ์ํ ์์ ์ ํด์์ต๋๋ค. ์์ฑ ๊ธฐ๋ฐ API์ ๊ธฐ๋ฐํ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ์ ํธํ๋ ๊ทผ๋ณธ์ ์ธ ์ ํ์ 2015๋ ๊ณผ 2016๋ ์ ๋ฐ์ํ์ต๋๋ค. 2015๋ RustCamp์์ Carl Lerche๋ ๊ธฐ๋ณธ IO ์ถ์ํ์ธ mio์์ ์ ๊ทธ๋ฐ ์ ํ์ ํ๋์ง ์ด์ผ๊ธฐํ์ต๋๋ค. 2016๋ ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ Aaron Turon์ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์์ฑํ ๋์ ์ด์ ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ์ด๋ฌํ ๊ฒฐ์ ์ ์ค๋์ ์ ๋ด๋ ค์ง ๊ฒ์ด๋ฉฐ ๊ทธ๊ฒ๋ค์ด ์์๋ค๋ฉด ์ง๊ธ์ ์์ ์ ๋๋ฌํ ์ ์์์ ๊ฒ์ ๋๋ค.
๊ธฐ๋ณธ ๋ฏธ๋ ๋ชจ๋ธ์ ์ฌ๊ฒํ ํด์ผ ํ๋ค๋ ์ ์์ 3~4๋ ์ ์ํ๋ก ๋์๊ฐ์ ๊ทธ ์์ ์์ ๋ค์ ์์ํด์ผ ํ๋ค๋ ์ ์์ ๋๋ค. Aaron์ด ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋ ๋์ ์์ค์ ๊ธฐ๋ณธ ์์์ ๋ํ ์ค๋ฒํค๋๋ฅผ ๋์ ํ์ง ์๊ณ ์ด๋ค ์ข ๋ฅ์ ์ถ์ํ๊ฐ ์๋ฃ ๊ธฐ๋ฐ IO ๋ชจ๋ธ์ ๋ค๋ฃฐ ์ ์์ต๋๊น? ์ฌ์ฉ์๊ฐ async/await ๋ฐฉ์์ผ๋ก "์ผ๋ฐ Rust + ์ฌ์ํ ์ฃผ์"์ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ตฌ๋ฌธ์ ํด๋น ๋ชจ๋ธ์ ์ด๋ป๊ฒ ๋งคํํ ๊น์? ํ์ด ์๋ ์ํ ๋จธ์ ์ ๋ํด ์ํํ ๊ฒ์ฒ๋ผ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ํตํฉํ๋ ๊ฒ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๊น? ์ด๋ฌํ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์ ๊ณตํ๋ ๊ฒ์ ์ด ์ค๋ ๋์ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค. ์์ ์ ๊ทธ๋ค์๊ฒ ๋๋ตํ๊ณ ์ ๋ต์ ์ฆ๋ช ํ๋ ๊ฒ์ด ์ผ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ๊น์ง ์๋ก ๋ค๋ฅธ ๊ธฐ์ฌ์๋ค ์ฌ์ด์ ๊ฒฌ๊ณ ํ 10๋ ์ ๋ ธ๋๋ ฅ์ ํด๋นํ๋ ๊ฒ์ ๋ค์ ๋ค์ ์ํ๋์ด์ผ ํ ๊ฒ์ ๋๋ค.
๋ น์ ๋ชฉํ๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์์๋ ์ ํ, ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํด์ผํ๋ ์๋จ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ด๋ ์ ํฐ ์ผ์ด ๋ ์ ์๋ ๋ฏธ๋๋ฅผ ๋ด๋ค๋ณด๊ณ ์ด๋ฅผ ํตํฉํ๊ธฐ ์ํด ์ค๊ณ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ๊ธฐ ์ํด ํญ์ ๋ฉ์ถ ์๋ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์ฒํ ์ํฉ์ ๋ฐ๋ผ ์ต์ ์ ๋คํฉ๋๋ค. ๋ถ๋ช ํ ํฐ ์ผ์ ๊ฐ์ ํ ๋์น ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด ๋ค๊ฒ ํ๋ ๊ฒ์ ์ค๋ง์ค๋ฌ์ธ ์ ์์ง๋ง, ํ์ฌ๋ก์๋ ์ต์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ์ ์ฒด ๋ณด๊ธฐ๋ ์์ต๋๋ค. io_uring์ ์ฒ๋ฆฌํ๊ธฐ ์ํด b) io_uring์ด ์ ์ฒด ์ํ๊ณ์์ ์ผ๋ง๋ ์ค์ํ์ง. ์ด๊ฒ์ ๊ธฐ์ค์ผ๋ก 4๋ ์ ์์ ์ ๋๋๋ฆด ์๋ ์์ต๋๋ค.
์ด๋ฏธ ์ ์ฌํ, ์๋ง๋ ํจ์ฌ ๋ ์ฌ๊ฐํ Rust์ ํ๊ณ๊ฐ ๋ค๋ฅธ ๊ณต๊ฐ์ ์์ต๋๋ค. ์ง๋ ๊ฐ์์ Nick Fitzgerald์ ํจ๊ป ๋ณธ wasm GC ํตํฉ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. wasm์์ ๊ด๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ณํ์ ๋ณธ์ง์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ถํ ํ์ฌ ๊ด๋ฆฌ๋์ง ์๋ ๊ฐ์ฒด์ ๋ณ๋์ ์ฃผ์ ๊ณต๊ฐ์ ์กด์ฌํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค(์ค์ ๋ก ์ธ์ ๊ฐ๋ ๋ง์ ๊ฐ๋ณ ์ฃผ์ ๊ณต๊ฐ์). Rust์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋จ์ํ ๋ณ๋์ ์ฃผ์ ๊ณต๊ฐ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ง ์์์ผ๋ฉฐ ์ค๋๋ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ํ์ง ์์ ์ฝ๋๋ ์ฃผ์ ๊ณต๊ฐ์ด 1๊ฐ๋ง ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํ๊ดด์ ์ด๊ณ ๊ธฐ์ ์ ์ผ๋ก๋ ํ๊ดด์ ์ด์ง ์์ง๋ง ๊ทน๋๋ก ํ๊ดด์ ์ธ ๊ธฐ์ ์๋ฃจ์ ์ ๋ชจ๋ ์ค์ผ์นํ์ง๋ง ์์ผ๋ก ๋์๊ฐ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ ๊ฒฝ๋ก๋ ์ฐ๋ฆฌ์ wasm GC ์คํ ๋ฆฌ๊ฐ ์๋ฒฝํ๊ฒ ์ต์ ์ด ์๋ ์๋ ์๋ค๋ ๊ฒ์ ๋ฐ์๋ค์ด๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ Rust์ ํ๊ณ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ์กด์ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์์ ํํ๊ณ ์๋ ํฅ๋ฏธ๋ก์ด ์ธก๋ฉด์ ์์ ํ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์์ฒด ์ฐธ์กฐ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋๋ ๊ฒ์ Pin<&mut SelfReferentialGenerator>
์์ ์ ์ฒด ์์ฑ๊ธฐ ์ํ๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ( Pin
ํ๋๋ก ์ ์ฅ๋จ)๊ฐ ์๊ณ ํด๋น ์ํ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ตญ๊ฐ์ ๋ค๋ฅธ ๋ถ๋ถ์ผ๋ก. ๋ด๋ถ ํฌ์ธํฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๋ก ๋ณ์นญ ์ ์ง์ ํฉ๋๋ค!
๋ด๊ฐ ์๋ ํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๋ ๋ค๋ฅธ ํ๋์ ๋ํ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ถ์ ์ค์ ๋ก ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉ๋์ง ์์ต๋๋ค. (ํนํ clone
๋ฉ์๋๊ฐ ์๊ฑฐ๋ ์์ฒด ์ฐธ์กฐ ํฌ์ธํฐ ์ด์ธ์ ๋ค๋ฅธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ์ธํฐ ํ๋๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.) ๊ทธ๋๋ ์ด๊ฒ์ ํต์ฌ ์ํ๊ณ์ ๋ค๋ฅธ ๋ฌด์๋ณด๋ค ํนํ Rustc ์์ฒด์ ํจ๊ป ์ ๊ณต๋๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์์ ํ๊ณ ์๋ "๋ผ์ธ"์ ๋งค์ฐ ์์์ง๊ณ ์์ผ๋ฉฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ค๋ ์ด๋ฌํ ๋ชจ๋ ๋ฉ์ง ์ต์ ํ๋ฅผ ์์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
์ด ๋๋ฌธ์ ๊ฑฐ์ ์ฐ๋ฆฌ๊ฐ ํนํ,์ด ์์ ์์ ๊ทธ๊ฒ์ ๋ํด ํ ์์๋ ์๋ง Pin
์ด๋ฏธ ์์ ์ ์ด์ง๋ง, ๋๋ ๊ฐ์น๊ฐ ์จ๋ฆฌ์ด์ฑ์ด ํ์ฉ๋๋์ด ๊ท์น์ด์๋ ์๋นํ ๋ณต์กํ ๋๋ ์ด๋ค ๊ฒ์ ๊ฐ๋ฆฌํค๋ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค. Stacked Borrows๊ฐ ๋ณต์กํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ํฉ์ด ์
ํ๋ ๊ฒ์ ๋๋นํ์ญ์์ค.
์ฐธ์กฐ https://github.com/rust-lang/unsafe-code-guidelines/issues/148
๋ด๊ฐ ์๋ ํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๋ ๋ค๋ฅธ ํ๋์ ๋ํ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ถ์ ์ค์ ๋ก ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ฌ๋๋ค์ ์ด๋ฌํ ๋ชจ๋ ์ฝ๋ฃจํด ์ ํ์ด Debug
๊ตฌํํ๋๋ก ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ์ด ๋ํ๋ ๋ํ ์ธ์๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ์ ์์ ํ์ง ํ์ธํ๊ธฐ ์ํด ์์ ํ์ง ์์ ์ฝ๋ ์ง์นจ์ ํตํฉํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์ฌ๋๋ค์ ์ด๋ฌํ ๋ชจ๋ ์ฝ๋ฃจํด ์ ํ์ด ๋๋ฒ๊ทธ๋ฅผ ๊ตฌํํ๋๋ก ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. ์ด ๋ํ๋ ๋๋ฒ๊ทธ ์ธ์์ ์์ ํ์ง ํ์ธํ๊ธฐ ์ํด ์์ ํ์ง ์์ ์ฝ๋ ์ง์นจ๋ ํตํฉํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ฌผ๋ก . ์์ฒด ์ฐธ์กฐ ํ๋๋ฅผ ์ธ์ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ Debug
๊ตฌํ์ ์์ฑ๊ธฐ ๋ด๋ถ์ MIR ์์ค ์ฐธ์กฐ ๊ธฐ๋ฐ ์ต์ ํ๋ฅผ ๊ธ์งํ ์ ์์ต๋๋ค.
์ฐจ๋จ๊ธฐ์ ๊ดํ ์ ๋ฐ์ดํธ:
๋ ๊ฐ์ง ๋์ ์์ค์ ์ฐจ๋จ๊ธฐ๋ ๋ชจ๋ ํฐ ๋ฐ์ ์ ์ด๋ฃจ์๊ณ ์ค์ ๋ก ๋ ๋ค ๋๋ผ ์๋ ์์ต๋๋ค(?). ์ด์ ๋ํ @cramertj @tmandry ๋ฐ @nikomatsakis์ ์์ธํ ์ ๋ณด๋ ๋ค์ ๊ณผ ๊ฐ์ต๋๋ค .
์ด๋ก ์ธํด ์ด ๊ธฐ๋ฅ์ ์์ ํํ๋ ๋ฐ ์์ด ๋ฌธ์ ๋ฐ ํ ์คํธ๊ฐ ์ฃผ์ ์ฅ์ ๋ฌผ๋ก ๋จ์ ์์ต๋๋ค. @Centril ์ ์ด ๊ธฐ๋ฅ์ด ์ ๋๋ก ํ ์คํธ๋์ง ์์๊ฑฐ๋ ์ถฉ๋ถํ ๋ค๋ฌ์ด์ง์ง ์์๋ค๋ ์ฐ๋ ค๋ฅผ ์ง์์ ์ผ๋ก ํ๋ช ํ์ต๋๋ค. @Centril ์ด ๊ธฐ๋ฅ์ ์์ ํํ๊ธฐ ์ํด ํ์ธํ ์ ์๋ ํน์ ๋ฌธ์ ๋ฅผ ์ด๊ฑฐํ ๊ณณ์ด ์์ต๋๊น?
๋ฌธ์๋ฅผ ์ด์ ํ๋ ์ฌ๋์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ฑ , ์ฐธ์กฐ ๋ฑ์ ํธ๋ฆฌ ๋ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ง์คํ๊ณ ์ถ์ ์ฌ๋์ ํ๋ฅญํ ์๋น์ค๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค! future repo ๋๋ areweasyncyet๊ณผ ๊ฐ์ ์ธ๋ถ ๋ฌธ์์๋ ์ฝ๊ฐ์ ์ถ๊ฐ ์๊ฐ์ด ์์ต๋๋ค.
์ค๋๋ถํฐ ๋ฒ ํ๊ฐ ์ข ๋ฃ๋ ๋๊น์ง 6์ฃผ๊ฐ ๋จ์์ต๋๋ค. ๋ฐ๋ผ์ 1.38์ด ๋ฏธ๋๋ฌ์ง์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๊ธฐ ์ํด ์ด๋ฌํ ์์ ์ ์๋ฃํ๋ ๋ฐ 4์ฃผ(8์ 1์ผ๊น์ง)๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํฌ๊ธฐ ๋ฌธ์ ๋ ๋ ๋ชจํธํฉ๋๋ค. ํญ์ ๋ ๋ง์ ์ต์ ํ ์์ ์ด ์ํ๋ ๊ฒ์ด์ง๋ง ๋ช ๋ฐฑํ ๊ธฐํ๊ธ์์ ์ฆ๊ฐ๋ฅผ ํผํ๋ ๋ฎ์ ๊ต์ํ ๊ฒฐ๊ณผ๊ฐ ๋๋ถ๋ถ ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํฉ๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ฉฐ ์ต๊ทผ์ ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋ฌธ์ ๋ซ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฐจ๋จ ๋ฌธ์ ๊ฐ ์์ต๋๋ค .
@Centril ์ด ๊ธฐ๋ฅ์ ์์ ํํ๊ธฐ ์ํด ํ์ธํ ์ ์๋ ํน์ ๋ฌธ์ ๋ฅผ ์ด๊ฑฐํ ๊ณณ์ด ์์ต๋๊น?
ํ ์คํธํ๋ ค๋ ํญ๋ชฉ ๋ชฉ๋ก์ด ํฌํจ๋ ๋ณด๊ด์ฉ ๋ฌธ์๊ฐ ์์ผ๋ฉฐ https://github.com/rust-lang/rust/issues/62121์ด ์์ต๋๋ค. ๊ทธ ์ธ์๋ ์ต๋ํ ๋นจ๋ฆฌ ํ ์คํธ๋์ง ์์๋ค๊ณ ์๊ฐ๋๋ ์์ญ์ ์ฌ๊ฒํ ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ฆ, ์ผ๋ถ ์์ญ์ ์ด์ ๊ฝค ์ ํ ์คํธ๋์์ต๋๋ค.
์ฑ , ์ฐธ์กฐ ๋ฑ์ ํธ๋ฆฌ ๋ด ๋ฌธ์๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ง์คํ๊ณ ์ถ์ ์ฌ๋์ ํ๋ฅญํ ์๋น์ค๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค!
๋ฌผ๋ก ; ์ฐธ์กฐ์ ๋ํ PR์ ๊ฒํ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋ํ cc @ehuss.
๋๋ ๋ํ async unsafe fn
๋ฅผ MVP์์ ์์ฒด ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ก ์ฎ๊ธฐ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด a) ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์๊ณ , b) ํน๋ณํ ์ ํ
์คํธ๋์ง ์์์ผ๋ฉฐ, c) .await
ํฌ์ธํธ๋ unsafe { ... }
๋ฅผ ์ฐ๋ ๊ณณ์ด ์๋๋ฉฐ "๋์ค ๊ตฌํ POV"์์๋ ์ดํดํ ์ ์์ง๋ง ํจ๊ณผ POV์์๋ ๊ทธ๋ค์ง ๋ง์ง ์์ต๋๋ค. d) ๋
ผ์๊ฐ ๊ฑฐ์ ์์๊ณ RFC์ ํฌํจ๋์ง ์์์ต๋๋ค. ์ด ๋ณด๊ณ ์๋ ์๋๊ณ e) const fn
๋ก ์ด ์์
์ ์ํํ์ผ๋ฉฐ ์ ๋๋ก ์๋ํ์ต๋๋ค. (ํผ์ฒ ๊ฒ์ดํ
PR์ ์์ฑํ ์ ์์ต๋๋ค)
๋๋ async unsafe fn
์ ๋ถ์์ ํ๊ฒ ํ๋ ๊ฒ์ ๊ด์ฐฎ์ง
async unsafe fn
๋ฅผ ๊ณ ์ ํ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ก ์ด๋ํ๊ธฐ ์ํด https://github.com/rust-lang/rust/issues/62500 ์ ๋ง๋ค๊ณ ์ฐจ๋จ๊ธฐ๋ก ๋์ดํ์ต๋๋ค. ์ ์ ํ ์ถ์ ๋ฌธ์ ๋ ๋ง๋ค์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ async unsafe fn
์ ๋ํด ๋ค๋ฅธ ๋์์ธ์ ๋๋ฌํ ๊ฒ์ธ์ง์ ๋ํด ๋งค์ฐ ํ์์ ์ด๋ฉฐ ์ด๊ธฐ ์์ ํ ๋จ๊ณ์ ํฌํจํ์ง ์๊ธฐ๋ก ํ ๊ฒฐ์ ์ ๋๋์ต๋๋ค. ๋๋ ์์ ํ์ง ์์ async fn
์ ์ฌ๋ฌ ๊ฐ ์์ฑํ์ผ๋ฉฐ async fn really_this_function_is_unsafe()
๋๋ ๋ฌด์์ธ๊ฐ๋ฅผ ๋ง๋ค ๊ฒ์
๋๋ค. ์ด๊ฒ์ Rust ์ฌ์ฉ์๊ฐ unsafe { ... }
๋ฅผ ํธ์ถํด์ผ ํ๋ ํจ์๋ฅผ ์ ์ํ ์ ์๋ค๋ ๋ฉด์์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋์น์ ํ๊ท์ฒ๋ผ ๋ณด์
๋๋ค. ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ async
/ await
๊ฐ ๋ฏธ์์ฑ์ด๋ผ๋ ์ธ์์ ๊ธฐ์ฌํ ๊ฒ์
๋๋ค.
@cramertj ๋ ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค! ์ด ์ถ์ ๋ฌธ์ ๊ฐ ๋๋ฌด ๊ณผ๋ถํ๋์ง ์๋๋ก ํ๊ธฐ ์ํด Zulip ์ฃผ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค .
ํฅํ ํฌ๊ธฐ์ ๋ํด์๋ ๋ชจ๋ await
ํฌ์ธํธ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ๊ฐ ์ต์ ํ๋ฉ๋๋ค. ๋ด๊ฐ ์๋ ๋ง์ง๋ง ๋จ์ ๋ฌธ์ ๋ #59087๋ก, ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ ์ ๋ฏธ๋๋ฅผ ๋น๋ฆด ๊ฒฝ์ฐ ํด๋น ๋ฏธ๋์ ํ ๋น๋ ํฌ๊ธฐ๊ฐ ๋ ๋ฐฐ๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ๋ถํํ์ง๋ง ์ฌ์ ํ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
๋๋ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ง๋ง ์ด๊ฒ์ด ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ผ๋ฐ์ ์ด์ง ์๋ค๋ฉด ์์ ์ ์ธ MVP๋ฅผ ๋ฐฉํดํด์๋ ์ ๋ฉ๋๋ค.
์ฆ, ์ด๋ฌํ ์ต์ ํ๊ฐ Fuchsia์ ๋ฏธ์น๋ ์ํฅ์ ์ดํด๋ด์ผ ํฉ๋๋ค(์ ์ ์ฐจ๋จ๋์์ง๋ง ์ค๋์ด๋ ๋ด์ผ ํด๊ฒฐ๋ ์์ ์). ๋ ๋ง์ ์ฌ๋ก๋ฅผ ๋ฐ๊ฒฌํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์ฐจ๋จํด์ผ ํ๋ ์ฌ๋ก๊ฐ ์๋์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
@cramertj (์๋ฆผ: async/await๋ฅผ ์ฌ์ฉํ๊ณ ์ต๋ํ ๋นจ๋ฆฌ ์์ ํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.) ๊ทํ์ ์ฃผ์ฅ์ ์ ์ ํ ์คํ๊ณผ ์๊ฐ ์์ด ๋ฐ๋ก ์ง๊ธ async unsafe
์ ์์ ํํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ async/await์ ์์ ํ๋ฅผ ์ง์ฐํ๊ธฐ ์ํ ์ฃผ์ฅ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
ํนํ RFC์ ํฌํจ๋์ง ์์์ผ๋ฏ๋ก ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์ข ๋ฃ๋๋ฉด ์ ์ฌ์ ์ผ๋ก ๋ ๋ค๋ฅธ "์ธ์ ์์น์ ์์์ ํน์ฑ"์ ์ ๋ฐํ ์ ์์ต๋๋ค.
[์ฌ๊ธฐ์ ๋ ผ์ํ ๊ฐ์น๊ฐ ์๋ ์ฐธ๊ณ ์ฌํญ: "๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ async/await๊ฐ ์๋ฃ๋์ง ์์ ์ธ์์ ๊ธฐ์ฌํ ๊ฒ์ ๋๋ค."์ ๋ํด, ์ ๋ async/await๋ฅผ ์ฌ์ฉํ๋ ๋ช ์๊ฐ๋ง๋ค ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ผ๋ฉฐ, ์์์ ์ํด ํผ์ก์ต๋๋ค. Rustc ํ์ด ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๋ฐ ํฉ๋ฒ์ ์ผ๋ก ํ์ํ ๋ช ๋ฌ์ด๊ณ , ๊ทธ๊ฒ์ด ๋ด๊ฐ ์์ง ๋ฏธ์์ฑ์ด๋ผ๊ณ ๋งํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ง์ง๋ง ํ๋๋ ๋ฉฐ์น ์ ์ ์์ ๋์์ผ๋ฉฐ ์๋ก์ด Rustc๋ก ์ฝ๋๋ฅผ ๋ค์ ์ปดํ์ผํ๋ ค๊ณ ํ ๋ ๋ค๋ฅธ ํ๋๋ฅผ ๋ฐ๊ฒฌํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ง๋งโฆ]
๋น์ ์ ์ฃผ์ฅ์ ์ ์ ํ ์คํ๊ณผ ์๊ฐ ์์ด ์ง๊ธ ๋น์ฅ ๋ถ์์ ํ ๋น๋๊ธฐ๋ฅผ ์์ ํํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ async/await์ ์์ ํ๋ฅผ ์ง์ฐ์ํค๊ธฐ ์ํ ์ฃผ์ฅ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์๋์, ๊ทธ๊ฒ์ ๋ํ ์ฃผ์ฅ์ด ์๋๋๋ค. async unsafe
์ด ์ค๋น๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ฉฐ ๋ค๋ฅธ ๋์์ธ์ ์์ํ ์ ์์ต๋๋ค. ์ด ์ด๊ธฐ ๋ฆด๋ฆฌ์ค์ ํฌํจํ์ง ์๋ ๊ฒ์ ๋ถ์ ์ ์ธ ๊ฒฐ๊ณผ๋ง ์์ ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. async
/ await
๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ง์ฐํ๊ฑฐ๋ ๊ตฌ์ฒด์ ์ผ๋ก async unsafe
๋ฅผ ์ง์ฐํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ต๋๋ค.
๋ค๋ฅธ ๋์์ธ์ ์์ํ ์ ์์ต๋๋ค
๋ณต์กํ ํ์ฅ์ด ํ์คํ ํ์ํ ๋์ ๋์์ธ: async unsafe fn
์ unsafe
๊ฐ ์๋๋ผ .await
call()
์
๋๋ค. async fn
๊ฐ ํธ์ถ๋๊ณ impl Future
์์ฑ๋๋ ์ง์ ์์ _์์ ํ์ง ์์ ๊ฒ์ ์๋ฌด๊ฒ๋ ํ ์ ์๋ค๋ ์ด์ ์
๋๋ค. ์ด ๋จ๊ณ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ฒด์ ๋ฃ๋ ๊ฒ๋ฟ์
๋๋ค(์ฌ์ค์ ๋ชจ๋ async fn
๋ ํธ์ถํ const
). ์ค์ ์์ ํ์ง ๋ชปํ ์ ์ poll
๋ฏธ๋๋ฅผ ์ ์ง์ํค๋ ๊ฒ์
๋๋ค.
(์ํธ, unsafe
๊ฐ ์ฆ๊ฐ์ ์ด๋ฉด unsafe async fn
๊ฐ ๋ ํฉ๋ฆฌ์ ์ด๊ณ unsafe
๊ฐ ์ง์ฐ๋๋ฉด async unsafe fn
๊ฐ ๋ ํฉ๋ฆฌ์ ์
๋๋ค.)
๋ฌผ๋ก , ์ฐ๋ฆฌ๋ ๊ฒฐ์ฝ ๋งํ ์์๋ ๋ฐฉ๋ฒ์ ์ป์ ์์๋ ๊ฒฝ์ฐ ์๋ฅผ ๋ค์ด unsafe Future
๋ชจ๋ ๋ฐฉ๋ฒ ๊ฒฝ์ฐ Future
๋น์ "๋ฆฌํํ
"์ ํ๋ฅผ ์์ ํ์ง unsafe
์ ์ฐฝ์กฐ์ impl Future
, ๊ทธ๋ฆฌ๊ณ ๊ทธ unsafe
์ ๊ณ์ฝ์ ๊ฒฐ๊ณผ์ ์ธ ๋ฏธ๋๋ฅผ ์์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ async
๋ธ๋ก unsafe fn os_stuff() -> impl Future { async { .. } }
์๋์ผ๋ก "๋์๊ฐ๋ง"ํ์ฌ unsafe async fn
์์ด๋ ๊ฑฐ์ ๊ฐ๋จํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์์ poll
ing์ด ์์๋๋ฉด ์์ฑ ์ ๋ณด์ ํ ํ์๊ฐ ์๋ ๋ถ๋ณ๋์ ๋ณด์ ํด์ผ ํ๋ ๋ถ๋ณ๋์ ๊ฐ๋ ๋ฐฉ๋ฒ์ด ์ค์ ๋ก ์กด์ฌํ๋์ง์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. unsafe
์์ฑ์๋ฅผ ์์ ํ ์ ํ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ Rust์ ์ผ๋ฐ์ ์ธ ํจํด์
๋๋ค(์: Vec::from_raw_parts
). ๊ทธ๋ฌ๋ ํต์ฌ์ ๊ตฌ์ฑ ํ์ ์ ํ์ ์ค์ฉํ ์ _์์ต๋๋ค. unsafe
๋ฒ์๊ฐ ๋๋ฌ์ต๋๋ค. ์ด๋ฌํ ๋ถ์์ ์ฑ์ ๋ฒ์๋ Rust๊ฐ ๋ณด์ฅํ๋ ํต์ฌ์
๋๋ค. ํด๋ง ๋ฐฉ๋ฒ/์๊ธฐ์ ๋ํ ์๊ตฌ ์ฌํญ๊ณผ ํจ๊ป ์์ ํ impl Future
์์๋ฅผ ๋ง๋๋ unsafe async fn
๋ฅผ ๋์
ํ ๋ค์ ์์ ํ ์ฝ๋์ ์ ๋ฌํ๋ฉด ํด๋น ์์ ํ ์ฝ๋๊ฐ ๊ฐ์๊ธฐ ์์ ํ์ง ์์ ์ฅ๋ฒฝ ์์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ _some_ ์ธ๋ถ ๊ฒฐํฉ๊ธฐ๋ฅผ ํต๊ณผํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฆ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ ์ด์ธ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ด ๋ฏธ๋๋ฅผ ์ฌ์ฉํ์๋ง์ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด _๋งค์ฐ_ ๋์ต๋๋ค.
TL;DR์ async unsafe fn
๋ฅผ ์์ ํํ๊ธฐ ์ ์ ์ ์ ํ๊ฒ ๋
ผ์ํด์ผ ํ๋ ๊ตฌ์์ด ๋ถ๋ช
ํ ์๋ค๋ ๊ฒ์
๋๋ค. ํนํ const Trait
์ ๋ฐฉํฅ์ด ์ ์ฌ์ ์ผ๋ก ๋์
๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค(์ ๋ ๋ธ๋ก๊ทธ ์ด์์ด ์์ต๋๋ค. fn
-modifying ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ "์ฝํ 'ํจ๊ณผ' ์์คํ
"์ผ๋ก ์ผ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฒ์). ๊ทธ๋ฌ๋ unsafe async fn
๋ ์์ ํ๋ฅผ ์ํด unsafe
์ "์ฃผ๋ฌธ"/"ํฌ์ง์
๋"์ ๋ํด ์ค์ ๋ก ์ถฉ๋ถํ ๋ช
ํํ ์ ์์ต๋๋ค.
๋๋ ํจ๊ณผ ๊ธฐ๋ฐ unsafe Future
ํน์ฑ์ด ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ์ธ์ด๋ ์ปดํ์ผ๋ฌ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ์ด๋ค ๊ฒ๋ ๋๋ฌํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ถ๊ฐ ํจ๊ณผ๋ก ์ธํด ๊ถ๊ทน์ ์ผ๋ก ๋ ๋์ ๋์์ธ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ๊ฒฐํฉ์๊ฐ ํ์๋ก ํ๋ ๋คํ์ฑ.
async fn์ด ํธ์ถ๋๊ณ impl Future๋ฅผ ์์ฑํ๋ ์ง์ ์์๋ ์์ ํ์ง ์์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ด ๋จ๊ณ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ฒด์ ์ฑ์ฐ๋ ๊ฒ๋ฟ์ ๋๋ค(์ฌ์ค์ ๋ชจ๋ ๋น๋๊ธฐ fn์ ํธ์ถํ const์ ๋๋ค). ์ค์ ๋ถ์์์๋ ์ฌ๋ก ์กฐ์ฌ๋ก ๋ฏธ๋๋ฅผ ์๋น๊ธฐ๋ ๊ฒ์ด๋ค.
async fn
๋ .await
ed๊ฐ ๋๊ธฐ ์ ์ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์๋์ง ์์ ๋์์ .await
๊ฐ ํธ์ถ๋ ๋๊น์ง ์ง์ฐ๋ ์ ์์ต๋๋ค. ํ์ง๋ง UB์ ํฌ์ธํธ์ unsafe
ty์ ํฌ์ธํธ ์ฌ์ด์๋ ์ค์ํ ์ฐจ์ด๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. unsafe
ty์ ์ค์ ์์ ์ ์๋ฐ๋๋ ๋ถ๋ณ์ ๊ฒฐ๊ณผ๊ฐ UB๋ฅผ ์ ๋ฐํ์ง ์๋๋ผ๋ API ์์ฑ์๊ฐ ์ ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์๋ ์ผ๋ จ์ ๋ถ๋ณ์ด ์ถฉ์กฑ๋๋ค๊ณ ์ฌ์ฉ์๊ฐ ์ฝ์ํด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ ๊ณณ์
๋๋ค. ๋์ค์ ๋ค๋ฅธ ์์ ํ ์ฝ๋๊ฐ ๋์ฌ ๋๊น์ง. ์ด๊ฒ์ ํ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์๋ ์์ ํ ๋ฐฉ๋ฒ(์ ํํ ์ด๊ฒ์ด ๋ฌด์์ธ์ง)์ผ๋ก ํน์ฑ์ ๊ตฌํํ๋ ๊ฐ์ ์์ฑํ๋ unsafe
ํจ์์
๋๋ค. ์๋ฅผ ๋ค์ด Visitor
unsafe
๋ถ๋ณ์ ์์กดํ๋ ๊ตฌํ์ Visitor
-trait-implementing ์ ํ์ด ์ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํด unsafe
๋ฅผ ์๊ตฌํจ์ผ๋ก์จ ์ ๋๋ก ์ฌ์ฉ๋ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ด๊ฒ์ด ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋ค๋ฅธ ์์๋ slice::from_raw_parts
์ ๊ฐ์ ๊ฒ๋ค์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ ์์ฒด์ ์ผ๋ก UB(์ ํ ์ ํจ์ฑ ๋ถ๋ณ์ ์ ์ธ)๋ฅผ ๋ฐ์์ํค์ง ์์ง๋ง ๊ฒฐ๊ณผ ์ฌ๋ผ์ด์ค์ ๋ํ ์ก์ธ์ค๋ ๋ฐ์ํฉ๋๋ค.
async unsafe fn
๊ฐ ์ฌ๊ธฐ์์ ๋
ํนํ๊ฑฐ๋ ํฅ๋ฏธ๋ก์ด ์ฌ๋ก๋ฅผ ๋ํ๋ธ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. unsafe
์๊ตฌํ์ฌ ์์ ํ ์ธํฐํ์ด์ค ๋ค์์ unsafe
๋์์ ์ํํ๋ ์ ์ ๋ฆฝ๋ ํจํด์ ๋ฐ๋ฆ
๋๋ค. ๊ฑด์ค์.
@cramertj ๋น์ ์ด ์ด๊ฒ์ ๋ํด ๋ ผ์์ ํด์ผ ํ๋ค๋ ์ฌ์ค(๊ทธ๋ฆฌ๊ณ ๋๋ ํ์ฌ ํด๊ฒฐ์ฑ ์ด ๋์ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํ๊ฑฐ๋ ๋ ๋์ ์์ด๋์ด๊ฐ ์๋ค๊ณ ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค)์ ๋์๊ฒ ์ด ๋ ผ์์ด ๋ น์ ๊ฑฑ์ ํ๋ ์ฌ๋๋ค์ด ๋ฐ๋ผ์ผ ํ ์ฅ์: RFC ์ ์ฅ์.
์ฐธ๊ณ ๋ก ์ฝ์ด๋ณด๊ธฐ์์ ์ธ์ฉํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[...]์ธ ๊ฒฝ์ฐ ์ด ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
- ๋ฒ๊ทธ์์ ์ด ์๋ ์ธ์ด์ ๋ํ ์๋ฏธ ๋๋ ๊ตฌ๋ฌธ ๋ณ๊ฒฝ.
- [... ๋ํ ์ธ์ฉ๋์ง ์์ ๊ฒ๋ค]
ํ์ฌ ๋์์ธ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ์ค, ๋ช ๋ถ ๋์ ์๊ฐํด๋ณด๋ฉด ๊ทธ๊ฒ์ด ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ต๊ณ ์ ๋์์ธ์ผ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ธ์ค๋ ์ฐ๋ฆฌ์ ๋ฏฟ์์ด Rust์ ๋ํ ์ํ์ด ๋๋ ๊ฒ์ ํผํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, RFC ์ ์ฅ์๋ฅผ ๋ฐ๋ฅด์ง๋ง ์ฌ๊ธฐ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด์ง ์์์ผ๋ก์จ ๋ชจ๋ ๋จ์ผ ๋ฌธ์ ๋ฅผ ์ฝ์ง ์๋ ๋ง์ ์ฌ๋๋ค์ ์งํ๋ฅผ ๋์น๊ณ ์์ต๋๋ค.
๋๋ก๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋๋ FCP ์ง์ฐ์ ์ฝ 2์ฃผ๋ฅผ ํผํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ ์ ๋นํํ ์๊ธํจ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Rust๊ฐ ์์ฒด readme์์ ์ ๊ณตํ๋ ์ฝ์์ ๋ํด ์ปค๋ฎค๋ํฐ์ ์ ์งํ๊ฒ ํ๊ณ ์ต์ํ ํ์ฉ๋๋ RFC๊ฐ ์๊ณ ์ผ์์์ ๋ ๋ง์ด ์ฌ์ฉํ ์ ์์ ๋๊น์ง ํด๋น ๊ธฐ๋ฅ์ ๊ธฐ๋ฅ ๊ฒ์ดํธ ์๋์ ์ ์งํ์ญ์์ค. ์ ์ฒด async/await ๊ธฐ๋ฅ ๊ฒ์ดํธ์ด๋ ์๋๋ฉด ๋จ์ง unsafe-async ๊ธฐ๋ฅ ๊ฒ์ดํธ์ด๋ ์๊ดํ์ง ์์ง๋ง (AFAIK) async-wg ์ด์์ผ๋ก ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ ๊ฑฐ์ ์๋ ค์ง์ง ์์ ๊ฒ์ ์์ ํํ์ง ๋ง์ญ์์ค. ์ ์ฒด ์ปค๋ฎค๋ํฐ.
๋๋ ์ฑ
์ ์ฐธ๊ณ ์๋ฃ์ ์ฒซ ๋ฒ์งธ ํจ์ค๋ฅผ ์ฐ๊ณ ์์ต๋๋ค. ๊ทธ ๊ณผ์ ์์ async-await RFC๊ฐ ?
์ฐ์ฐ์์ ๋์์ด ์์ง ๊ฒฐ์ ๋์ง ์์๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ๋ธ๋ก( playground )์์๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฅผ ๋ณ๋์ ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ก ์ฎ๊ฒจ์ผ ํฉ๋๊น? ์๋๋ฉด ์ด๋ ์์ ์์ ํด๊ฒฐ๋์์ต๋๊น? ์์ ํ ๋ณด๊ณ ์์์๋ ๋ชป ๋ดค๋๋ฐ ๋์ณค์ ์๋ ์๊ฒ ๋ค์.
(์ ๋ Zulip์์ ์ด ์ง๋ฌธ
์, return
, break
, continue
๋ฑ์ ํ๋๊ณผ ํจ๊ป ๋
ผ์๋๊ณ ํด๊ฒฐ๋์์ต๋๋ค. ์. ๋ชจ๋ "์ ์ผํ ๊ฐ๋ฅํ ์ผ"์ ์ํํ๊ณ ํด๋ก์ ๋ด๋ถ์์์ ๊ฐ์ด ๋์ํฉ๋๋ค.
let f = unsafe { || {...} };
๋ ํธ์ถํ๊ธฐ์ ์์ ํ๋ฉฐ IIRC๋ unsafe
๋ฅผ ํด๋ก์ ๋ด๋ถ๋ก ์ด๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
unsafe fn foo() -> impl Fn() { || {...} }
์
๋๋ค.
์ด๊ฒ์ ๋์๊ฒ " unsafe
๋ฒ์๋ฅผ ๋ ๋ ํ ์์ ํ์ง ์์ ์ผ์ด ๋ฐ์ํฉ๋๋ค"์ ๋ํ ์ ๋ก์
๋๋ค.
๋ค๋ฅธ ๊ณณ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด์ ์ ์ง์ ํ๋ฏ์ด unsafe
๋ ํญ์ ์ ์ฌ์ ์ธ UB๊ฐ ์๋ ์์น๊ฐ ์๋๋๋ค. ์์:
let mut vec: Vec<u32> = Vec::new();
unsafe { vec.set_len(100); } // <- unsafe
let val = vec.get(5).unwrap(); // <- UB
println!("{}", val);
๊ทธ๊ฒ์ ๋์๊ฒ unsafe์ ๋ํ ์คํด์ฒ๋ผ ๋ณด์ ๋๋ค. unsafe๋ "์ฌ๊ธฐ ๋ด๋ถ์์ ์์ ํ์ง ์์ ์์ ์ด ๋ฐ์ํฉ๋๋ค"๋ผ๊ณ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ "์ฌ๊ธฐ์์ ํ์ํ ๋ถ๋ณ์ฑ์ ์ง์งํ๋ค๋ ๊ฒ์ ๋ณด์ฆํฉ๋๋ค."๋ผ๊ณ ํ์ํฉ๋๋ค. ๋๊ธฐ ์ง์ ์์ ๋ถ๋ณ์ ์ ์งํ ์๋ ์์ง๋ง ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ์ ์ ์งํ๋์ง ํ์ธํ๋ ๋งค์ฐ ๋ช ํํ ์ฌ์ดํธ๊ฐ ์๋๋๋ค. ํธ์ถ ์ฌ์ดํธ์์ ๋ถ๋ณ์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์ด๊ณ ๋ชจ๋ ์์ ํ์ง ์์ ์ถ์ํ๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ํจ์ฌ ๋ ์ผ๊ด์ฑ์ด ์์ต๋๋ค.
์ด๊ฒ์ ์์ ํ์ง ์์ ํจ๊ณผ๋ฅผ ์๊ฐํ๋ ๊ฒ์ด ๋ถ์ ํํ ์ง๊ด์ผ๋ก ์ด์ด์ง๋ ์ด์ ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ถ์์ ์ฑ์ ๊ตฌ์ฒด์ ์ผ๋ก ์๋์ ์ผ๋ก ์ ์ผ๋๋ ๊ฒ์ด ์๋๋๋ค . ๋ค๋ฅธ ์์ ํ์ง ์์ ํจ์๋ฅผ ํธ์ถํ๋ ์์ ํ์ง ์์ ํจ์๋ฅผ ์์ฑํ๊ณ ํด๋น ๋ถ๋ณ๋์ ํธ์ถ ์คํ์ผ๋ก ์ ๋ฌํ ์ ์์ง๋ง ์ด๊ฒ์ ์์ ํ์ง ์์ ๊ฒ์ด ์ ํ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ ์ค์ ๋ก ๊ฐ์ ๋ํ ๊ณ์ฝ์ ์ ์ํ๊ณ ์๋์ผ๋ก ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ ๋ง์ปค์ ๋๋ค. ๋น์ ์ ๊ทธ๋ค์ ์ง์งํฉ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๋์์ธ ๊ฒฐ์ ์ ์ ์ฒด RFC๊ฐ ํ์ํ ๊ฒ์ ์๋์ง๋ง ๊ฒฐ์ ์ด ๋ด๋ ค์ง๋ ๋ฐฉ์์ ๋ํด ๋ณด๋ค ๋ช ํํ๊ณ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ด๋ฒ ํธ ์๋์ ์ฃผ์ ๊ฒฐ์ ์ฌํญ ๋ชฉ๋ก์ด ๊ทธ ์์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ์ง ์์ ๋น๋๊ธฐ fns ๋ฌธ์ ์ ๋ํ ๊ตฌ์กฐํ๋ ํฉ์ ์ง์ ์ ์ดํด๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ค๋ฌธ์กฐ์ฌ๊ฐ ํฌํจ๋ ์์ฝ ๊ฒ์๋ฌผ์ ๋๋ค.
async unsafe fn
async unsafe fns๋ unsafe ๋ธ๋ก ๋ด์์๋ง ํธ์ถํ ์ ์๋ ๋น๋๊ธฐ ํจ์์ ๋๋ค. ๊ทธ๋ค์ ์ ์ฒด ๋ด๋ถ๋ ์์ ํ์ง ์์ ๋ฒ์๋ก ์ทจ๊ธ๋ฉ๋๋ค. ์ฃผ์ ๋์ ์ค๊ณ๋ async unsafe fns ๋ฅผ ํธ์ถํ๋ ๋์ await ์ ๋ํด ์์ ํ์ง ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ํธ์ถํ๊ธฐ์ ์์ ํ์ง ์์ ๋์์ธ์ ์ ํธํ๋ ์ฌ๋ฌ ๊ฐ์ง ํ์คํ ์ด์ ๊ฐ ์์ต๋๋ค.
@rfcbot ask lang "์์ ํ async unsafe fn์ ํธ์ถํ๊ธฐ์ ์์ ํ์ง ์์ async fn์ผ๋ก ํ์ฉํฉ๋๊น?"
rfcbot์ผ๋ก ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ง๋ง ์ ์ด๋ ์ง๋ช ํ์ต๋๋ค.
@withoutboats ํ ๊ตฌ์ฑ์์ด T-lang์ ๋ค์ ์ฌํญ์ ๋ํ ํฉ์๋ฅผ ์์ฒญํ์ต๋๋ค.
"๋ถ์์ ํ ๋น๋๊ธฐ fn ์์ ํ๋ฅผ ํธ์ถํ๊ธฐ์ ์์ ํ์ง ์์ ๋น๋๊ธฐ fn์ผ๋ก ํ์ฉํฉ๋๊น?"
@withoutboats
์ด ์์ ํ์ง ์์ ๋น๋๊ธฐ fns ๋ฌธ์ ์ ๋ํด ๊ตฌ์กฐํ๋ ํฉ์์ ์ ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ค๋ฌธ์กฐ์ฌ๊ฐ ํฌํจ๋ ์์ฝ ๊ฒ์๋ฌผ์ ๋๋ค.
์์ฑํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ํ ๋ก ์ ํตํด ์ค๋ ๋ฐค์ ์๋ํ๋ async unsafe fn
๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ค๊ณ ํ์ ํ์ต๋๋ค. (์ผ๋ถ ํ
์คํธ๋ ํฌ์ํ๊ฒ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋์ด์ผ ํ ๊ฒ์
๋๋ค.) ๋ํ, ๋ณด๊ณ ์์ ์ผ๋ถ์ async unsafe fn
์๋ ๋ฐฉ์์ ๋ํ ์ค๋ช
์ผ๋ก ์๋จ์ ๋ณด๊ณ ์๋ฅผ ์์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ผ๋ฐ์ ์ผ๋ก unsafe๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ๋ ์ผ์นํฉ๋๋ค. ์์ ํ์ง ์์ ํจ์๋ ํธ์ถ์๊ฐ ์ ์งํ๋ ์ผ๋ถ ๋ถ๋ณ์ ์์กดํ๋ ์ถ์ํ์ ๋๋ค. ์ฆ, "์์ ํ์ง ์์ ์์ ์ด ๋ฐ์ํ๋ ๊ณณ"์ ํ์ํ๋ ๊ฒ์ด ์๋๋ผ "๋ถ๋ณ์ฑ์ด ์ ์ง๋๋ ๊ฒ์ด ๋ณด์ฅ๋๋ ๊ณณ"์ ํ์ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ธ์๊ฐ ์ ํ๋๊ณ ๊ฒ์ฆ๋ ์์ ๊ณผ ๋ณ๋๋ก ๋๊ธฐ ์ฌ์ดํธ์์๋ณด๋ค ์ธ์๊ฐ ์ค์ ๋ก ์ง์ ๋ ํธ์ถ ์ฌ์ดํธ์์ ๋ถ๋ณ๋์ด ์ ์ง๋๋์ง ํ์ธํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์์ ๊ธฐ๋ฅ์ ๋ํด ๋งค์ฐ ์ ์์ด๋ฉฐ, ๋ค๋ฅธ ์์ ํ ๊ธฐ๋ฅ์ด ์ ํํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ์ผ๋ถ ์ํ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋๋ฌด ์ธ์ฌํ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๋ ์ฌ๋์ผ๋ก์ ์ฌ๊ธฐ์ ๋์ํ๊ณ ํด๊ฒฐ์ฑ ์ด ์ข์ ๋ฌธ์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ฌ๊ธฐ์์ ๋ฒ์ด๋ ๊ฒ์ผ ์๋ ์์ง๋ง, ๊ทธ ์ ์ ๊ฐ์ํ ๋
ํน์ ์ฌ์ฉ/ํ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ถ๋ณ์ฑ์ ๋์ ์๊ฐ๊ณผ ์์ ํ ๊ท์น์ด ๋ถ๊ฐ๋ฅํ ๊ฒ ์ฌ์ด ์ด๋๊ฐ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ธฐ๋ ์ถ๋ ฅ ๊ฐ์ด ๋ถ๋ณ์ฑ์ ์ ์งํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฏธ๋์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ง ์์ ์ก์ธ์ค๊ฐ ํ์ํ ๋ํผ์ธ ์ถ๋ ฅ์ด ์์ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
struct UnsafeOutput<T>(T);
impl<T> UnsafeOutput<T> {
unsafe fn unwrap(self) -> T { self.0 }
}
unsafe
ness๊ฐ ์ด "early unsafe"์์ async
ness ์์ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์์ ์ ์์๊ฐ unsafe async fn
๋ณด๋ค async unsafe fn
unsafe async fn
๊ฒ์ด ํจ์ฌ ๋ ํ๋ณตํ ๊ฒ์
๋๋ค async unsafe fn
, unsafe (async fn)
๊ฐ async (unsafe fn)
๋ณด๋ค ํจ์ฌ ๋ ๋ช
ํํ๊ฒ ํด๋น ๋์์ ๋งคํ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ ๋ค ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ด๊ฒ ์ง๋ง, ์ฌ๊ธฐ์ ๋
ธ์ถ๋ ๋ํ ์์์๋ ์ธ๋ถ์ unsafe
๊ฐ ์๊ณ ์์ ์์ ์์๋ ์ด๊ฒ์ ๋ช
ํํ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ( unsafe
๋ async fn
๋ํ ์์ ์์ด๋ฉฐ async
๋ํ ์์ ์๋ unsafe fn
์๋๋๋ค.)
๋ ๋ค ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ด๊ฒ ์ง๋ง, ์ฌ๊ธฐ์ ๋ ธ์ถ๋ ๋ํ ์์์๋ ์ธ๋ถ์
unsafe
๊ฐ ์๊ณ ์์ ์์ ์์๋ ์ด๊ฒ์ ๋ช ํํ๊ฒ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. (unsafe
๋async fn
๋ํ ์์ ์์ด๋ฉฐasync
๋ํ ์์ ์๋unsafe fn
์๋๋๋ค.)
๋๋ ๋น์ ์ ๋ง์ง๋ง ๊ดํธ ๋ถ๋ถ๊น์ง ๋น์ ๊ณผ ํจ๊ปํ์ต๋๋ค. @withoutboats ' ์์ฑ์ ๋ณด๋ฉด ํธ์ถ ์ฌ์ดํธ์์ ์์ ํ์ง ์์ ๋ฌธ์ ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ unsafe fn
(๋น๋๊ธฐ ์ปจํ
์คํธ์์ ํธ์ถ๋จ)๋ผ๋ ๊ฒ์ ๋งค์ฐ ๋ถ๋ช
ํ๊ฒ ๋ณด์ฌ์ค๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์์ ๊ฑฐ ๋ณด๊ด์ async unsafe fn
ํ์ธํธํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
async unsafe fn
๊ฐ ๋ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง async, unsafe, const ์ค ์ด๋ค ์์๋ ๋ฌธ๋ฒ์ ์ผ๋ก ๋ฐ์๋ค์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ async unsafe fn
๋ ๋น๋๊ธฐ๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํ ์ ํ์ ์์ ํ์ฌ "๋์๊ฐ(desugar)"ํ๋ค๋ ๊ฐ๋
์ผ๋ก ๋์๊ฒ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋์์ ๋จ๊ธฐ ๋๋ ์ค๊ธฐ(๋ช ๋ ์ ์๋ฏธ)์ ๊ตฌํํ๊ธฐ์๋ ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ํ์ฌ ์ค๊ณ๋ Rust ์ธ์ด๋ก ํด๋งํ๊ธฐ์ ์์ ํ์ง ์์ ๋ฏธ๋๋ฅผ ๋ง๋ค ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
FWIW unsafe fn
๋ด๋ถ์ ํด๋ก์ ์ ํจ์ ํน์ฑ๊ณผ ๊ด๋ จํ์ฌ RFC2585 ์์ ์ธ๊ธํ ์ ์ฌํ ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. unsafe async fn
๊ฐ ์์ ํ poll
๋ฉ์๋๋ก Future
unsafe async fn
๋ฅผ ๋ฐํํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์์ง๋ง ๋์ unsafe
๋ก UnsafeFuture
๋ฅผ ๋ฐํํฉ๋๋ค. ํฌํ ๋ฐฉ์. (*) unsafe { }
๋ธ๋ก ๋ด์์ ์ฌ์ฉ๋ ๋ .await
๋ UnsafeFuture
์์ ์๋ํ๋๋ก ๋ง๋ค ์ ์์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ๋ฏธ๋ ํน์ฑ์ ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์ด๋ฉฐ ์๋ง๋ ๋ง์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์
๋๋ค. ๊ทธ๋์ ๋์์ ํ์ํ๋ ๋ฐฐ๋ ์๋ง๋ ํญํดํ์ ๊ฒ์
๋๋ค. ํนํ ์ด๊ฒ์ Fn
ํธ๋ ์ ์ด ์ค๋๋ ์๋ํ๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์(์: UnsafeFn
ํธ๋ ์ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด unsafe fn
๋ด๋ถ์ ํด๋ก์ ๋ฅผ ์์ฑํ๋ ๊ฒ์ด์์ต๋๋ค impls Fn()
์ฆ, ์ด ํด๋ก์ ๊ฐ ์์ ํ์ง ์์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ง๋ง ํธ์ถํ๊ธฐ์ ์์ ํ ํด๋ก์ ๋ฅผ ๋ฐํํฉ๋๋ค.
"์์ ํ์ง ์์" Future ๋๋ ํด๋ก์ ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋ฌธ์ ๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์์ ํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์๊ณ ํธ์ถํ๋ ๊ฒ์ ๋๋ค. ํนํ ์ ํ์ด ์ด๊ฒ์ด ์ํ๋์ด์ผ ํ๋ค๊ณ ๋งํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
(*) ๋ชจ๋ Future
UnsafeFuture
๋ํด UnsafeFuture
์์ฒด๋ฅผ "ํ๊ธฐ"ํ๋ unsafe
๋ฉ์๋๋ ์ ๊ณตํ ์ ์์ต๋๋ค. A์ Future
์ ์์ poll
.
์ฌ๊ธฐ ๋ด ๋ ์ผํธ๊ฐ ์์ต๋๋ค.
unsafe
๋น๋๊ธฐ ํจ์๊ฐ ์ฌ๋ฐ๋ฅธ ๋์์ธ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.unsafe
๋ฐ async
ํค์๋์ ๊ณ ์ ๋ ์์๋ฅผ ๋งค์ฐ ์ ํธํฉ๋๋ค.unsafe async fn
์์๋ฅผ ์ฝ๊ฐ ์ ํธํฉ๋๋ค. "๋น ๋ฅธ ์ ๊ธฐ ์๋์ฐจ" ๋ "์ ๊ธฐ ๋น ๋ฅธ ์๋์ฐจ"์ ์ ์ฌํฉ๋๋ค. ์ฃผ๋ก async fn
๋์๊ฐ๋ฅผ fn
์
๋๋ค. ๋ฐ๋ผ์ ๋ ๊ฐ์ ํค์๋๊ฐ ์๋ก ์์ ์๋ค๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.let f = unsafe { || { ... } }
๋ f
์์ ํ๊ฒ ๋ง๋ค๊ณ UnsafeFn
ํน์ฑ์ ๋์
ํด์๋ ์ ๋๋ฉฐ ์ ํ์ ์ผ๋ก .await
ing ๋ฐ async unsafe fn
๋ ์์ ํ. ๋ชจ๋ UnsafeFuture
๊ฐ๋ ฅํ ๊ทผ๊ฑฐ๊ฐ ํ์ํฉ๋๋ค!
์ด ๋ชจ๋ ๊ฒ์ unsafe
๊ฐ ๋ช
์์ ์ด์ด์ผ ํ๊ณ Rust๊ฐ ๋น์ ์ ์์ ํ ๋
์ผ๋ก ๋ค์ ๋ฐ์ด ๋ฃ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ฆ
๋๋ค. ๋ํ ์ด ํ ํฐ์ผ๋ก f
์ ...
๋ ์์ ํ์ง ์์ ๋ธ๋ก์ด _not_ ๋์ด์ผ ํ๊ณ , https://github.com/rust-lang/rfcs/pull/2585 ๊ฐ ์ฑํ๋์ด์ผ ํ๋ฉฐ, async unsafe fn
์ ๋ชธ์ด ์์ ํด์ผ ํฉ๋๋ค.
๋๋ ์ด ๋ง์ง๋ง ์ ์ด ์คํ๋ ค ๊ฒฐ์ ์ ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ async unsafe fn
๊ฐ unsafe
๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง, ์ ์ฌํ๊ฒ ๋๋ถ๋ถ์ ์ฝ๊ฐ์ ์์ ๋ถ์์ ํตํด ์ด์ ์ ์ป์ ์ ์์ผ๋ฉฐ ๋ง์ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์ค์ํ ๋งํผ ๋ณต์กํ๊ฒ ๋ค๋ฆฝ๋๋ค.
ํนํ ํด๋ก์ ๋ฅผ ์บก์ฒํ ๋ ์ฐจ์ฉ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฐํํด์๋ ์ ๋ฉ๋๋ค.
๊ทธ๋์ ์ฌ๊ธฐ ๋ด ์๊ฒฌ: https://github.com/rust-lang/rust/issues/62149#issuecomment -511116357์ ๋งค์ฐ ๋์ ์๊ฐ์ ๋๋ค.
UnsafeFuture
ํธ๋ ์์ ํธ์ถ์๊ฐ ๋ฏธ๋๋ฅผ ํด๋งํ๊ธฐ ์ํด unsafe { }
๋ฅผ ์์ฑํ๋๋ก ์๊ตฌํ์ง๋ง ํธ์ถ์๋ ์ด๋ค ์๋ฌด๊ฐ ๊ฑฐ๊ธฐ์์ ์
์ฆ๋์ด์ผ ํ๋์ง ์์ง ๋ชปํฉ๋๋ค. ์๋ฅผ ๋ค์ด Box<dyn UnsafeFuture>
๋ unsafe { future.poll() }
์์ ํฉ๋๊น? ๋ชจ๋ ์ ๋ฌผ์ ์ํด? ๋น์ ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ @rpjohnst ๊ฐ ์ ์ฌํ UnsafeFn
ํน์ฑ์ ๋ํ ๋ถ์ผ์น์ ๋ํด ์ง์ ํ๋ฏ์ด ์ด๊ฒ์ ์์ ํ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
Future's๊ฐ ํด์ ํญ์ ์์ ํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ํด์ ์์ ํด์ผ ํ๋ ๋ฏธ๋๋ฅผ ๊ตฌ์ฑํ๋ ํ๋ก์ธ์ค๋ ์์ ํ์ง ์์ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด async unsafe fn
๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ fn
ํญ๋ชฉ์ ๋ฐํ๋ ๋ฏธ๋๊ฐ ํด๋งํ๊ธฐ์ ์์ ํ๋๋ก ์ ์ง๋์ด์ผ ํ๋ ํญ๋ชฉ์ ๋ฌธ์ํํ ์ ์์ต๋๋ค.
@rfcbot ๊ตฌํ-์์ -์ฐจ๋จ-์์ ํ
๋ด๊ฐ ์๋ ํ (https://github.com/rust-lang/rust/issues/61949, https://github.com/rust-lang/rust/issues/62517) 2๊ฐ์ ์๋ ค์ง ๊ตฌํ ์ฐจ๋จ๊ธฐ๊ฐ ์์ต๋๋ค. ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ๋ rfcbot์ด ์๊ฐ์ ์ผ๋ก ์ฐ๋ฆฌ์ ์ฐจ๋จ๊ธฐ๊ฐ ๋์ง ์๋๋ก ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ผ๋ฉฐ ๋์ ์์ ์ฌํญ์ ์ค์ ๋ก ์ฐจ๋จํ ๊ฒ์ ๋๋ค.
@rfcbot์ ๊ตฌํ-์์ -์ฐจ๋จ-์์ ํ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
:bell: ์ ์ ์ด์ ์ต์ข ๋๊ธ ๊ธฐ๊ฐ์ ์ ์ด๋ค์์ต๋๋ค . :๋ฒจ:
https://github.com/rust-lang/rust/pull/63209 ์ ์์ ํ PR์ ์ ์ถํ์ต๋๋ค
์ ์ ๋ณํฉ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์ด์ ์๋ฃ๋์์ต๋๋ค .
๊ฑฐ๋ฒ๋์ค ํ๋ก์ธ์ค์ ์๋ํ๋ ๋ํ์๋ก์ ๋๋ ๊ทธ๋ค์ ์์ ์ ๋ํด ์ ์์ ๊ธฐ์ฌํ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
RFC๋ ๊ณง ๋ณํฉ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์์ ํํ๊ณ ์๋ ํฅ๋ฏธ๋ก์ด ์ธก๋ฉด์ ์์ ํ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์์ฒด ์ฐธ์กฐ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋๋ ๊ฒ์ Pin<&mut SelfReferentialGenerator>์์ ์ ์ฒด ์์ฑ๊ธฐ ์ํ๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ(Pin์ ํ๋๋ก ์ ์ฅ๋จ)๊ฐ ์๊ณ ํด๋น ์ํ ๋ด๋ถ์ ์ํ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. . ๋ด๋ถ ํฌ์ธํฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ฐธ์กฐ๋ก ๋ณ์นญ์ ์ง์ ํฉ๋๋ค!
์ด์ ๋ํ ํ์ ์กฐ์น๋ก @comex๋ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ํ์ฌ ๋ด๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก LLVM์ noalias
์ฃผ์์ ์๋ฐํ๋ (์์ ํ) ๋น๋๊ธฐ Rust ์ฝ๋๋ฅผ ์์ฑ ํ์ต๋๋ค. ํ์ง๋ง TLS ์ฌ์ฉ์ผ๋ก ์ธํด ํ์ฌ ์๋ชป๋ ์ปดํ์ผ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ์ ๋ณํฉ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ ์ต์ข ์๊ฒฌ ์๋ ด ๊ธฐ๊ฐ์ด ์ด์ ์๋ฃ๋์์ต๋๋ค .
๊ฑฐ๋ฒ๋์ค ํ๋ก์ธ์ค์ ์๋ํ๋ ๋ํ์๋ก์ ๋๋ ๊ทธ๋ค์ ์์ ์ ๋ํด ์ ์์ ๊ธฐ์ฌํ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
RFC๋ ๊ณง ๋ณํฉ๋ฉ๋๋ค.