Rust: Apple ์•ฑ ์Šคํ† ์–ด ๋น„ํŠธ์ฝ”๋“œ ์ง€์›

์— ๋งŒ๋“  2016๋…„ 08์›” 24์ผ  ยท  89์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

Bitcode๋Š” Apple ์•ฑ ๋ฐฐํฌ์˜ ๋ฏธ๋ž˜์ด๋ฉฐ ํ˜„์žฌ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Apple์ด ์›ํ•˜๋Š” LLVM ๋ฒ„์ „์„ ์„ ํƒํ•˜๊ณ  ๋ณ€๋•์— ๋”ฐ๋ผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ•„์š”๊ฐ€ ์žˆ๊ณ  Apple์ด ๊ฒฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๊ฐ•์š”ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— LLVM์„ ๊ทธ๋“ค์˜ ๊ฒƒ๊ณผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

  • Apple ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์™„์ „ํžˆ ๋ณ„๋„์˜ ๋„๊ตฌ ์ฒด์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” LLVM์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋„๋ก rustc๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , rust-llvm ํŒจํ‚ค์ง€์™€ ์„ ํƒ ์‚ฌํ•ญ์ธ rust-llvm-apple ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ , rustc๋Š” ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๊ณผ LLVM์„ ๋กœ๋“œํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” rustc_llvm_apple ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‘ ๊ฐœ์˜ ์ „์ฒด LLVM์„ ํ•ญ์ƒ rustc์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚ ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค
  • ์šฐ๋ฆฌ๋Š” Rustc-apple์ด๋ผ๋Š” Rustc ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์„ ํƒ์ ์ธ rustc-apple ํŒจํ‚ค์ง€๋กœ ๋ฐฐ์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Rustc_llvm์— ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  rustc_llvm_apple์— ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ •ํ™•ํžˆ rustc์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Rustc๊ฐ€ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์™„์ „ํžˆ rustc-apple ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ๋กœ ์ด ์†”๋ฃจ์…˜์„ ์ƒ๋‹นํžˆ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๊ทธ๋“ค์˜ ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ์ฝ”๋“œ ์†Œ๋…์ œ๋ฅผ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณต ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” RenderScript๊ฐ€ ์ด๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” LLVM ๋™์  ๋กœ๋”ฉ๊ณผ defer-to-alternate-rustc ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์œ ๋งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ https://users.rust-lang.org/t/ios-rust-integration/6928/4

cc @bluejekyll

A-LLVM A-rustbuild C-enhancement E-hard O-ios T-compiler T-dev-tools

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

rustc nightly-2019-09-05 aarch64-apple-ios and rustflags = "-C lto -Z embed-bitcode" staticlib๋ฅผ clang-1100.0.33.5 (Xcode 11 beta 7) and -fembed-bitcode ์•ฑ๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋Š” https://github.com/saturday06/rust-ios-bitcode-test ์ž…๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” LLVM์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋„๋ก rustc๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , rust-llvm ํŒจํ‚ค์ง€์™€ ์„ ํƒ ์‚ฌํ•ญ์ธ rust-llvm-apple ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ , rustc๋Š” ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๊ณผ LLVM์„ ๋กœ๋“œํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

LLVM์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. LLVM API๋Š” ๋น„ํŠธ์ฝ”๋“œ๋ณด๋‹ค ๋œ ์•ˆ์ •์ ์ด๋ฉฐ LLVM xy์— ๋Œ€ํ•ด ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ xy ๋Œ€์‹  LLVM xz๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ์˜ ํ™•์‹คํžˆ rustc๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ LLVM์— ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค( --llvm-root ์ด๋ฏธ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ).

์šฐ๋ฆฌ๋Š” rustc_llvm_apple ํฌ๋ ˆ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋‘ ๊ฐœ์˜ ์ „์ฒด LLVM์„ ํ•ญ์ƒ rustc์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚ ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

์‚ฌ๊ณผ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์‹œ์Šคํ…œ LLVM(์ •์ ์œผ๋กœ)์„ ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ ์ด๋ฏธ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๊ทธ๋“ค์˜ ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ์ฝ”๋“œ ์†Œ๋…์ œ๋ฅผ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณต ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” RenderScript๊ฐ€ ์ด๊ฒƒ์„ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”... ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋Š” LLVM ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์ด LLVM ๋ฒ„์ „ ๊ฐ„์— ๋‹ค์†Œ ์•ˆ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ณผ๋Š” ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด์ƒํ•œ ์ผ์„ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์ด LLVM์ด ์•„๋‹Œ(์˜ˆ: ์‚ฌ๊ณผ ๊ด€๋ จ ํ•ญ๋ชฉ์ด ์žˆ์Œ) ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?


2013๋…„์— LLVM ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„๋‹ค๋Š” ๋ง์„ ๋“ค์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. iOS์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐฐํฌ๊ฐ€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ Apple์ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” LLVM ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์—ฌ์ „ํžˆ ์˜ค๋ž˜๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์‹คํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ™”๋ฌผ ๋นŒ๋“œ ๋™์•ˆ ์ถœ๋ ฅ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„ํŠธ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด llvm-๋งํฌ๋ฅผ ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋น„ํŠธ์ฝ”๋“œ์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” LLVM ๋ฒ„์ „์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์ง€๋งŒ ๋‚ด ์ƒ๊ฐ์—๋Š” ๋‹ค๋ฅธ LLVM ๋ฒ„์ „ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ฉ์ฒญํ•œ ๋ฒ„์ „ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด, ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ž˜๋ชป๋œ ์ผ์„ ํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋ณผ ์‹œ๊ฐ„์ด์žˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋‚ด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

llvm-link์˜ ์ •ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์œผ๋ฉด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bluejekyll LLVM์˜ ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ๋งŽ์€ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ(์˜ˆ: llvm-dis-3.8/opt-3.8์€ 3.2์—์„œ 3๋…„ ๋œ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์„ ์ž˜ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค), ์ผ๋ถ€ ์‚ฌ๊ณผ ํ•ญ๋ชฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๊ณผ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์‹œ์Šคํ…œ LLVM(์ •์ ์œผ๋กœ)์„ ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ ์ด๋ฏธ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ง๋ณด๋‹ค ์‰ฝ์ง€๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ, App Store ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์œ ์ผํ•œ ์ถ•๋ณต๋ฐ›์€ apple-llvm ๋ฒ„์ „์€ ํ˜„์žฌ Xcode์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์ž ์žฌ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ LLVM ๋ฒ„์ „์— ๋Œ€ํ•œ LLVM ๋ฐ”์ธ๋”ฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(๋ฐ˜๋“œ์‹œ ์ธ์ ‘ํ•œ ๋‘ ๊ฐœ์˜ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ผ ํ•„์š”๋Š” ์—†์Œ). ์ด์ „ ๋ฒ„์ „์˜ apple-llvm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Apple์ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” LLVM ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์—ฌ์ „ํžˆ ์˜ค๋ž˜๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์ด ์ตœ์‹  Xcode๊ฐ€ ์•ฑ์„ ์ œ์ถœํ•˜๋„๋ก ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ์ด๊ฒƒ์„ ํ”ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ๋‹ค์†Œ ์—‰๋šฑํ•œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ง€์ €๋ถ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋Œ€์ƒ์ด codegen ๋™์ž‘์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ณ  Apple codegen ๊ฒฝ๋กœ๊ฐ€ ๋™์  ํฌ๋ ˆ์ดํŠธ์— ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (apple-llvm์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ ์ผ๋ฐ˜ codegen ๊ฒฝ๋กœ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.)

์ด ๋ฒ„๊ทธ๊ฐ€ App Store๋ฅผ ์–ธ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (์ฆ‰, ํ˜„์žฌ panic=abort ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)

LLVM์˜ ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ๋งŽ์€ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ(์˜ˆ: llvm-dis-3.8/opt-3.8์€ 3.2์—์„œ 3๋…„ ๋œ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์„ ์ž˜ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค), ์ผ๋ถ€ ์‚ฌ๊ณผ ํ•ญ๋ชฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@nagisa ์•Œ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์•„์ง ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ํฌ๋ง๊ณผ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํฌ๋ง์„ ์ค๋‹ˆ๋‹ค.

@ricky26 ์ข‹์€ ์ .

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, App Store ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์œ ์ผํ•œ ์ถ•๋ณต๋œ apple-llvm ๋ฒ„์ „์€ ํ˜„์žฌ Xcode์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

Apple์˜ Xcode LLVM์€ ์‹œ์Šคํ…œ LLVM๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋•Œ Xcode LLVM์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. Rustc ์—ด์ฐจ๋ฅผ ๋ฐฐ์†กํ•  ๋•Œ xcode๊ฐ€ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  Apple์ด ์ž‘์—…ํ•˜๋Š” ๋ฐฉ์‹์€ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ๋ฒ„์ „์˜ rustc๋กœ ์œ ํšจํ•œ ์‚ฌ๊ณผ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์ œํ•˜๊ณ  ๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ์˜ ์•ˆ์ •์„ฑ ์Šคํ† ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์ด์ ์„ ์ฐฝ ๋ฐ–์œผ๋กœ ๋˜์ง€๋„๋ก ๊ฐ•์š”ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ์ž ์žฌ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ LLVM ๋ฒ„์ „์— ๋Œ€ํ•œ LLVM ๋ฐ”์ธ๋”ฉ์„ ์œ ์ง€ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ LLVM ๋ฒ„์ „ 3.7์—์„œ 3.9(๋ฐ ์ž ์žฌ์ ์œผ๋กœ ํŠธ๋ ํฌ)์— ๋Œ€ํ•œ ์ง€์›์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Xcode์˜ LLVM์ด ๊ณ ๋Œ€ ๋ฒ„์ „์ด ์•„๋‹Œ ํ•œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ์ ์—์„œ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Xcode LLVM์ด ์‹ค์ œ๋กœ ๊ณ ๋Œ€/์‚ฌ์šฉ์ž ์ •์˜/๊ธฐํƒ€ ๋ฒ„์ „์ด๋ผ๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์ „ํ˜€ ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ํŠนํžˆ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด _that_ LLVM์— ํŒจ์น˜๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Apple์ด 2038๋…„๊นŒ์ง€ Xcode LLVM์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ 3.7์„ ์˜์›ํžˆ ์ง€์›ํ•˜๋„๋ก rustc๋ฅผ ์ž ๊ทธ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ยน: ๊ทธ๋Ÿฌ๋‚˜ Rustc๊ฐ€ LLVM xy์— ๋Œ€ํ•ด ๋นŒ๋“œ๋œ ๊ฒฝ์šฐ LLVM xy์— ์ •ํ™•ํžˆ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

LLVM์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. LLVM API๋Š” ๋น„ํŠธ์ฝ”๋“œ๋ณด๋‹ค ๋œ ์•ˆ์ •์ ์ด๋ฉฐ LLVM xy์— ๋Œ€ํ•ด ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ xy ๋Œ€์‹  LLVM xz๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ์˜ ํ™•์‹คํžˆ rustc๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ LLVM์— ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: --llvm-root๊ฐ€ ์ด๋ฏธ ํ•˜๊ณ  ์žˆ์Œ).

@nagisa C++ API๋Š” ๋ถˆ์•ˆ์ •ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” C API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ LLVM์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. API ์ง€์› ์ธก๋ฉด์—์„œ ์ฐจ์ด์ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๊ณผ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์‹œ์Šคํ…œ LLVM(์ •์ ์œผ๋กœ)์„ ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ ์ด๋ฏธ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  Apple ํ”Œ๋žซํผ์— ๋Œ€ํ•ด Apple์˜ LLVM์„ ์ผ๊ด„ ๋ฐฐ์†กํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ฐ์Šคํฌํ†ฑ ๊ธฐ๊ณ„ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•ด LLVM์„ Apple์— ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ Apple์ด ์•„๋‹Œ ํ˜ธ์ŠคํŠธ์—์„œ iOS ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ์˜ต์…˜์„ ๋ฐฐ์ œํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”... ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋Š” LLVM ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์ด LLVM ๋ฒ„์ „ ๊ฐ„์— ๋‹ค์†Œ ์•ˆ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ณผ๋Š” ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด์ƒํ•œ ์ผ์„ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์ด LLVM์ด ์•„๋‹Œ(์˜ˆ: ์‚ฌ๊ณผ ๊ด€๋ จ ํ•ญ๋ชฉ์ด ์žˆ์Œ) ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?

๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์€ ๋ฒ„์ „ ๊ฐ„์— ์•ˆ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

iOS์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐฐํฌ๊ฐ€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์˜ค๋Š˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ ๊ณ„์† ์ง€์›๋ ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ์ž ์žฌ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ LLVM ๋ฒ„์ „์— ๋Œ€ํ•œ LLVM ๋ฐ”์ธ๋”ฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(๋ฐ˜๋“œ์‹œ ์ธ์ ‘ํ•œ ๋‘ ๊ฐœ์˜ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ผ ํ•„์š”๋Š” ์—†์Œ). ์ด์ „ ๋ฒ„์ „์˜ apple-llvm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ricky26 ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ LLVM ๊ฐ„์— ํ˜ธํ™˜์„ฑ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Apple๊ณผ ์šฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์ง€ ์•Š๋Š” ํ•œ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ถ„ํ• ์„ ๋„˜์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ํฐ ํŒŒ์†์˜ ์œ„ํ—˜์ด ํ•ญ์ƒ ์กด์žฌํ•˜๋ฉฐ ์ฃผ์š” API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Xcode์˜ LLVM์ด ๊ณ ๋Œ€ ๋ฒ„์ „์ด ์•„๋‹Œ ํ•œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ์ ์—์„œ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€์—์„œ https://gist.github.com/yamaya/2924292 :

clang-700.0.72 => LLVM 3.7.0
clang-700.1.76 => LLVM 3.7.0
clang-700.1.81 => LLVM 3.7.0
clang-703.0.29 => LLVM 3.8.0
clang-703.0.31 => LLVM 3.8.0

C++ API๋Š” ๋ถˆ์•ˆ์ •ํ•˜์ง€๋งŒ C API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ LLVM์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. API ์ง€์› ์ธก๋ฉด์—์„œ ์ฐจ์ด์ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Rustllvm์˜ ํ˜•ํƒœ๋กœ C++ API์— ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ”์ธ๋”ฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ LLVM ๋ฒ„์ „์— ๋”ฐ๋ผ ๋ž˜ํผ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐ ์ปดํŒŒ์ผ๋œ LLVM์˜ ๋ฒ„์ „์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋™์  ๋ง์ปค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋” ์‹ฌํ•˜๊ฒŒ๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Apple์ด ์•„๋‹Œ ํ˜ธ์ŠคํŠธ์—์„œ iOS ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ์˜ต์…˜์„ ๋ฐฐ์ œํ•ฉ๋‹ˆ๋‹ค.

Apple์ด LLVM ํฌํฌ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ƒ์„ฑ๋œ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์œ ์‚ฌํ•œ ํฌํฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋‚ด๋ถ€ ํŒจ์น˜๋ฅผ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์€ ๋ฒ„์ „ ๊ฐ„์— ์•ˆ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ยน: ํŠนํžˆ 3.2 ์‹œ๋ฆฌ์ฆˆ์˜ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ž‘์€ ํ‘œ๋ณธ์ผ์ง€๋ผ๋„ 3.8 LLVM๊ณผ ์—ฌ์ „ํžˆ ํ˜ธํ™˜๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ.

๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • Xcode๋Š” ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ libLLVM(์ •์  ๋˜๋Š” ๋™์ )๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š๊ณ  LLVM์— ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” libclang.dylib๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • Apple์€ https://opensource.apple.com์˜ '๊ฐœ๋ฐœ์ž ๋„๊ตฌ' ์•„๋ž˜์— ์žˆ๋Š” 'clang'(LLVM ํฌํ•จ)์œผ๋กœ ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ํ•ด๋‹น ์‚ฌ์ดํŠธ๋Š” ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐ ์˜์›ํžˆ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ ๊ฐ€ ์žˆ๋Š” ์ž์ฒด LLVM ํฌํฌ๊ฐ€ ์žˆ๋Š” Swift์˜ ๊ฒฝ์šฐ ์ด์•ผ๊ธฐ๊ฐ€ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์ง€๋งŒ Xcode์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ฒƒ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (Xcode์™€ ํ•จ๊ป˜ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ ์ฒด์ธ ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋„๊ตฌ ์ฒด์ธ์œผ๋กœ ๋นŒ๋“œ๋œ ํ”„๋กœ์ ํŠธ๋Š” App Store์— ์ œ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

cc @rust-lang/์ปดํŒŒ์ผ๋Ÿฌ

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ณ„ํš์ธ์ง€ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋…ธ ์•ค ๊ณ .

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ Unity์˜ ๋Œ€๋‹ต์€ ๋ชจ๋“  IL ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ C++ ์ฝ”๋“œ๋กœ ๋นŒ๋“œํ•˜๋Š” il2cpp์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ golang ๋ฒ„๊ทธ: https://github.com/golang/go/issues/12682; LLVM go ๋„๊ตฌ ์ฒด์ธ(ํ‘œ์ค€ go ๋„๊ตฌ ์ฒด์ธ๋งŒํผ ๊ธฐ๋Šฅํ•˜์ง€ ์•Š์Œ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด๋กœ Apple ์™ธ๋ถ€์˜ ๋น„ํŠธ์ฝ”๋“œ ์ง€์›์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ ์ ˆํ•œ Mono๋Š” Apple LLVM์„ ํ†ตํ•ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. http://tirania.org/blog/archive/2015/Sep-02.html

ํ•œ ๊ฐ€์ง€ ๊ฑธ๋ฆผ๋Œ์€ ๋น„ํŠธ์ฝ”๋“œ๋กœ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋…ธ ์ด์•ผ๊ธฐ๋ฅผ ์œ„ํ•ด ๋‚˜๋Š” Mono๊ฐ€ ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด Miguel de Icaza์™€ ๋น ๋ฅธ ๊ตํ™˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค: https://twitter.com/mitsuhiko/status/769458873237434368

@mitsuhiko iOS ๋ฐ tvOS์—์„œ๋Š” ๋น„ํŠธ์ฝ”๋“œ๋กœ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ _ํ•  ์ˆ˜_ ์žˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ watchOS๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์›€์ง์ž„์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋น„ํŠธ์ฝ”๋“œ ์ง€์› ๊ณ„ํš ์—†์ด iOS์—์„œ Rust๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ์€ ์ด๋Ÿฐ ์˜ต์…”๋„์„ ์ƒ๋‹นํžˆ ๊ฐ‘์ž๊ธฐ ๋น„ ์˜ต์…”๋„๋กœ ๋งŒ๋“  ์—ญ์‚ฌ๊ฐ€ ์žˆ๊ณ  ์‹ค์ œ๋กœ ๋น„ํŠธ์ฝ”๋“œ๋Š” ์ด๋ฏธ watchOS์™€ tvOS์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ๋‹ค์†Œ ์—‰๋šฑํ•œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ง€์ €๋ถ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋Œ€์ƒ์ด codegen ๋™์ž‘์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ณ  Apple codegen ๊ฒฝ๋กœ๊ฐ€ ๋™์  ํฌ๋ ˆ์ดํŠธ์— ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (apple-llvm์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ ์ผ๋ฐ˜ codegen ๊ฒฝ๋กœ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.)

์ด ์ ‘๊ทผ ๋ฐฉ์‹(@ricky26)์€ Rustc ์‚ฌ์šฉ์ž์ธ ์ €์—๊ฒŒ ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

HackerNews์˜ ์ด ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋Š” macOS ๋ฐ iOS์—์„œ Rust์—์„œ ์ƒ์„ฑ๋œ Bitcode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ์—๋Š” Rust ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ข‹์€ ์†Œ์‹์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค!

https://news.ycombinator.com/item?id=14305084

๋ฌธ์ œ์˜ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • -C lto --emit llvm-bc ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ƒ์ž์™€ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ํ•˜๋‚˜์˜ .bc ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๋„๋ก rustc๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค. ํŠนํžˆ jemalloc์„ ํฌํ•จํ•œ C ์ข…์†์„ฑ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์–ด์จŒ๋“  iOS์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ). Rustc๊ฐ€ "๋‚ด์žฅ๋œ ๋น„ํŠธ์ฝ”๋“œ"๋กœ Mach-O ๋ฐฉ์ถœ์„ ์ ์ ˆํžˆ ์ง€์›ํ•œ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. clang ์†Œ์Šค๋ฅผ ๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ํ•ดํ‚น์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฒ„์ „ ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” '๊ทธ๋ƒฅ ์ž‘๋™'ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์š” ์‹ค์ œ ์žฅ์• ๋ฌผ์€ Rust๊ฐ€ Xcode๋ณด๋‹ค ๋” ์ž์ฃผ LLVM ํŠธ๋ ํฌ์™€ ๋™๊ธฐํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Xcode๋Š” ๋งค๋…„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ตœ์‹  LLVM ๋ฒ„์ „์€ ์ด์ „ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด์ „ ๋ฒ„์ „์˜ rustc๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ด์ „ LLVM์— ๋Œ€ํ•ด ์ตœ์‹  ๋ฒ„์ „์„ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์‚ฌ์‹ค, Rustc 1.17์€ ์—ฌ์ „ํžˆ โ€‹โ€‹Xcode 8.x์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ LLVM 4.0 ์—…๊ทธ๋ ˆ์ด๋“œ ์ดํ›„๋กœ ์•ผ๊ฐ„์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์šฐ์—ฐ์˜ ์ผ์น˜์ž…๋‹ˆ๋‹ค.)

  • ์ด์ƒ์ ์œผ๋กœ Rust๋Š” ์ ์ ˆํ•œ LLVM ๋ฒ„์ „์— ๋Œ€ํ•ด ๋นŒ๋“œ๋œ ๊ณต์‹ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์˜ ์Šคํ†ก LLVM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ Apple์˜ ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ:

    • ์ด์ „ ์˜๊ฒฌ์—์„œ ๋งํ–ˆ๋“ฏ์ด Xcode๋Š” ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ LLVM ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. clang ๋ฐ libclang.dylib๋งŒ(Clang API๋Š” ๋‚ด๋ณด๋‚ด์ง€๋งŒ LLVM์€ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Œ).
    • ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋˜ํ•œ ๋งํ–ˆ๋“ฏ์ด ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฝ๊ฐ„ ์ผ๊ด€์„ฑ์ด ์—†์ด/์ง€์—ฐ ํ›„์— opensource.apple.com(๊ฐœ๋ฐœ์ž ๋„๊ตฌ -> clang ์•„๋ž˜, ์•„์นด์ด๋ธŒ์—๋Š” ๋ชจ๋“  LLVM ํฌํ•จ)์— ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠนํžˆ @alexcrichton์ด ์–ธ๊ธ‰ํ•œ ํ™•์žฅ๋œ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ณด์žฅ์„

(ํ…Œ์ŠคํŠธ๋กœ ๋ฐฉ๊ธˆ Xcode 8.2.1 Clang์— ๋Œ€ํ•ด Rust๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. rustllvm ๋Š” ๋นŒ๋“œ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. #if LLVM_VERSION_GE(..) ์กฐ๊ฑด๋ฌธ ์ค‘์ฒฉ์œผ๋กœ ์ธํ•ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ๋Œ€ํ•ด ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋ฐ ์ตœ์‹  LLVM์€ LLVM 3.9svn์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ API ๋ฐฉ์‹์€ 3.8๊ณผ 3.9 ์‚ฌ์ด์— ์žˆ๋Š” ์ด ๋ถ„๊ธฐ๋กœ ์ธํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค. Xcode๋Š” ์–ด์จŒ๋“  ๋‹ค์Œ ํ•ด๋งˆ๋‹ค ์ƒˆ๋กœ ๊ณ ์น  ์˜ˆ์ •์ด๋ฏ€๋กœ ์ˆ˜์ •ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ด ๋ถ€๋ถ„์—์„œ ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๋Œ€์•ˆ์œผ๋กœ ๋‹น์‹ (ํ•ต์‹ฌ ํŒ€)์€ ์ด ์‹œ๋ จ์„ ํ™•์‹คํ•œ ์˜๊ตฌ์ ์ธ ์ˆ˜์ •์ด ์žˆ๋Š” ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด ๋ฒ„์ „ ํ˜ธํ•‘์ด ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์œ ์ง€๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

์ €๋Š” iOS ์•ฑ์˜ ์šฐ์ˆ˜ํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ ์ €์ˆ˜์ค€ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์œ„ํ•ด Rust์—์„œ iOS ์•ฑ์˜ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Xcode ๋˜๋Š” Rustc์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•ต/์ง€์—ฐ์— ์–ฝ๋งค์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@regexident

๋‹ค๋ฅธ ์ด์œ ๋กœ ๊ต์ฒด ๊ฐ€๋Šฅํ•œ LLVM ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ตฌํ˜„๋œ๋‹ค๋ฉด Apple, wasm ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ์ œํ’ˆ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํŠธ๋žœ์Šค๋ฅผ ๋ฐฐ์†กํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ #45684

https://medium.com/@FredericJacobs/why -im-not-enabling-bitcode-f35cd8fbfcc5 ๋นŒ๋“œ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋ฌธ์ œ. ๋“ฑ.

@burdges ํŠน์ • ์•ฑ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ watchOS ๋ฐ tvOS์˜ ๊ฒฝ์šฐ Apple์€ ์‹ค์ œ๋กœ App Store ์ œ์ถœ์„ ์œ„ํ•ด Bitcode๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "ํ•ด๋‹น ํ”Œ๋žซํผ์—์„œ ์•”ํ˜ธํ™” ๋˜๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค" ์™ธ์—๋Š”. ๋˜ํ•œ ๋ฏธ๋ž˜์˜ ์–ด๋Š ์‹œ์ ์—์„œ Apple์ด iOS์šฉ Bitcode๋ฅผ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์‹œ์ ์—์„œ ๋ฒฝ๋Œ๋กœ ๋œ ์ œํ’ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

-C lto --emit=llvm-bc ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ iOS์šฉ Rust 1.24.0์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ง์ปค์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Undefined symbols for architecture x86_64:
  "_backtrace_create_state", referenced from:
      std::sys_common::gnu::libbacktrace::init_state::h686c3e443c712b0f in Logger(x86_64.o)
  "_backtrace_syminfo", referenced from:
      std::panicking::default_hook::_$u7b$$u7b$closure$u7d$$u7d$::h598a932d5bb0d80b in Logger(x86_64.o)
      core::iter::iterator::Iterator::position::_$u7b$$u7b$closure$u7d$$u7d$::hbf03153d55553502 in Logger(x86_64.o)
  "_backtrace_pcinfo", referenced from:
      std::panicking::default_hook::_$u7b$$u7b$closure$u7d$$u7d$::h598a932d5bb0d80b in Logger(x86_64.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

์–ด๋–ค ์•„์ด๋””์–ด๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๊ฐ public extern fn์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ AssertUnwindSafe ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ•œ ์–ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

libbacktrace๋Š” Rust ์†Œ์Šค ํŠธ๋ฆฌ์— ํฌํ•จ๋œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค:

https://github.com/rust-lang/rust/tree/master/src/libbacktrace

์–ด๋–ป๊ฒŒ๋“  ๋น„ํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋žฉํ†ฑ์šฉ์œผ๋กœ ๋นŒ๋“œ๋œ libbacktrace๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ „ํ™” OS์šฉ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋…น์€ ์–ด๋–ป๊ฒŒ ํ•ด๋‹น ๊ธฐํ˜ธ๋ฅผ stdlib์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ๋“  ์—ญ์ถ”์  ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? RUST_BACKTRACE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์—ญ์ถ”์  ์—†์ด Rustc๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์ง€๋งŒ, ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ํ™”๋ฌผ.toml ํŒŒ์ผ๊ณผ ๊ฐ™์ด ๋” ์‰ฌ์šด ๊ฒƒ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹น์‹ ์€ C ์ปดํŒŒ์ผ๋Ÿฌ์— -fembed-bitcode ๋ฅผ ์ „๋‹ฌํ•˜๋ผ๊ณ  ๋งํ•˜๋ฉด์„œ Rustc ์†Œ์Šค ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” CFLAGS ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ฐฉ๊ธˆ ์‹œ๋„ํ–ˆ์ง€๋งŒ gcc-rs (rustc์˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ์—์„œ C ์ข…์†์„ฑ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)์˜ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„์˜ ํ•ดํ‚น ์ ˆ์ฐจ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

cd /tmp/build
cat >ccwrap.py <<END

#!/usr/bin/env python
import os, sys
os.execv('/usr/bin/xcrun', ['clang', '-fembed-bitcode'] + [arg for arg in sys.argv[1:] if arg not in {'-ffunction-sections', '-fdata-sections'}])

END

chmod 755 ccwrap.py
ln -s /usr/bin/ar ar
export CC_aarch64_apple_ios=`pwd`/ccwrap.py
/usr/src/rust/configure --target=aarch64-apple-ios
make

๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ libbacktrace.a ( ./build/aarch64-apple-ios/native/libbacktrace/.libs/ )๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. __LLVM,__bitcode ์— ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค __LLVM,__bitcode ์„น์…˜: ๊ทธ๋Ÿฌ๋ฉด .bc ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋งํฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

(์‚ฌ์‹ค, ์ธ์šฉํ•˜์‹  ์˜ค๋ฅ˜๋Š” ์ผ๋ฐ˜ ๋ง์ปค ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ์ผ๋ฐ˜ libbacktrace.a ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ง€๋‚˜์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๊ปํ•ด์•ผ ์ถœ๋ ฅ ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌํ•จ๋œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ๊นจ์ง)

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ:

  • gcc-rs๋Š” -ffunction-sections ๋ฐ -fdata-sections ๋ฅผ ํ•ด์ œํ•  ๋ฐฉ๋ฒ• ์—†์ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. clang์€ -fembed-bitcode ์™€ ๊ฒฐํ•ฉํ•  ๋•Œ ์ด์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค( -fno-function-sections ๊ฐ€ ๋‚˜์ค‘์— ์ „๋‹ฌ๋˜๋”๋ผ๋„).

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

  • GCC-RS ์‹œ๋„ ์ฐพ์„ ar ๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— CC_aarch64_apple_ios (!?) AR_aarch64_apple_ios ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด๋„ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ตœ์‹  cc-rs ( gcc-rs ์—์„œ ์ด๋ฆ„ ๋ณ€๊ฒฝ)์œผ๋กœ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์–ด์„œ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์œ„์˜ ์ ˆ์ฐจ๋Š” ar ๋ฅผ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ ๋ฐฑํŠธ๋ ˆ์ด์Šค ํ•ญ๋ชฉ์ด ์•„๋‹Œ ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํŠธ์ฝ”๋“œ ์ž„๋ฒ ๋”ฉ ์—†์ด ์ปดํŒŒ์ผ๋œ libbacktrace๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ํ•ดํ‚น์œผ๋กœ ์ด์ œ dSYM์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ dsymutil segfaults๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. dSYM์ด ์—†๋Š” ์ผ๋ฐ˜ ์‹คํ–‰์€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ dSYM ์ƒ์„ฑ์ด ์–ด๋–ค ์ด์œ ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด libbacktrace.a๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋นˆ ์ž๋ฆฌ ํ‘œ์‹œ์ž ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ–ˆ๋Š”๋ฐ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด rust lib์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ LLVM์— ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณด๊ณ ๋˜์–ด์•ผ ํ•˜๋Š” dsymutil์˜ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. LLDB์—์„œ dsymutil์„ ์‹คํ–‰ํ•˜๊ณ  ์ถฉ๋Œ์˜ ์—ญ์ถ”์ ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ๋” ๋‚˜์€ ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ LLVM์„ ๋นŒ๋“œํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์Šคํ†ก LLVM ์„ค์น˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” llvm-dsymutil ๋ผ๊ณ  ํ•˜์ง€๋งŒ ์š”์ฆ˜ Xcode์˜ dsymutil ๋Š” llvm-dsymutil ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. dsymutil ์—๋Š” ๋ณ„๋„์˜ ๋น„๊ณต๊ฐœ ์†Œ์Šค ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด์ง€๋งŒ ๋ช‡ ๋…„ ๋™์•ˆ ํ•ด๋‹น ๋ฒ„์ „์€ dsymutil-classic ๋กœ ๋ฐฐ์†ก๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

@comex ๋Š” ํ˜ธ๊ธฐ์‹ฌ์—, cc ํฌ๋ ˆ์ดํŠธ๋Š” -fembed-bitcode ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” "๊ณต์‹" clang์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์ œ๊ฐ€ ios ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!)

Rust ์ฝ”๋“œ ์ž์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด ํŒŒ์ผ ๋Œ€์‹  ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ? Clang/๋ง์ปค๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ธ๊ฐ€์š”?

@alexcrichton

cc ํฌ๋ ˆ์ดํŠธ๋Š” -fembed-bitcode ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜๋Š” "๊ณต์‹" clang์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

๊ณต์‹ clang์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ํฌํ•จ๋œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋น„ํŠธ์ฝ”๋“œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ Apple์— ์—…๋กœ๋“œ๋œ ์•ฑ ์•„์นด์ด๋ธŒ์— ํฌํ•จ๋˜๊ณ  Apple์€ ์„œ๋ฒ„ ์ธก์—์„œ ์ด๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์—ฌ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ ๋งˆ์ดํฌ๋กœ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS/watchOS/tvOS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ -fembed-bitcode ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋นŒ๋“œํ•  ๋•Œ -fembed-bitcode-marker ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋Œ€์‹  ๋˜๋Š” ์ถ”๊ฐ€๋กœ ์ƒ๊ด€ ์—†์Œ). ์ด๊ฒƒ์€ ํฌํ•จ๋œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์ตœ์ข… ์•ฑ ์•„์นด์ด๋ธŒ์—๋งŒ ํ•„์š”ํ•˜๊ณ  ์ด๋ฅผ ์ƒ๋žตํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ์•ฝ๊ฐ„ ๋นจ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— clang์ด ์‹ค์ œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋”๋ฏธ ๋น„ํŠธ์ฝ”๋“œ ์„น์…˜๋งŒ ํฌํ•จํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Xcode๋Š” ์ตœ์ข… ์•ฑ ์•„์นด์ด๋ธŒ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด -fembed-bitcode-marker ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ตœ์ ํ™”๊ฐ€ ์ผœ์ง„ ๊ฐœ๋ฐœ ๋นŒ๋“œ์กฐ์ฐจ๋„ - ํ•˜์ง€๋งŒ cc ์—๋Š” "์ง„์งœ ์ตœ์ข… ๋ฆด๋ฆฌ์Šค"๋ผ๋Š” ๋ณ„๋„์˜ ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“œ", ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๊ทธ๋ƒฅ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ๋นŒ๋“œ์— ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

Rust ์ฝ”๋“œ ์ž์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด ํŒŒ์ผ ๋Œ€์‹  ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๊นŒ? Clang/๋ง์ปค๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์ธ๊ฐ€์š”?

clang๊ณผ ld ๋ชจ๋‘ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ์›์‹œ ๋น„ํŠธ์ฝ”๋“œ ํŒŒ์ผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ LTO๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ( -flto ) ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ๊ฒฝ์šฐ clang์ด ์ƒ์„ฑํ•˜๋Š” .o ํŒŒ์ผ์€ Mach-O๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์›์‹œ ๋น„ํŠธ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ๋ฐ˜ lipo ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ __LLVM,__bitcode ์„น์…˜์— ์ฑ„์›Œ์ง„ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” Mach-O๋กœ ๊ตฌ์„ฑ๋œ "์ž„๋ฒ ๋””๋“œ ๋น„ํŠธ์ฝ”๋“œ" ํ˜•์‹๊ณผ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„น์…˜์˜ ๊ธฐ๋ณธ ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜•์‹์€ LTO๊ฐ€ ๊บผ์ ธ ์žˆ์„ ๋•Œ ๊ฐœ์ฒด ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ LTO ์„ค์ •์— ๊ด€๊ณ„์—†์ด ์ตœ์ข… ๋งํฌ๋œ ์‹คํ–‰ ํŒŒ์ผ์ด๋‚˜ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (LTO๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๋ง์ปค๊ฐ€ ์ด ์„น์…˜์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. LTO๊ฐ€ ๊บผ์ ธ ์žˆ์œผ๋ฉด ๋ง์ปค ๋Š” ๋‹จ์ผ ๊ฒฐํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ ์„น์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ ๊ฐœ์ฒด ํŒŒ์ผ์˜ __LLVM,__bitcode ์„น์…˜์„ ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ์ฝ”๋“œ ๋ชจ๋“ˆ. ) ํŽธ์ง‘: ์‹ค์ œ๋กœ ๋Š” ๋น„ํŠธ ์ฝ”๋“œ ์„น์…˜์˜ xar ์•„์นด์ด๋ธŒ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  __LLVM,__bundle ๋ผ๋Š” ์„น์…˜์— ๋„ฃ๋Š” ์ข€ ๋” ๋ณต์žกํ•œ ์ž‘์—… ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ ์จ์•ผ ํ•  ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” Rustc๊ฐ€ ์›์‹œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ iOS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ "ํฌํ•จ๋œ ๋น„ํŠธ์ฝ”๋“œ"๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์œผ๋ฉฐ ์ฆ๋ถ„ ์ปดํŒŒ์ผ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋”๋ฏธ ๋น„ํŠธ์ฝ”๋“œ ์„น์…˜ ala -fembed-bitcode-marker ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋ง์ปค๊ฐ€ ๊ฐœ์ฒด๋ฅผ ์ฑ„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ๋„ ์ž ์žฌ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ' ๋งํฌ ํƒ€์ž„์— ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋น„ํŠธ์ฝ”๋“œ ์„น์…˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

clang์ด ํฌํ•จ๋œ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/llvm-mirror/clang/blob/master/lib/CodeGen/BackendUtil.cpp#L1242

๋น„๊ต์  ๊ฐ„๋‹จํ•จ - ๋ฐฑ์—”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ํ˜„์žฌ LLVM ๋ชจ๋“ˆ์„ ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋คํ”„ํ•œ ๋‹ค์Œ
__LLVM,__bitcode ์„น์…˜์— ๋ฐฐ์น˜๋œ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ ์ „์—ญ ๋ณ€์ˆ˜(๊ฐ™์€ ๋ชจ๋“ˆ์— ์žˆ์Œ)์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ํ•ดํ‚ค ๋””์ž์ธ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ(ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?), rustc์—์„œ ์žฌํ˜„ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@comex ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ(๋ฐฉ๊ธˆ ๋งŒ๋“  #48833 ์ฐธ์กฐ) Apple์˜ clang์„ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด์žฅ๋œ ๋น„ํŠธ์ฝ”๋“œ์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด๊ฐ€์š”?

@michaeleiselsc ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "์ž„๋ฒ ๋””๋“œ ๋น„ํŠธ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ ์ž์‹ ์„ ์ปดํŒŒ์ผ"ํ•œ๋‹ค๋Š” ๋ง์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ App Store์— ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  Apple clang์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ž์ฒด์ ์œผ๋กœ ๋นŒ๋“œํ•˜๋Š” ์ด์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ด์ ์€ Apple clang์˜ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ˆ˜์ • ์‚ฌํ•ญ๊ณผ clang ์†Œ๋…์ œ(์˜ˆ: ์ ์šฉ ๋ฒ”์œ„ ์†Œ๋…์ œ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

@comex ok ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ํŒŒ๊ณ  ์ถฉ๋ถ„ํžˆ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

-fembed-bitcode-marker๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”?

๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด ์—‘์Šค ์ฝ”๋“œ์— ์˜ํ•ด ์‚ฌ์šฉ์ด ์‚ฌ์šฉ ๋น„ํŠธ ์ฝ”๋“œ๋กœ ์ถ”์ • ๋˜๋‚˜ ๋น„ํŠธ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ทธ๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์•„์นด์ด๋ธŒํ•˜๋ ค๊ณ  ํ•˜๋ฉด ld๊ฐ€ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

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

@mitsuhiko ์˜ˆ, ์•„์ด๋””์–ด๋Š” ํ˜„์žฌ ์‹ค์ œ๋กœ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋นŒ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋ง์ปค๊ฐ€ ๋นŒ๋“œ๊ฐ€ ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  C ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  -fembed-bitcode-marker ์™€ ๋งํฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

$ clang -c -o test.o test.c
$ clang -dynamiclib -o test.dylib test.o -fembed-bitcode-marker
ld: warning: all bitcode will be dropped because 'test.o' was built
without bitcode. You must rebuild it with bitcode enabled (Xcode
setting ENABLE_BITCODE), obtain an updated library from the vendor,
or disable bitcode for this target.

์ฒซ ๋ฒˆ์งธ ์ค„์—๋„ -fembed-bitcode-marker ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

@alexcrichton __cmdline ... ํ ... ๋ง์ปค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค("๋น„ํŠธ ์ฝ”๋“œ ์ƒ์„ฑ" ๊ฒ€์ƒ‰).

https://opensource.apple.com/source/ld64/ld64-274.2/src/ld/parsers/macho_relocatable_file.cpp.auto.html

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ๊ฐ€์น˜์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋”๋ฏธ ๊ฐ’์„ ๊ฑฐ๊ธฐ์— ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

#48896์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์•ผ๊ฐ„ ๋นŒ๋“œ์—์„œ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  Xcode๋กœ ์•„์นด์ด๋ธŒ๋ฅผ ์‹œ๋„ํ•  ๋•Œ๊นŒ์ง€ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Rust ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถœ๋ ฅ์— fembed-bitcode-marker๊ฐ€ ์ถ”๊ฐ€๋˜์ง€๋งŒ fembed-bitcode๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ cargo lipo --release ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

$ cargo --version
cargo 1.27.0-nightly (af3f1cd29 2018-05-03)
$ cargo lipo --version
cargo-lipo 2.0.0-beta-2
$ rustc --version
rustc 1.27.0-nightly (565235ee7 2018-05-07)
ld: '/Users/chrisbal/Documents/Beach/rust-universal-template/target/universal/release/libexample.a(example_generic-be72fb1769c1779b.example_generic6-152d14edfb6970f54250733c74e59b7.rs.rcgu.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

otool -arch arm64 -l /Users/chrisbal/Documents/Beach/rust-universal-template/target/universal/release/libexample.a | grep bitcode ์‹คํ–‰ํ•˜๋ฉด ๋งŽ์€ sectname __bitcode ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋งˆ์ปค๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋น„ํŠธ์ฝ”๋“œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ๋œ ํฌ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ "์ผ๋ฐ˜" ํฌ๋ ˆ์ดํŠธ์— ๋น„ํŠธ์ฝ”๋“œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๋‹ค์Œ์€ ๋ฌธ์ œ๋ฅผ ์‹œ์—ฐํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. https://github.com/Raizlabs/rust-universal-template/tree/879e7412d729e8963586c5b083d51b09733aec32

@chrisballinger , ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ
RUSTFLAGS="-Z embed-bitcode" cargo lipo --release

$ cargo --version
cargo 1.28.0-nightly (f352115d5 2018-05-15)
$ cargo lipo --version
cargo-lipo 2.0.0-beta-2
$ rustc --version
rustc 1.28.0-nightly (952f344cd 2018-05-18)

๊ทธ๋Ÿฌ๋‚˜ arm7 ์•„์น˜์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

.rs.rcgu.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7

arm7 arch ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•„์‹œ๋Š” ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”?

์Šฌํ”„๊ฒŒ๋„ @chrisballinger ์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ld: '/sandbox/target/universal/release/librgame.a(std-da6dba40351cda22.std3-d36cd881bae00a8b5fc36289b5737f78.rs.rcgu.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ปดํŒŒ์ผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค RUSTFLAGS="-Z embed-bitcode" cargo lipo --release ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์„ค์ • .cargo/config . ๊ทธ๋ž˜๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

` Executing: "cargo" "build" "--target" "x86_64-apple-ios" "--lib" "--features" "" "--color" "auto" "--release" "--verbose" Compiling libc v0.2.42 Compiling rand_core v0.2.1 Running `rustc --crate-name libc /Users/aleksandrivanov/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.42/src/lib.rs --crate-type lib --emit=dep-info,link -C opt-level=3 --cfg 'feature="default"' --cfg 'feature="use_std"' -C metadata=dce309634355ac97 -C extra-filename=-dce309634355ac97 --out-dir /Users/aleksandrivanov/Sandbox/Projects/tetris/rgame/target/x86_64-apple-ios/release/deps --target x86_64-apple-ios -L dependency=/Users/aleksandrivanov/Sandbox/Projects/tetris/rgame/target/x86_64-apple-ios/release/deps -L dependency=/Users/aleksandrivanov/Sandbox/Projects/tetris/rgame/target/release/deps --cap-lints allow -Zembed-bitcode` ...

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ณ ์ • C++ ์—†์ด ์•ฑ์˜ ๊ณต์œ  ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

@chrisballinger , https://github.com/rust-lang/rust/issues/52686 ๊ณผ ๊ด€๋ จ์ด

@volodg ์•„๋‹ˆ์š”, ์ด ๋ฌธ์ œ๋Š” ์–ผ๋งˆ ์ „์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

#48896์˜ ๋ณ‘ํ•ฉ์œผ๋กœ ์ฆ‰์‹œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ €๋Š” 1.29.1์„ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ๊ฐ์ฒด์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @volodg ๊ฐ€ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด RUSTFLAGS="-Z embed-bitcode" ์‚ฌ์šฉํ•˜์—ฌ ๋…น์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด Rust์˜ ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(compiler_builtins, std)๊ฐ€ embed-bitcode๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Embed-bitcode์™€ ํ•จ๊ป˜ xargo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iOS ํƒ€๊ฒŸ์„ ์žฌ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ €๋Š” ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ๋Œ€๋กœ xargo ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :(

์ด Xargo.toml

[dependencies]
std = {}
[target]
features = ["jemalloc"]

๋˜ํ•œ ์ด๊ฒƒ์„ Cargo.toml :

[profile.release]
panic = "abort"

๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•ด xargo build --release --target $TARGET ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

  • aarch64-์• ํ”Œ-๋‹ค์œˆ
  • armv7-apple-darwin
  • armv7s-apple-darwin
  • i386-์• ํ”Œ-๋‹ค์œˆ
  • x86_84-์• ํ”Œ-๋‹ค์œˆ

๊ทธ๋Ÿฐ ๋‹ค์Œ lipo ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ง์ปค ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ld: '../../cargo/target/universal/libgreetings.a(greetings-ceeec73d35f7dbe0.greetings.9kcaav8v-cgu.2.rcgu.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

xargo ๊ฒฝ๋กœ๋กœ ์กฐ๊ธˆ ๋” ๋‚˜์•„๊ฐ”์Šต๋‹ˆ๋‹ค.

๋‚ด Xargo.toml

[dependencies]
std = {}

๋‚ด Cargo.toml

[profile.release]
panic = "abort"

ํ•„์š”ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ xargo ๋ฌธ์„œ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ extern crate compiler_builtins ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋ฅผ lib.rs์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด RUSTFLAGS="-Z embed-bitcode" xargo build --target $TARGET --release ๋กœ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. core/std/compiler_bultins๋ฅผ ๋นŒ๋“œํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. xargo clean ๋Š” ๋‚ด๊ฐ€ ๊ฒฝํ—˜ํ•œ ๊ฒƒ์—์„œ ์ด์ „ ๋นŒ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ Xargo.toml ์กฐ์ •์„ ์‹œ๋„ํ•  ๋•Œ std๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด rm -rf ~/.xargo ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Xcode 10์— ๋ณด๊ด€ํ•˜๋ฉด ( armv7 ๋งํฌ์—์„œ) ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

Intrinsic has incorrect argument type!
void (i8*, i8, i32, i1)* @llvm.memset.p0i8.i32
Intrinsic has incorrect argument type!
void (i8*, i8*, i32, i1)* @llvm.memcpy.p0i8.p0i8.i32
Intrinsic has incorrect argument type!
...
(lots of it)
...
LLVM ERROR: Broken module found, compilation aborted!
clang: error: linker command failed with exit code 1 (use -v to see invocation)

๋ฒ„๊ทธ๊ฐ€ LLVM์— ์˜์กดํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

ํŽธ์ง‘ : ์ด ๋ฌธ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ?

์ตœ๊ทผ์— ์ด๊ฒƒ์„ ์‹œ๋„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? armv7์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„. ์ €๋Š” ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํ•œ๋™์•ˆ ํŒ”๋กœ์šฐํ•ด ์™”์œผ๋ฉฐ Apple ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ Rust์—์„œ ์ง€์›๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๋ˆ„๋ฝ๋œ ๊ฒƒ์€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ ํ•ด์š”!

๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ Rust์˜ ๋น„ํŠธ์ฝ”๋“œ ์ž„๋ฒ ๋”ฉ์ด Xcode์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์งง์€ ๋Œ€๋‹ต์€ Xcode์˜ LLVM ๋ฒ„์ „์€ LLVM 6.0 ๋น„ํŠธ ์ฝ”๋“œ๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ๋ฐ˜๋ฉด Rust๋Š” 2018๋…„ 7์›” ์— LLVM 7.0์œผ๋กœ ์ถฉ๋Œ ํ–ˆ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ธด ๋‹ต๋ณ€์ด...

LLVM 7.0์˜ changelog ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด @llvm.memcpy , @llvm.memmove ๋ฐ @llvm.memset ๋Œ€ํ•œ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฉฐ Xcode ๋นŒ๋“œ ์˜ค๋ฅ˜๋Š” ์ž˜๋ชป๋œ ์ธ์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ช…ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ด์ „ ๋Œ“๊ธ€์—์„œ .

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , Kotlin Native๋Š” 2018๋…„ 10์›” ์— Embed-bitcode์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ๋ถ„๋ช…ํžˆ Xcode์—์„œ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Kotlin์ด ์—ฌ์ „ํžˆ LLVM 6.0์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑธ ๋ณด๊ณ  7.0์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๊ธฐ ์ „์— ๊ตฌ ๋ฒ„์ „์˜ Rust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. nightly-2018-06-01-x86_64-apple-darwin ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์„ฑ๊ณตํ•˜๋ฉด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋˜ํ•œ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ Xargo๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…์†์„ฑ์€ ๋น„ํŠธ์ฝ”๋“œ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, Apple์ด LLVM ๋ฒ„์ „์„ ๋ฒ”ํ•˜์ง€ ์•Š๋Š” ํ•œ, ์ž„๋ฒ ๋””๋“œ ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ณง ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ๋ˆ„๊ตฐ๊ฐ€ ์ž„๋ฒ ๋””๋“œ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ 6.0์˜ ๋น„ํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ์•Š๋Š” ํ•œ...

@appaquet ์ž์„ธํžˆ ์•Œ์•„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•„์ฃผ ์‹ ๋น„๋กœ์šด ์ผ์ด์—ˆ๊ณ  ๋‹น์‹ ์ฒ˜๋Ÿผ ๊นŠ์ด ์ž ์ˆ˜ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Apple์ด LLVM ๋ฒ„์ „์„ ๋ฒ”ํ•˜๋ฉด ์ž‘๋™์„ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@appaquet๋‹˜ ์˜ ๋ช…์พŒํ•œ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด Apple์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ์šฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ์— ๊ด€์‹ฌ์ด ์žˆ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์œ ๋งํ•œ ์†”๋ฃจ์…˜(React Native, Flutter, Kotlin/Native, Rust)์„ ๋น„๊ตํ•œ ์‚ฌ๋žŒ์˜ ์ธก๋ฉด

๋„ค์ดํ‹ฐ๋ธŒ์— ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ฆฌ์ง€๋Š” C++๋กœ ์ž‘์„ฑ๋˜๊ณ  ๋Ÿฐํƒ€์ž„์—์„œ JS ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์‹ค๋ฃฉ ๊ฑฐ๋ฆฌ๋‹ค. ์•„์ง ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - https://github.com/flutter/flutter/issues/15288

์ฝ”ํ‹€๋ฆฐ/๋„ค์ดํ‹ฐ๋ธŒ. JetBrains๋Š” ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์„ ์šฐ์„  ์ˆœ์œ„๋กœ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋น„ํŠธ์ฝ”๋“œ ๋งˆ์ปค์ผ ๋ฟ(์•„์ง ์ „์ฒด ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹˜) ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. https://github.com/JetBrains/kotlin-native/ ์ฐธ์กฐ pull/1564 ๋ฐ https://github.com/JetBrains/kotlin-native/issues/1202#issuecomment -444022513

๋…น. LLVM 7์šฉ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ Apple์€ ๋ฒ„์ „ 6์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ๋ชจ๋‘ ๊ฐ–๊ณ  ์‹ถ๋‹ค๋ฉด React Native ๋˜๋Š” Flutter๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‹ฌ๊ฐํ•œ ์•ฑ์˜ ๊ฒฝ์šฐ ์ด ๊ฒฝ๋กœ๋Š” ๋„ˆ๋ฌด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. React Native๋Š” ์„ฑ๋Šฅ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ API ๋ฐ ์ข…์†์„ฑ ์•ˆ์ •์„ฑ ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(v1.0์ด ์˜ฌ๊นŒ์š”?). Flutter๋Š” ์•ฝ๊ฐ„ ๋ฏธ์ˆ™ํ•˜์ง€๋งŒ ์ ์  ๋” ๋งŽ์€ ๊ฒฌ์ธ๋ ฅ์„ ์–ป๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ชจ๋“ˆ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ๊ณต์œ ํ•˜๊ณ (์˜ˆ: C++ ๋ฐ JNI/Obj-C++๋กœ ์ˆ˜ํ–‰ํ•œ ์ด์ „ ๋Œ€ํ˜• ์•ฑ์ฒ˜๋Ÿผ) ๊ทธ ์œ„์— ์ง„์ •ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ UI๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฒ˜์Œ์—๋Š” 4๊ฐ€์ง€ ๋ชจ๋‘ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ JS<->Native ์‚ฌ์ด์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์™„์ „ํ•œ JavaScriptCore์™€ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ์˜ค๋ฒ„์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— React Native๋ฅผ ์ง€์›๋‹ˆ๋‹ค(์ด ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋„ ์ƒ๋‹นํžˆ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค). Flutter๋Š” ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์˜๋„๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์‹œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋น„ํŠธ ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Rust์™€ Kotlin/Native๋Š” ๋ชจ๋‘ ์ด ํ‹ˆ์ƒˆ ์‹œ์žฅ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ๋ฐ”์ด๋„ˆ๋ฆฌ(์„ฑ๋Šฅ ๋ฐ ๊ณต๊ฐ„!)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Bitcode๋Š” ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์—์„œ ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋ชจ๋“ˆ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด๋กœ Rust๋ฅผ ์ฑ„ํƒํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์ œ Kotlin/Native์— ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์ œ ์šฐ๋ฆฌ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด Apple์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Apple์ด ์•…๋ช… ๋†’์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;)
๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ(์ผ์‹œ์ ์œผ๋กœ LLVM 6์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งž์ฃ ?) Rust๋Š” iOS ๋ฐ ๋ชจ๋ฐ”์ผ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์ž๋ฅผ ์™„์ „ํžˆ ์žƒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@oleksandr-yefremov์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ฝ์—ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฅ๋ฏธ๋กœ์šด ์˜๊ฒฌ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. https://gist.github.com/yamaya/2924292#gistcomment -2738480

LLVM ๋ฒ„์ „์€ XCode์—์„œ ์‚ฌ์šฉ๋˜๋Š” Swift ๋ฒ„์ „๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์Œ ์ง€์›์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Xcode 8.3  --> swift 3.1 --> llvm 4.0.0
Xcode 9.0  --> swift 4.0 --> llvm 4.0.0
Xcode 9.3  --> swift 4.1 --> llvm 5.0.2
Xcode 10.0 --> swift 4.2 --> llvm 6.0.1

swift-5.0-branch ๋ณด๋Š” ๋™์•ˆ LLVM์˜ ์„ ์–ธ๋œ ๋ฒ„์ „์ด 7.0.0 ์ž„์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. https://github.com/apple/swift-llvm/blob/swift-5.0-branch/ CMakeLists.txt#L25 -L33

์—ฌ๊ธฐ์— ๋” ๋งŽ์€ ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Rust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Bitcode ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐ŸŽ‰

Xcode 10.2์—๋Š” Swift 5.0์ด ํฌํ•จ๋  ๊ฒƒ์ด๋ฉฐ ๊ณง ์ถœ์‹œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•œํŽธ LLVM 8.0์€ ๋‹ค์Œ ์ฃผ์— ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. Rust๋Š” Apple์ด ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

Rust๊ฐ€ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›ํ•˜๋ ค๋ฉด ๊ณ ์ •๋œ ๋ฒ„์ „์˜ LLVM์„ ์‚ฌ์šฉํ•˜๋Š” Rust์˜ Apple ARM ์•„ํ‚คํ…์ฒ˜ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(https://github.com/apple/swift-llvm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ์„ ์ˆ˜ ์žˆ์Œ - Apple์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค๋œ LLVM ํŒจํ‚ค์ง€์ด์ง€๋งŒ ์ž์ฒด ๋ถ„๊ธฐ). ํ•ด๋‹น ๋ฒ„์ „์˜ LLVM์€ Apple์ด ๋‹ค๋ฅธ LLVM ๋ฒ„์ „์œผ๋กœ Xcode์˜ ์ƒˆ๋กœ์šด ์ตœ์ข… ๋ฒ„์ „์„ ์ถœ์‹œํ•  ๋•Œ๋งŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

Btw, ์ตœ์‹  Rust๋Š” LLVM 6์œผ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์‹คํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/blob/master/src/bootstrap/native.rs#L282
LLVM์˜ ํ•„์ˆ˜ ๋ฒ„์ „(LLVM 6์šฉ ๋ฒ„์ „: https://github.com/rust-lang/rust/issues/55842)์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์‚ฌ๋žŒ์ด ๊ฐœ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@vincentisambart Rust๋Š” IIRC 5๊ฐœ์›” ๋™์•ˆ ์•ผ๊ฐ„ ๋นŒ๋“œ์— ์ด๋ฏธ LLVM 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์ด ์Šค์Šค๋กœ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ LLVM (6) ์ง€์› ์ตœ์†Œํ•œ์˜ ๋ฒ„์ „๊ณผ๋Š” CI ํ…Œ์ŠคํŠธ ๊ฒƒ : https://github.com/rust-lang/rust/blob/706e67b0a0143d651eb03f2fa2c30645899e81ff/src/ci/docker/x86_64-gnu-llvm-6.0 /๋„์ปคํŒŒ์ผ

์ด์ œ ์šฐ๋ฆฌ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด Apple์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ์ด ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ซ“๊ณ  ์žˆ์—ˆ๊ณ  (์ง€๊ธˆ์€ ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค) ํ”Œ๋žซํผ ์ธก๋ฉด์—์„œ Apple์ด ์ด๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Swift๋Š” ์—ฌ๋Ÿฌ ๋ฉด์—์„œ Rust๊ฐ€ ๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ(ํ•˜๋‚˜๋Š” ์†Œ์œ ๊ถŒ ์„ ์–ธ๋ฌธ ์ฐธ์กฐ) ๋งŽ์ด ๋’ค์ณ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Apple์€ Swift๋ฅผ ์ฃผ์š” ํ”Œ๋žซํผ ์–ธ์–ด๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅธ ํฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ Swift๋ฅผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ€์–ด ๋„ฃ๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Rust๋Š” ์ด๋ฏธ 5๊ฐœ์›” ๋™์•ˆ IIRC์— ์•ผ๊ฐ„ ๋นŒ๋“œ์— LLVM 8์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Apple์ด LLVM 7 ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋”๋ผ๋„ ์ตœ๊ทผ Rust์˜ ๊ณต์‹ ๋นŒ๋“œ์—์„œ ์ƒ์„ฑ๋œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋”๋ผ๋„ ๋‹ค์Œ์— Rust๊ฐ€ ์ƒ์„ฑ๋œ ๋น„ํŠธ์ฝ”๋“œ์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ด ์žˆ๋Š” LLVM ๋ฒ„์ „์œผ๋กœ ์ด๋™ํ•  ๋•Œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LLVM 6์€ ์ง์ ‘ ๋นŒ๋“œํ•˜๊ณ  CI์—์„œ ํ…Œ์ŠคํŠธํ•œ ๊ฒฝ์šฐ ์ง€์›๋˜๋Š” ์ตœ์†Œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Rust์˜ ๊ณต์‹ *-apple-ios ๋นŒ๋“œ๊ฐ€ LLVM 6(๋˜๋Š” https://github.com/apple/swift-llvm/releases/tag/swift-4.2.2-RELEASE์™€ ๊ฐ™์€ ๋” ๋‚˜์€ ๊ฒƒ)์œผ๋กœ ๋นŒ๋“œ๋˜๋„๋ก ํ•˜๋ฉด ์ž‘๋™) ๋น„ํŠธ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Rust๋Š” ํ˜„์žฌ https://github.com/rust-lang/rust/issues/46819 ๋ณ‘ํ•ฉ ํ›„ ๋‘ ๊ฐœ์˜ LLVM ๋ฐฑ์—”๋“œ(Emscripten ๋ฐ ํ‘œ์ค€)์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ๋‹ค๊ณ  ์ƒ๊ฐ
#46819๋Š” ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ ios LLVM ๋ฐฑ์—”๋“œ๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์™„์ „ํžˆ ํƒˆ์„ ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์— C๋กœ์˜ ํŠธ๋žœ์ŠคํŒŒ์ผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ „๋ฐ˜์ ์œผ๋กœ ๋” ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์„๊นŒ์š”? Rust๊ฐ€ Apple ์ธก์˜ ๋น„ํŠธ์ฝ”๋“œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ž ์žฌ์ ์ธ ๋น„ํ˜ธํ™˜์„ฑ ์†Œ์Šค๊ฐ€ ์žˆ๋”๋ผ๋„ Apple์— ์ ํ•ฉํ•œ LLVM ๋ฒ„์ „์„ ํฌํ•จํ•˜๋Š” ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์ด์ „ ๋ฒ„์ „์˜ Rust๋กœ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ์˜ ๋ฌธ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค.

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

์ ์–ด๋„ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์—ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ผ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

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

Rust์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๋ณธ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณผ ๋•Œ Rust๊ฐ€ ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ(Kotlin Multiplatform, ํฌ๋กœ์Šค ์ปดํŒŒ์ผ Swift, Mono, Dart, C++, React Native) ์ค‘ ๊ฐ€์žฅ ์žฅ๊ธฐ์ ์ธ ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  Rust ๋ฆด๋ฆฌ์Šค๋ฅผ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋”๋ผ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๋น„ํŠธ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋”๋ผ๋„ Rust๋Š” ์—ฌ์ „ํžˆ watchOS ๋˜๋Š” tvOS๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Rust๊ฐ€ Apple ์ธก์˜ ๋น„ํŠธ์ฝ”๋“œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” Rust์˜ LLVM์ด ๋„ˆ๋ฌด ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋” ๋‚˜์€ ํ˜ธํ™˜์„ฑ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

Rustc๊ฐ€ ์—ฌ๋Ÿฌ LLVM์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๊ด€๋ จ: tvOS ๋ฐ watchOS(๋ฐ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ) ๋Œ€์ƒ ์ง€์›

์ด๋ฏธ ์—ฌ๋Ÿฌ LLVM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. emscripten ๋Œ€์ƒ์˜ ๊ฒฝ์šฐ LLVM 6 atm์— ์žˆ๋Š” emscripten์˜ LLVM ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” Rust์˜ LLVM์ด _๋„ˆ๋ฌด ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์ด์ง€ _๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋” ๋‚˜์€ ํ˜ธํ™˜์„ฑ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ƒˆ๋กญ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Rust๊ฐ€ LLVM ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋”๋ผ๋„ ๋ชจ๋“  iOS ๋ฆด๋ฆฌ์Šค์—์„œ ์ด๊ฒƒ์ด ๋‹ค์‹œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Apple(๋‚ด๊ฐ€ ์•„๋Š” ํ•œ)์€ ๋น„ํŠธ์ฝ”๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋„ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ƒˆ๋กญ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Rust๊ฐ€ LLVM ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜๋”๋ผ๋„ ๋ชจ๋“  iOS ๋ฆด๋ฆฌ์Šค์—์„œ ์ด๊ฒƒ์ด ๋‹ค์‹œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Apple(๋‚ด๊ฐ€ ์•„๋Š” ํ•œ)์€ ๋น„ํŠธ์ฝ”๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋„ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ํŠน๋ณ„ํžˆ ๊ณ„ํšํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ณ„ํšํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. LLVM์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฆด๋ฆฌ์Šค๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ์ž์ฒด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๊ณ„ํšํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. LLVM์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฆด๋ฆฌ์Šค๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ์ž์ฒด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

Apple์ด ๋‹ค๋ฅธ ๋ˆ„๊ตฌ์™€๋„ ๋ฌด๊ด€ํ•˜๊ฒŒ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. Bitcode์— ๋Œ€ํ•œ ๊ณ„ํš์— ๋Œ€ํ•ด ์ข€ ๋” ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ๊ฒƒ์ด ์•…์˜์ ์ด๊ฑฐ๋‚˜ ๊ทธ๋ƒฅ ์•„๋ฌด ์ƒ๊ด€์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ๊ทธ๋‹ค์ง€ ๊ฐœ์„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์•„๋ฌด๋„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๋Œ๋ณด์ง€ ์•Š๊ณ  ๊ฐ‘์ž๊ธฐ ํ˜•์‹์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด Swift ๋ฐ LLVM ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Rust ํŒ€์ด ๊ทธ ์œ„ํ—˜์ด ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์ด์œ ๋ผ๊ณ  ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ทธ๋“ค์˜ ํŠน๊ถŒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์Šฌํ”„์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋””์—์„œ ์‹œ๊ฐ„์„ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ž๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ณ„ํšํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. LLVM์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฆด๋ฆฌ์Šค๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ์ž์ฒด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

Apple์€ 6์›” ์ดˆ์— Xcode ๋ฒ ํƒ€๋ฅผ ์ถœ์‹œํ•˜๊ณ  9์›”์— ์ตœ์ข… ๋ฒ„์ „์„ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค. 6-9๊ฐœ์›” ํ›„์—๋Š” ์ด์ „ Xcode ๋ฒ„์ „์œผ๋กœ ๋นŒ๋“œ๋œ ์•ฑ์„ Appstore์— ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ํƒ€์ž„๋ผ์ธ์—์„œ ๋น„ํŠธ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ค€๋น„ํ•  ์‹œ๊ฐ„์€ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Xcode 10.2 ๋ฒ ํƒ€ 3(Swift 5 w/ LLVM 7 ํฌํ•จ)์œผ๋กœ ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ตœ๊ทผ ๋ฐค์— ์ž„๋ฒ ๋””๋“œ ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rust์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust์—๋Š” watchOS/tvOS ํƒ€๊ฒŸ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ iOS ํƒ€๊ฒŸ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋น„ํŠธ์ฝ”๋“œ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Rust๊ฐ€ ๋ชจ๋“  Apple ๊ด€๋ จ ๋Œ€์ƒ์— ๋Œ€ํ•ด Apple LLVM ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค ๊ธฐ๊ฐ„์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. Apple์ด ์†Œ์Šค LLVM ๋˜๋Š” ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ๋‹ซ์„ ๊ฒƒ์ด๋ผ๋Š” ์•„์ด๋””์–ด๋Š” ๋งค์šฐ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์ง€๋งŒ ํ–ฅํ›„ iOS ๋ฆด๋ฆฌ์Šค์—์„œ Apple์ด ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•  ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์€ ๋ถ„๋ช…ํžˆ ์ผ์–ด๋‚  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Marzipan ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ Mac App Store ์ œ์ถœ์„ ์œ„ํ•ด ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์„ฑ๊ธ‰ํ•˜์ง€๋งŒ ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์€ ๊ฒฐ๊ตญ Tier 1 ํ”Œ๋žซํผ ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ

์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์—์„œ ๊ณต์‹์ ์œผ๋กœ ์Šน์ธํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ @brson ์˜ ์ด์ „ ๋Œ“๊ธ€์€ ์ฃผ์ €๋ฅผ ์š”์•ฝํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์•„๋‹ˆ๋ฉด ๋ฏธ๋ž˜์— ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •ํ™”๋  ๊ฒƒ์ด๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ด ๋…ผ์Ÿ์ด ์ผ์–ด๋‚œ ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ™

์ด์ œ ๋ชจ์ž๋ฅผ ๋จน๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ž

๋‚ด๊ฐ€ ๋งํ–ˆ๋‹ค :

Apple์ด ์†Œ์Šค LLVM ๋˜๋Š” ๋น„ํŠธ ์ฝ”๋“œ ํ˜•์‹์„ ๋‹ซ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ฃผ๋กœ @mitsuhiko๊ฐ€ ํ‘œํ˜„ํ•œ ๋ถˆ์‹ ์— ๋Œ€ํ•œ ์‘๋‹ต

LLVM์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ฆด๋ฆฌ์Šค๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ์ž์ฒด ๋น„ํŠธ์ฝ”๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค๋กœ ๊ฒฐ์ •ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ #48833 ์„ ๋ณด๋ฉด ๋ถ„๋ช…ํžˆ ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @comex๋Š” ์ด์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

LLVM ํŠธ๋ ํฌ ์ด์ „์— Xcode์˜ LLVM์— ๊ธฐ๋Šฅ์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด arm64 ํฌํŠธ๊ฐ€ ์›๋ž˜ ๊ฐœ๋ฐœ๋˜์—ˆ์„ ๋•Œ, ๊ทธ ์ด์œ ๋Š” Apple์ด arm64 ์žฅ์น˜๋ฅผ ์ถœํ•˜ํ•  ๊ณ„ํš์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋น„๋ฐ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ™์€ ๋ฌธ์ œ์—์„œ @michaeleiselsc ์˜ ์ด์•ผ๊ธฐ:

๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋˜ ์•ฑ์€ 2016๋…„ 12์›”์— ๋ฌด์ž‘์œ„๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ํฐ ํƒ€๊ฒฉ์„ ๋ฐ›์•˜์œผ๋ฉฐ ์ด๋Š” ์˜คํ”ˆ ์†Œ์Šค LLVM์ด 2017๋…„ 12์›”์—๋งŒ ์ˆ˜์ •ํ•œ ํŠน์ • ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 2016๋…„ 12์›”์— ์˜คํ”ˆ ์†Œ์Šค LLVM์—์„œ Apple์˜ LLVM์œผ๋กœ ์ด์ „ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๊ณ ์ •๋˜์—ˆ๋‹ค

์ด ์•„์ด๋””์–ด๊ฐ€ Rust์™€ ํ•จ๊ป˜ Apple์˜ LLVM์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๊ฐ€๋” ๊ณ ์•ฝํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์งŠ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ Transpiling์ด ๋” ๋‚˜์€ ์˜ต์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ, ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋‚˜๋Š” ์—ฌ์ „ํžˆ Apple์˜ LLVM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ณ„์† ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์—†์Œ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ์— ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(A Tier 1.5 ๋˜๋Š” ๊ธฐํƒ€).

์ฝ”ํ‹€๋ฆฐ/๋„ค์ดํ‹ฐ๋ธŒ. JetBrains๋Š” ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์„ ์šฐ์„  ์ˆœ์œ„๋กœ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋น„ํŠธ์ฝ”๋“œ ๋งˆ์ปค์ผ ๋ฟ(์•„์ง ์ „์ฒด ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹˜) ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. JetBrains/kotlin-native#1564 ๋ฐ JetBrains/kotlin-native# ์ฐธ์กฐ 1202(๋Œ“๊ธ€)

@oleksandr-yefremov๋ฅผ ์ง€์ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์กฐ๊ธˆ ๋” ํŒŒ๊ณ ์™€ ์ฝ” ํ‹€๋ฆฐ / ๊ธฐ๋ณธ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค golang์˜๋ฅผ . ๋‚˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ๋น„ํŠธ์ฝ”๋“œ ์ง€์› iOS/tvOS/watchOS ์•ฑ์—์„œ ๋…น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜‘๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์‹œ๋„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@volodg ์ €๋Š” ๋…น์Šจ ์ดˆ๋ณด์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด ํŠœํ† ๋ฆฌ์–ผ ์„ ์•ผ๊ฐ„์— ์ตœ์‹  ๋Ÿฌ์ŠคํŠธ( rustc 1.37.0-nightly (088b98730 2019-07-03) )๋กœ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋งˆ์ปค๊ฐ€ ์žˆ๋Š”๊ฑฐ๊ฐ™์€๋ฐ..

$ otool -arch arm64 -l librust.a  | grep bitcode
  sectname __bitcode
...

๊ทธ๋Ÿฌ๋‚˜ iOS ์žฅ์น˜์šฉ์œผ๋กœ ๋นŒ๋“œํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ž‘๋™).

ld: '/Users/amrox/Documents/Projects/rust-ios-example/hello-rust/libs/librust.a(rust-e6011ffb55678675.rust.8yq9vjk7-cgu.3.rcgu.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

rustc nightly-2019-09-05 aarch64-apple-ios and rustflags = "-C lto -Z embed-bitcode" staticlib๋ฅผ clang-1100.0.33.5 (Xcode 11 beta 7) and -fembed-bitcode ์•ฑ๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋Š” https://github.com/saturday06/rust-ios-bitcode-test ์ž…๋‹ˆ๋‹ค.

  • __cmdline ์„น์…˜์ด ํ•„์š”ํ•œ์ง€ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

2๋…„ ํ›„์— ๋‚˜๋Š” ์ด ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ์  ์žฅ์น˜์— ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ Xcode ์•„์นด์ด๋ธŒ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋นˆ cmdline์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ App Store ์ œ์ถœ์˜ ๊ฒฝ์šฐ Apple์€ clang ๋ช…๋ น์ค„์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ํ•ดํ‚น ํŒจ์น˜๊ฐ€ ํฌํ•จ๋œ ์ด PR์— ๋” ๊ธด ์„ค๋ช…์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/getditto/rust-bitcode/pull/7

์–ด๋–ป๊ฒŒ๋“  ์ด๊ฒƒ์„ ์—…์ŠคํŠธ๋ฆผํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์˜ต์…˜์ด ๋งค๋ ฅ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. iOS๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ์ผ๋ถ€ ํด๋žœ ์˜ต์…˜์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๊นŒ? Apple์ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ๊ฑฐ์ง“๋ง์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก envvar๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

-Cembed-bitcode=no๋Š” ios ๋Œ€์ƒ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .a ํŒŒ์ผ์— ์—ฌ์ „ํžˆ ๋น„ํŠธ์ฝ”๋“œ ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„ํŠธ์ฝ”๋“œ ์—†์ด ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•?

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