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의 섀계상 μ΄λŸ¬ν•œ 예λ₯Ό λ§Œλ“€κΈ°κ°€ μƒλ‹Ήνžˆ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.