Exercise: Interoperability with C++

1๋ถ€

  • ์ด์ „์— ๋งŒ๋“  Rust ํŒŒ์ผ์—์„œ, C++์—์„œ ํ˜ธ์ถœํ•  hello_from_rust๋ผ๋Š” ๋‹จ์ผ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” #[cxx::bridge]๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด์ „์˜ hello_from_rust ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ extern "C" ๋ฐ #[no_mangle]์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ด์ œ ํ‘œ์ค€ Rust ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • gn ํƒ€๊ฒŸ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฐ”์ธ๋”ฉ์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • C++ ์ฝ”๋“œ์—์„œ hello_from_rust์˜ ์ •๋ฐฉํ–ฅ ์„ ์–ธ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ƒ์„ฑ๋œ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

2๋ถ€

CXX๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Chromium์˜ Rust๊ฐ€ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์œ ์—ฐํ•œ์ง€ ์ƒ๊ฐํ•ด ๋ณด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Some things to try:

  • Rust์—์„œ C++๋กœ ๋‹ค์‹œ ํ˜ธ์ถœ ํ•„์š”ํ•œ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • cxx::bridge์—์„œ include!ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ—ค๋” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ƒˆ ํ—ค๋” ํŒŒ์ผ์—์„œ C++ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ #[cxx::bridge]์—์„œ unsafe ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” unsafe ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.
    • #include "third_party/rust/cxx/v1/crate/include/cxx.h"๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C++์—์„œ Rust๋กœ C++ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • C++ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ Rust๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์˜๋„์ ์œผ๋กœ #[cxx::bridge]์—์„œ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” Rust ํ•จ์ˆ˜ ์„œ๋ช…์„ ๊ฐ€์ ธ์™€์„œ ํ‘œ์‹œ๋˜๋Š” ์˜ค๋ฅ˜์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค.
  • ์˜๋„์ ์œผ๋กœ #[cxx::bridge]์—์„œ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” C++ ํ•จ์ˆ˜ ์„œ๋ช…์„ ๊ฐ€์ ธ์™€์„œ ํ‘œ์‹œ๋˜๋Š” ์˜ค๋ฅ˜์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค.
  • Rust๊ฐ€ C++ ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก C++์—์„œ ์ผ๋ถ€ ์œ ํ˜•์˜ std::unique_ptr์„ Rust๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • Rust ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด C++๋กœ ์ „๋‹ฌํ•˜์—ฌ C++์—์„œ ์†Œ์œ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํžŒํŠธ: Box ํ•„์š”
  • C++ ์œ ํ˜•์— ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ ์ด๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.
  • Rust ์œ ํ˜•์— ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. C++์—์„œ ์ด๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.

3๋ถ€

์ง€๊ธˆ๊นŒ์ง€ CXX ์ƒํ˜ธ ์šด์šฉ์„ฑ์˜ ๊ฐ•์ ๊ณผ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•œ Chromium์˜ Rust ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์Šค์ผ€์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ณณ

As students explore Part Two, they're bound to have lots of questions about how to achieve these things, and also how CXX works behind the scenes.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ํ˜• Y๋กœ ์œ ํ˜• X์˜ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ X์™€ Y๋Š” ๋ชจ๋‘ ํ•จ์ˆ˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋Š” C++ ํ•จ์ˆ˜๊ฐ€ cxx::bridge์˜ ์„ ์–ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • C++ ์ฐธ์กฐ๋ฅผ Rust ์ฐธ์กฐ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด UB๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„๊นŒ์š”? CXX์˜ ๋ถˆํˆฌ๋ช… ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ 0์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. CXX ์‚ฌ์†Œํ•œ ์œ ํ˜•์˜ ๊ฒฝ์šฐ UB๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ์ด _๊ฐ€๋Šฅ_ํ•˜์ง€๋งŒ CXX์˜ ์„ค๊ณ„์ƒ ์ด๋Ÿฌํ•œ ์˜ˆ๋ฅผ ๋งŒ๋“ค๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.