๋นŒ๋“œ ๊ทœ์น™

Chromium ๋นŒ๋“œ์—์„œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” //ui/base/BUILD.gn์— ์ƒˆ Rust ํƒ€๊ฒŸ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

#![allow(unused)]
fn main() {
#[no_mangle]
pub extern "C" fn hello_from_rust() {
    println!("Hello from Rust!")
}
}

์ค‘์š”: ์—ฌ๊ธฐ์„œ no_mangle์€ Rust ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ gn ํƒ€๊ฒŸ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ƒˆ๋กœ์šด Rust ํƒ€๊ฒŸ์„ //ui/base:base์˜ ์ข…์† ํ•ญ๋ชฉ์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ui/base/resource/resource_bundle.cc์˜ ๋งจ ์œ„์—์„œ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ ๋„๊ตฌ๋กœ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

extern "C" void hello_from_rust();

ui/base/resource/resource_bundle.cc์˜ ์–ด๋”˜๊ฐ€์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ResourceBundle::MaybeMangleLocalizedString์˜ ์ƒ๋‹จ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Chromium์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ โ€™Hello from Rust!โ€™๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

VSCode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ œ VSCode์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋„๋ก Rust๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์—ฐ์Šต์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด println!์—์„œ โ€™์ •์˜๋กœ ์ด๋™โ€™์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์œผ๋กœ ํด๋ฆญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

It's really important that students get this running, because future exercises will build on it.

์ด ์˜ˆ๋Š” ์ตœ์†Œ ๊ณตํ†ต๋ถ„๋ชจ ์ƒํ˜ธ ์šด์šฉ์„ฑ ์–ธ์–ด์ธ C๋กœ ๊ท€๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++์™€ Rust ๋ชจ๋‘ ๊ธฐ๋ณธ์ ์œผ๋กœ C ABI ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์˜ ํ›„๋ฐ˜๋ถ€์—์„œ C++๋ฅผ Rust์— ์ง์ ‘ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ allow_unsafe = true๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” #[no_mangle]์ด Rust๊ฐ€ ์ด๋ฆ„์ด ๊ฐ™์€ ํ•จ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ณ  Rust๋Š” ๋” ์ด์ƒ ์˜ฌ๋ฐ”๋ฅธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•œ Rust ์‹คํ–‰ ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฉด rust_executable gn ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.