Rust: [์•ˆ์ •ํ™”] async/await MVP

์— ๋งŒ๋“  2019๋…„ 06์›” 26์ผ  ยท  58์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์•ˆ์ •ํ™” ๋Œ€์ƒ: 1.38.0(๋ฒ ํƒ€ ์ปท 2019-08-15)

์š”์•ฝ

์ด๊ฒƒ์€ ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ๋ฐ ๋ธ”๋ก์— ๋Œ€ํ•œ async ์ฃผ์„์œผ๋กœ ์ธํ•ด ํ‰๊ฐ€๊ฐ€ ์ง€์—ฐ๋˜๊ณ  ๋Œ€์‹  ๋ฏธ๋ž˜๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • await ์—ฐ์‚ฐ์ž๋Š” async ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ๋ฏธ๋ž˜๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ ๋ฏธ๋ž˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์™ธ๋ถ€ ๋ฏธ๋ž˜๊ฐ€ ์ œ์–ด๋ฅผ ์–‘๋ณดํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ์ด์ „ ํ† ๋ก 

RFC:

์ถ”์  ๋ฌธ์ œ:

์•ˆ์ •ํ™”:

์ฃผ์š” ๊ฒฐ์ • ๋„๋‹ฌ

  • ๋น„๋™๊ธฐ ํ‘œํ˜„์‹์ด ํ‰๊ฐ€ํ•˜๋Š” ๋ฏธ๋ž˜๋Š” ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์–‘๋ณดํ•˜๊ธฐ ์ „์— ๋ณธ๋ฌธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๊ตฌ๋ฌธ์€ "์™ธ๋ถ€" ๋ฐ˜ํ™˜ ์œ ํ˜•(ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ‰๊ฐ€๋˜๋Š” ๋ฏธ๋ž˜ ์œ ํ˜•)๋ณด๋‹ค๋Š” "๋‚ด๋ถ€" ๋ฐ˜ํ™˜ ์œ ํ˜•(๋‚ด๋ถ€ return ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ์œ ํ˜•)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • await ์—ฐ์‚ฐ์ž์˜ ๊ตฌ๋ฌธ์€ ๋” ์ผ๋ฐ˜์ ์ธ await expression ๋˜๋Š” ๋‹ค๋ฅธ ๋Œ€์ฒด ๊ตฌ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ "์ ‘๋ฏธ์‚ฌ ์  ๊ตฌ๋ฌธ" expression.await ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์ž‘์—… ์ฐจ๋‹จ ์•ˆ์ •ํ™”

  • [x] async fns๋Š” ์—ฌ๋Ÿฌ ์ˆ˜๋ช…์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. #56238
  • [x] ์ƒ์„ฑ๊ธฐ ํฌ๊ธฐ๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. #52924
  • [ ] async/await ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๋ฌธ์„œ
  • [ ] ๋™์ž‘์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ…Œ์ŠคํŠธ

๋ฏธ๋ž˜ ์ž‘์—…

  • ๋น„ํ‘œ์ค€ ์ปจํ…์ŠคํŠธ์˜ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ: async ๋ฐ await ํ˜„์žฌ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด TLS์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ค๊ณ„์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋ฉฐ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฒฐ๊ตญ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ณ ์ฐจ ๋น„๋™๊ธฐ ํ•จ์ˆ˜: async ํด๋กœ์ € ๋ฆฌํ„ฐ๋Ÿด์— ๋Œ€ํ•œ ์ˆ˜์ •์ž๋กœ์„œ ์—ฌ๊ธฐ์—์„œ ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ช…์ด ์žˆ๋Š” ๋น„๋™๊ธฐ ํด๋กœ์ €๋ฅผ ํ†ตํ•œ ์บก์ฒ˜ ๋ฐ ์ถ”์ƒํ™”์™€ ๊ด€๋ จํ•˜์—ฌ ๋” ๋งŽ์€ ๋””์ž์ธ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํŠน์„ฑ ๋ฐฉ๋ฒ•: ์—ฌ๊ธฐ์—๋Š” ์ƒ๋‹นํ•œ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ์ž‘์—…์ด ํฌํ•จ๋˜์ง€๋งŒ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ: futures ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ Future ํŠธ๋ ˆ์ž‡์— ๋Œ€ํ•œ ์Œ์€ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž์ธ Stream ํŠธ๋ ˆ์ž‡์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์„ std ๋ฐ ์–ธ์–ด๋กœ ์กฐ์ž‘ํ•˜๋Š” ์ง€์›์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•œ ์žฅ๊ธฐ์  ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ๊ธฐ ํ‘œํ˜„ ์ตœ์ ํ™”: ์ƒ์„ฑ๊ธฐ ํ‘œํ˜„ ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ๋” ์™„๋ฒฝํ•œ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—„๊ฒฉํ•˜๊ฒŒ ์ตœ์ ํ™” ๋ฌธ์ œ์ด๋ฉฐ ์˜๋ฏธ์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

๋น„์ฐจ๋‹จ IO๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ณ ์„ฑ๋Šฅ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ์‚ฌ์šฉ์ž์˜ ์ƒ๋‹นํ•œ ๊ด€์‹ฌ์„ ๋ฐ›๊ณ  ์žˆ๋Š” Rust์˜ ๋Œ€์ƒ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋น„์ฐจ๋‹จ IO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ธ์ฒด ๊ณตํ•™์ ์ด๊ณ  ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์†”๋ฃจ์…˜์€ ์˜ค๋žซ๋™์•ˆ Rust์˜ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค. async/await ๊ธฐ๋Šฅ์€ ์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์˜ ์ •์ ์ž…๋‹ˆ๋‹ค.

1.0 ์ด์ „์—๋Š” Rust๊ฐ€ ๋น„์ฐจ๋‹จ IO ์œ„์— ๊ตฌ์ถ•๋œ ๋Œ€์•ˆ์ ์ธ ์–ธ์–ด ์ˆ˜์ค€ ์Šค๋ ˆ๋”ฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ทธ๋ฆฐ์Šค๋ ˆ๋”ฉ ์‹œ์Šคํ…œ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์‹œ์Šคํ…œ์€ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์–ธ์–ด ๋Ÿฐํƒ€์ž„ ๋„์ž…, FFI ์˜ค๋ฒ„ํ—ค๋“œ์— ํฌ๊ฒŒ ์ถ”๊ฐ€, ๊ทธ๋ฆฐ์Šค๋ ˆ๋“œ ์Šคํƒ ๊ตฌํ˜„๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋ฏธํ•ด๊ฒฐ ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

๊ทธ๋ฆฐ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ Rust ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์„ฑ์›์€ ๋ฏธ๋ž˜ ์ถ”์ƒํ™”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋Œ€์ฒด ์†”๋ฃจ์…˜ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์•ฝ์†์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” future๋Š” ๋น„์ฐจ๋‹จ IO์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜ ์ถ”์ƒํ™”๋กœ์„œ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋งค์šฐ ์„ฑ๊ณต์ ์ด์—ˆ๊ณ  ์žฅ๊ธฐ์ ์œผ๋กœ ๊ทธ๊ฒƒ๋“ค์€ async/await ๊ตฌ๋ฌธ์— ์ž˜ ๋งคํ•‘๋˜์–ด ์™„์ „ํžˆ ๋ณด์ด์ง€ ์•Š๋Š” ๊ทธ๋ฆฐ์Šค๋ ˆ๋”ฉ ์‹œ์Šคํ…œ.

Future ์ถ”์ƒํ™” ๊ฐœ๋ฐœ์˜ ์ฃผ์š” ๋ŒํŒŒ๊ตฌ๋Š” ํˆฌํ‘œ ๊ธฐ๋ฐ˜ ์„ ๋ฌผ ๋ชจ๋ธ์˜ ๋„์ž…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ฏธ๋ž˜ ์ž์ฒด๋Š” ์ฝœ๋ฐฑ์ด ์™„๋ฃŒ๋  ๋•Œ ์‹คํ–‰๋˜๋„๋ก ์Šค์ผ€์ค„๋งํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋Š” ๋ฐ˜๋ฉด, Rust๋Š” ์‹คํ–‰์ž๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ์™„๋ฃŒ๊นŒ์ง€ ํด๋งํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋Š” ํด ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. future๋Š” ์‹คํ–‰์ž์—๊ฒŒ Waker ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ์ง„ํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ Rustc๊ฐ€ ํฌ๊ธฐ์™€ ๊ฐ„์ ‘ ์ฐธ์กฐ ๋ฉด์—์„œ ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ๋ฏธ๋ž˜๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋น„ํ•ด ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰๊ธฐ ๋ฐ ๋ฆฌ์•กํ„ฐ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ธ์–ด ๋Ÿฐํƒ€์ž„์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ธ€๋กœ๋ฒŒ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์–ธ์–ด ์ˆ˜์ค€์—์„œ ๋ธ”๋ž™๋ฐ•์Šค ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋Œ€์‹  ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์˜ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ๋ฐ ๋Œ€๊ธฐ ์—ฐ์‚ฐ์ž์˜ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ์–ธ์–ด์— ๋™์‹œ์„ฑ์„ ๊ตฝ๋Š” ๋Œ€์‹  ๋ชจ๋“  ๋™์‹œ์„ฑ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋™์‹œ์„ฑ์„ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๋™์‹œ์„ฑ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์†Œ์Šค ํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ€์‹œ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ์ค‘์ธ ์„ ๋ฌผ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์‚ญ์ œ๋˜๋„๋ก ํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ ๋ฌผ์„ ๋ฌด๋ฃŒ๋กœ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ์‹คํ–‰์ž ๋ฐ ๋™์‹œ์„ฑ ๊ธฐ๋ณธ ์š”์†Œ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๋ฐ ์ฝ”๋“œ ๋ช…ํ™•์„ฑ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(๋งˆ์ง€๋ง‰ ๋‘ ๊ฐ€์ง€ ์ ์€ ๋˜ํ•œ ์‚ฌ์‹ค์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜จ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์˜ ์›์ธ์ด ๋˜๋ฉฐ ํ•ด๋‹น ์–ธ์–ด์—์„œ ๊ธฐ๋Œ€๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ๋ชจ๋‘ ์„ค๋ฌธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์˜ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋ช…ํ•œ ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ดํ•ดํ•˜๋ฉด ์œ ์ตํ•œ ์†์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋ก  ์กฐ์‚ฌ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์€ ์ฐธ์กฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ์‹ฌ๊ฐํ•œ ์ธ์ฒด ๊ณตํ•™์  ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ, ์–‘๋ณด์ ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ์•ˆ์ „ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ˜ธ, ๋ฎคํ…์Šค ๋ฐ ์ด๋™ ํด๋กœ์ €๋กœ ๊ฐ€๋“ ์ฐฌ ๋ณต์žกํ•˜๊ณ  ์žก์Œ์ด ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์ด ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์—„๊ฒฉํ•˜๊ฒŒ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ œ์ณ๋‘๊ณ ๋„ ์–ธ์–ด ์ˆ˜์ค€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์—†์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋„๋กœ ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ์„ ์ž‘์„ฑํ•˜๋Š” ์Šคํƒ€์ผ๋กœ ํ“จ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” yield point์—์„œ ์ฐธ์กฐ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์„ ์ง€์›ํ•˜๋Š” async/await ๊ตฌ๋ฌธ ์„คํƒ•์„ ์ถ”๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์›ํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ yield point์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” Pin ์ถ”์ƒํ™”๋ฅผ ๋„์ž…ํ•œ ํ›„, ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ํด ๊ธฐ๋ฐ˜ ํ“จ์ฒ˜๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ async/await ๊ตฌ๋ฌธ์„ ๊ฐœ๋ฐœํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์„ ํ†ตํ•ด ๋น„๋™๊ธฐ IO์˜ ์„ฑ๋Šฅ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ช…๋ นํ˜• ์ฝ”๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋ฏธ๋ž˜. ๊ทธ ๋งˆ์ง€๋ง‰ ๊ธฐ๋Šฅ์€ ์ด ์•ˆ์ •ํ™” ๋ณด๊ณ ์„œ์˜ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ/๋Œ€๊ธฐ ๊ธฐ๋Šฅ ์„ค๋ช…

async ์ˆ˜์ •์ž

async ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ ๋‘ ์œ„์น˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ธ”๋ก ํ‘œํ˜„์‹ ์ „์—.
  • ๊ณ ์œ ํ•œ impl์—์„œ ์ž์œ  ํ•จ์ˆ˜ ๋˜๋Š” ๊ด€๋ จ ํ•จ์ˆ˜ ์•ž์—.

_(๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋‹ค๋ฅธ ์œ„์น˜ - ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋กœ์ € ๋ฆฌํ„ฐ๋Ÿด ๋ฐ ํŠน์„ฑ ๋ฉ”์„œ๋“œ๋Š” ์•ž์œผ๋กœ ๋” ๊ฐœ๋ฐœ๋˜๊ณ  ์•ˆ์ •ํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)_

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์—์„œ ์„ ๋ฌผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋™์‹œ ์‹คํ–‰ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋  ๋•Œ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ฒซ ๋ฒˆ์งธ ๋Œ€๊ธฐ ์ง€์ ๊นŒ์ง€ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋™์•ˆ ์‹คํ–‰๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ํด๋ง์ด ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ณธ๋ฌธ์˜ ์ฒซ ๋ฒˆ์งธ ๋Œ€๊ธฐ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํด๋ง ์ค‘์— ์‹คํ–‰๋˜๊ณ  ๊ตฌ์„ฑ ์ค‘์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ:

  • RFC 2394์— ๋Œ€ํ•œ ์˜๊ฒฌ(๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ๋งŽ์€ ๊ด€๋ จ ์˜๊ฒฌ)

๋ฐ˜ํ™˜ ์œ ํ˜• ๊ตฌ๋ฌธ

๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๊ตฌ๋ฌธ์€ "์™ธ๋ถ€" ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์•„๋‹Œ "๋‚ด๋ถ€" ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ์œ ํ˜•์˜ ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ตœ์ข…์ ์œผ๋กœ ํ‰๊ฐ€ํ•  ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ์ˆ˜์ค€์—์„œ ์ด๊ฒƒ์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ช…ํ™•์„ฑ์ด ์„ ํ˜ธ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ์„œ๋ช…์—๋Š” 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 ์ˆ˜์ •์ž๋ฅผ ์ง€์›ํ•˜์—ฌ ์ต๋ช…์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ€์ˆ˜ ์บก์ฒ˜์˜ ํŠน์„ฑ์€ ๋น„๋™๊ธฐ ํด๋กœ์ €์—์„œ ๋” ๋ณต์žกํ•ด์ง€๋ฉฐ ์ผ๋ถ€ ๊ตฌ๋ฌธ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž…๋ ฅ ์ˆ˜๋ช…์ด ์žˆ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์ถ”์ƒํ™”๋Š” ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ผ๋ถ€ ์ถ”๊ฐ€ ์–ธ์–ด ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์„ฑ๋ณ‘ ์ง€์›

await ์—ฐ์‚ฐ์ž์˜ ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” TLS๊ฐ€ ๋‚ด๋ถ€ ๋ฏธ๋ž˜๋ฅผ ํด๋งํ•  ๋•Œ ๊นจ์šฐ๊ธฐ๋ฅผ ์•„๋ž˜์ชฝ์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ TLS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ๊ตฌ๋ฌธ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” "ํ•ดํ‚น"์ž…๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ TLS ์‚ฌ์šฉ์„ ์•ฝ์†ํ•  ์ƒ๊ฐ์ด ์—†์œผ๋ฉฐ ๊นจ์šฐ๊ธฐ๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒํƒœ ๋จธ์‹  ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ๋” ๋งŽ์ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ TLS ์ง€์›์ด ์—†๋Š” ์‹œ์Šคํ…œ์—์„œ async/await ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•˜๋ฏ€๋กœ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ˆ˜ํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ค๊ณ„์˜ ์–ด๋–ค ๊ฒƒ๋„ TLS ์‚ฌ์šฉ์„ ์š”๊ตฌ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํŠน์„ฑ ๋ฉ”์„œ๋“œ

ํ˜„์žฌ ํŠน์„ฑ์—์„œ ๋น„๋™๊ธฐ ๊ด€๋ จ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. fn ๋Š” ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ async fn ๋Š” ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋ถ„๋ช…ํžˆ ๊ฐ•๋ ฅํ•œ ์ถ”์ƒํ™”์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ง€์›ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋ฏธ๋ž˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ฐ๊ฒฐ๋œ ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜๋Š” ์ƒํƒœ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ๋ฏธ๋ž˜ ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฏธ๋ž˜๋Š” ๋ชจ๋“  ์ž…๋ ฅ์„ ์บก์ฒ˜ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ž…๋ ฅ ์ˆ˜๋ช… ๋˜๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ํ•ด๋‹น ์ƒํƒœ์—์„œ ์บก์ฒ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ์›ํ–ˆ์ง€๋งŒ ์•„์ง ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ธ ์ผ๋ฐ˜ ๊ด€๋ จ ์œ ํ˜• ์ด๋ผ๋Š” ๊ฐœ๋…๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์˜ ํ™•์ธ์€ ์ œ๋„ค๋ฆญ ๊ด€๋ จ ํ˜•์‹์˜ ํ™•์ธ๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋›ฐ์–ด๋‚œ ๋””์ž์ธ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์ผํ•œ ์„œ๋ช…์„ ๊ฐ€์งˆ ๋ฏธ๋ž˜ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ, ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ถ”์ƒํ™”ํ•  ๋•Œ ์ผ๋ถ€ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ํ“จ์ฒ˜๊ฐ€ ์ž๋™ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ž๋™ ํŠน์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ์ตœ์†Œํ•œ์˜ ์ง€์›๋งŒ ์žˆ์œผ๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ "๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๊ฒŒ" ๋งŒ๋“œ๋Š” ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ™์€ ํ–ฅํ›„ ํ™•์žฅ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์„ค๊ณ„ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ ๋ฐ ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ

๋™์ผํ•œ ์ฝ”๋ฃจํ‹ด ์ƒํƒœ ๋จธ์‹  ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถˆ์•ˆ์ •ํ•œ ์ƒ์„ฑ๊ธฐ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ๋ถ„๋ช…ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์Œ์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "๋ฐ˜๋ณต์ž"๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์„ ๋ฌผ. ์œ ์‚ฌํ•˜๊ฒŒ, ์šฐ๋ฆฌ๋Š” ์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ธฐ ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, "์ŠคํŠธ๋ฆผ"์œผ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ํ•จ์ˆ˜(๋ฐ˜๋ณต์ž์™€ ๋™์ผํ•œ ๋น„๋™๊ธฐ)์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ์ด์— ๋Œ€ํ•œ ์ •๋ง ๋ช…ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ข…์ข… ์‹œ์Šคํ…œ ๊ฐ„์— ์ „์†ก๋˜๋Š” ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ๋Š” ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๋Š” ๋งค์šฐ ์œ ์—ฐํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ๋ฐฉํ˜• ์„ค๊ณ„ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API ์ธก๋ฉด์—์„œ Rust์˜ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ตœ์ข… ๋””์ž์ธ์€ ์•„์ง ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฉฐ ๋ถˆํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

A-async-await AsyncAwait-Focus F-async_await I-nominated T-lang disposition-merge finished-final-comment-period

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์œ„ ์˜ ๋ณ‘ํ•ฉ ์ฒ˜๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์ตœ์ข… ์˜๊ฒฌ ์ˆ˜๋ ด ๊ธฐ๊ฐ„์ด ์ด์ œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค .

๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์˜ ์ž๋™ํ™”๋œ ๋Œ€ํ‘œ์ž๋กœ์„œ ๋‚˜๋Š” ๊ทธ๋“ค์˜ ์ž‘์—…์— ๋Œ€ํ•ด ์ €์ž์™€ ๊ธฐ์—ฌํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

RFC๋Š” ๊ณง ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  58 ๋Œ“๊ธ€

@rfcbot fcp ๋ณ‘ํ•ฉ

ํŒ€์› @withoutboats ๊ฐ€ ์ด๋ฅผ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์›์ด ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • [x] @์„ผํŠธ๋ฆด
  • [x] @cramertj
  • [x] @eddyb
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [ ] @pnkfelix
  • [x] @scottmcm
  • [x] @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์˜ ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค .

  • ๋‹ค์ค‘ ์ˆ˜๋ช… ๋ฌธ์ œ๋Š” #61775๋กœ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํฌ๊ธฐ ๋ฌธ์ œ๋Š” ๋” ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋” ๋งŽ์€ ์ตœ์ ํ™” ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ๊ฒƒ์ด์ง€๋งŒ ๋ช…๋ฐฑํ•œ ๊ธฐํ•˜๊ธ‰์ˆ˜์  ์ฆ๊ฐ€๋ฅผ ํ”ผํ•˜๋Š” ๋‚ฎ์€ ๊ต์ˆ˜ํ˜• ๊ฒฐ๊ณผ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์ด๋กœ ์ธํ•ด ์ด ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋ฌธ์„œ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฃผ์š” ์žฅ์• ๋ฌผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. @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 ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋””์ž์ธ์„ ์„ ํ˜ธํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ™•์‹คํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ˜ธ์ถœํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ non-async unsafe fns์˜ ๋™์ž‘๊ณผ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ผ๋ฐ˜์ ์œผ๋กœ unsafe๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋” ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์œ ์ง€ํ•˜๋Š” ์ผ๋ถ€ ๋ถˆ๋ณ€์— ์˜์กดํ•˜๋Š” ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ์ฆ‰, "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ"์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "๋ถˆ๋ณ€์„ฑ์ด ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋Š” ๊ณณ"์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์„ ํƒ๋˜๊ณ  ๊ฒ€์ฆ๋œ ์‹œ์ ๊ณผ ๋ณ„๋„๋กœ ๋Œ€๊ธฐ ์‚ฌ์ดํŠธ์—์„œ๋ณด๋‹ค ์ธ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์ง€์ •๋œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ๋ถˆ๋ณ€๋Ÿ‰์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋งค์šฐ ์ •์ƒ์ด๋ฉฐ, ๋‹ค๋ฅธ ์•ˆ์ „ํ•œ ๊ธฐ๋Šฅ์ด ์ •ํ™•ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ์ผ๋ถ€ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  3. ์ด๋Š” async ์ˆ˜์ •์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ–ฅํ›„ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์„œ๋ช…์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋Š” async fn ์„œ๋ช…์˜ ๋””์Šˆ๊ฐ€๋ง ๊ฐœ๋…๊ณผ ๋” ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋Œ€์•ˆ์€ ๋‹จ๊ธฐ ๋˜๋Š” ์ค‘๊ธฐ(๋ช‡ ๋…„์„ ์˜๋ฏธ)์— ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค๊ณ„๋œ Rust ์–ธ์–ด๋กœ ํด๋งํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฏธ๋ž˜๋ฅผ ๋งŒ๋“ค ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ "ํšจ๊ณผ๋กœ์„œ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€"์€ ๊ด‘๋ฒ”์œ„ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ์˜ค๋Š˜๋‚  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ(์˜ˆ: ์ •์ƒ์ ์ธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ ๋ฐ ๋ธ”๋ก)๊ณผ ์—ญํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. async unsafe fns๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ํ•ด๋‹น ํ™˜๊ฒฝ์ด ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด, ํ˜„์žฌ unsafe์— ๋Œ€ํ•œ ํ•ด์„์— ๋”ฐ๋ฅธ async unsafe fns๋Š” ๋‹จ๊ธฐ ๋ฐ ์ค‘๊ธฐ์ ์œผ๋กœ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@rfcbot ask lang "์•ˆ์ •ํ™” async unsafe fn์„ ํ˜ธ์ถœํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ async fn์œผ๋กœ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?"

rfcbot์œผ๋กœ ์„ค๋ฌธ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์ง€๋งŒ ์ ์–ด๋„ ์ง€๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

@withoutboats ํŒ€ ๊ตฌ์„ฑ์›์ด T-lang์— ๋‹ค์Œ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.

"๋ถˆ์•ˆ์ •ํ•œ ๋น„๋™๊ธฐ fn ์•ˆ์ •ํ™”๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋น„๋™๊ธฐ fn์œผ๋กœ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?"

  • [x] @์„ผํŠธ๋ฆด
  • [x] @cramertj
  • [x] @eddyb
  • [ ] @joshtriplett
  • [x] @nikomatsakis
  • [ ] @pnkfelix
  • [ ] @scottmcm
  • [x] @withoutboats

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

์—ฌ๊ธฐ ๋‚ด ๋‘ ์„ผํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @cramertj ์˜ ์„ค๋ช…(https://github.com/rust-lang/rust/issues/62149#issuecomment-510166207)์„ ๋ณด๋ฉด 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 ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ํ˜„์žฌ ์ž˜๋ชป๋œ ์ปดํŒŒ์ผ์€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰