Rust๋ ์ ์ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค. ์ด๋ฏธ DirectX 12๋ฅผ ๊ตฌ๋ํ ์ ์์ง๋ง ์ ์ฒด ํ๋ฉด ๋ชจ๋์์๋ง ๋๋ ์์ง๋์ด๊ฐ ์์ง๋์ด๋ฅผ ์ํด ๋ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด์๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ น์ ๋ํ WinUI3 ์ง์์ ์ฌ์ฉํ๋ฉด ํ๋์ ์ด๊ณ ์ธ๋ จ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ น ์ฑ์ ๋น๋ํ ์ ์์ผ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก ๋ น์ ๋ชจ๋ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ง๋์ด์ ๋ง์ผํ ์ ํ๋ณตํ๊ฒ ํ ๊ฒ์ ๋๋ค. ์ฆ, ์ด ์กฐํฉ์ ์์ ์ฉ ์ฑ์ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
์ธ์ด ๋งคํ์ ์ด๋ฏธ ์์ ์ค์ธ ๊ฒ ๊ฐ์ต๋๋ค: https://github.com/microsoft/winrt-rs
winrt-rs
๋ ์ฐ๊ฒฐ์ ๋ฌ์ฑํ ์ ์์ง๋ง ํ์ํ ์ข
์์ฑ์ ๊ฐ์ ธ์ค๊ณ Hello World๊ฐ ์๋ํ๋ ๋ช
์์ ์ธ winui3-rs
ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๋ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ด๊ฒ์ winrt-rs
๊ฐ ์์ ์ ์ด๊ธฐ ๋๋ฌธ์ (์๋ง๋) ์ฐจ๋จ๋์์ต๋๋ค.
์ฐธ๊ณ ๋ก @kennykerr
Rust winrt ํฌ๋ ์ดํธ๋ VS ํ์ฅ ๋ฐ NuGet ์ง์์ ํตํด C++/WinRT ์ ํ์ ํ๋ ์ธ์ด ํ๋ก์ ์ ๋ฐ ํจํค์ง ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ์ค๋๋ Rust/WinRT ์์ ์ ๊ณต๋ฉ๋๋ค. ๊ณง Xaml ์ํ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ด ๋ชฉ๋ก์ ์์ต๋๋ค. Rust์์ ์์ ๋ง์ Xaml ์ปจํธ๋กค ๋น๋๋ฅผ ์ง์ํ๋ ค๋ฉด ์์ง ๊ฐ ๊ธธ์ด ๋ฉ์ง๋ง, ์ด๋ฏธ ๊ธฐ๋ณธ Xaml ์ฑ์ ๋น๋ํ ์ ์์ผ๋ฉฐ ์์ ํ ์ ํ ์์คํ ์ง์์ ์ ๊ณตํ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฌด์์ ์ฐพ๊ณ ์๋์ง ๋ฃ๊ณ ์ถ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด Xaml ์ปดํ์ผ๋ฌ๊ฐ ์ ํต์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ข ๋ฅ์ ๋ํ ์ง์์ ์ ๊ณตํ๋ ๊ฒ ์ด์์ด๋ผ๊ณ ์์ํ ์ ์์ง๋ง ๋ด๊ฐ ํ๋ฆด ์ ์์ต๋๋ค.
๋๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๋ ๊ฑธ ์ ๋ง ๋ณด๊ณ ์ถ์ด.
Rust๊ฐ ์ ์ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ์ ๋ง ์ข์ ์ธ์ด์ด๋ฉฐ Microsoft๋ Windows์ ์ผ๋ถ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ Rust๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋งํ๊ธฐ๊น์ง ํ์ต๋๋ค.
๋
น์ ์ค์ฌ์ผ๋ก ์ฑ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๋ค๋ ๊ฒ์ C++ ์์ค์ ์ฑ๋ฅ์ ์๋ฏธํ์ง๋ง ์ฝ๋ ๊ฐ๋
์ฑ์ด ํจ์ฌ ์ข๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ฒ๊ทธ๊ฐ ์ ์ต๋๋ค.
@kennykerr "๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฌด์์ ์ฐพ๊ณ ์๋์ง ๋ฃ๊ณ ์ถ์ต๋๋ค."
์ฃผ๋ ๋๊ธฐ๋ ๊ฐ๋ฅํ ํ ๋
น์ฌ์ง ์๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ ์ ๋ฌธ์ ์ธ ๋ชจ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ง ์ ์๋๋ก ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด์ฉ์ง ์ธ์ด ๋์์ธ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ ์ฌ๋์ด ์์ ์ UI ์์ ฏ ๋์์ธ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ ์ฌ๋๊ณผ ๊ฐ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ WIN UI 3์ฉ ๋
น์ ๋ํผ๋ ๋ถํ ์ ์ฐ๊ฒฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ํธ๋ฆญ์ ์ํํด์ผ ํ์ง๋ง ์ค์ ๋ก ์ํํ ์๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ง์
์ฅ๋ฒฝ์ด ๋์ต๋๋ค. ๊ธฐ์ ์ ํจ๊ป ๋ฌถ๋ hello world ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ง์ ์ฌ๋๋ค์ด ์ค์ ๋ก ๋ฐ์ด๋ค๊ณ ์ถ์ดํ๊ณ ์ค์ค๋ก ํ์ํ๊ฒ ๋ ๊ฒ์
๋๋ค. ๊ฐ์ธ์ ์ผ๋ก WIN UI ์ฑ ๋ด์ ํจ๋์์ WIN UI 3 ๋ฐ DirectX12๋ฅผ ์ฌ์ฉํ๋ ๋
น์ ์๋ฅผ ์ํฉ๋๋ค. ๋
น์ ๋ฐฐ์ฐ๊ธฐ ์์ํ์ง โโ์ผ๋ง ๋์ง ์์์ ๋ ์ด๋ ค์ ๋ณด์๊ธฐ ๋๋ฌธ์ ์์
์ ์์ํ์ง ์์์ต๋๋ค.
์ ๋ Rust์์ ๋ ๋ง์ GUI ์์ ์ ํ๊ธฐ๋ฅผ ๊ณ ๋ํ์ต๋๋ค. WinUI๋ ๋จ์ง ๊ทธ๊ฒ์ ์ํํด ๋ณผ ์ ์๋ ์ฅ์์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@kennykerr "๊ธฐ์ ์ ํจ๊ป ๋ฌถ๋ hello world ์์ ๊ฐ ์์ผ๋ฉด ๋ ๋ง์ ์ฌ๋๋ค์ด ์ค์ ๋ก ๋ฐ์ด๋ค๊ณ ์ถ์ดํ๊ณ ์ค์ค๋ก ํ์ํ๊ฒ ๋ ๊ฒ์ ๋๋ค."
Hello World๋ UI๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ์์ ํ ์ผ ์ฑ์ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์ํธ ์์ฉ๊ณผ ์กฐ๊ฐ์ด ์๋ก ์ด๋ป๊ฒ ๋ง๋์ง ๋ณด์ฌ์ค๋๋ค.
.Net MAUI ์ ๋ํ ๋ฐํ๋ฅผ ๊ธฐ์ตํฉ๋๋ค. WinUI์ ๊ทธ ๊ธฐ๋ฐ์ด ์ผ๋ง๋ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ ์๊ฒ ์๊ฐ์ vgtk๋ผ๋ Rust GUI ํ๋ ์์ํฌ์์ ์ต๋๋ค.
https://bodil.lol/vgtk/
์ด ํ๋ ์์ํฌ์ ๊ตฌ๋ฌธ์ ์ ์ธ์ UI๋ฅผ ๋น๋ํ๊ธฐ ์ํ React์ jsx ๊ตฌ๋ฌธ์์ ํฌ๊ฒ ์๊ฐ์ ๋ฐ์์ผ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ค๋๋ ์ธ๊ธฐ ์๋ MVU ๋ชจ๋ธ์ ๋๋ค.
์ฑ์ ์ ์ธํ๋ ค๋ฉด ๋ค์์ ์์ฑํฉ๋๋ค.
fn view(&self) -> VNode<Model> {
gtk! {
<Application::new_unwrap(None, ApplicationFlags::empty())>
<Window border_width=20 on destroy=|_| Message::Exit>
<HeaderBar title="inc!" show_close_button=true />
<Box spacing=10 halign=Align::Center>
<Label label=self.counter.to_string() />
<Button label="inc!" image="add" always_show_image=true
on clicked=|_| Message::Inc />
</Box>
</Window>
</Application>
}
}
์ด๊ฒ์ jsx์ ๋งค์ฐ ๊ฐ๊น์ง๋ง WinUI์ ์ฌ์ฉํ๊ธฐ์ ์๋ฒฝํ XAML์ ํจ์ฌ ๊ฐ๊น์ต๋๋ค. Rust์ ์ด ๊ตฌ๋ฌธ์ Rust์ ์ ์ฐจ์ ๋งคํฌ๋ก ๊ธฐ๋ฅ์ ์ํด ํ์ฑํ๋ฉ๋๋ค.
์์ฆ์ ์ด๋ฐ UI ํ๋ ์์ํฌ๊ฐ ๋์ธ์ธ ๊ฒ ๊ฐ๊ณ , WinUI๋ก ๋ฌ์คํธ๊ฐ ์ฑ๊ณตํ๋ ค๋ฉด ์ด ๊ธฐ์ฐจ๋ ํ์ผ ํ๋ ๊ฒ ๊ฐ์์. ์ด๋ฌํ ์ ํ์ ์์ ์ ์์์ด ์ํ๋์์ผ๋ฉฐ Microsoft์์ WinUI์ฉ ์์ ์ ๋ง๋๋ ๊ฒ์ ์๋ง๋ ๋งค์ฐ ์ฌ์ธ ๊ฒ์ ๋๋ค. ๋ํ ์ด๊ฒ์ Rust GUI ์ปค๋ฎค๋ํฐ๊ฐ ๊ฐ์ ํ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ํฌ๋ก์ค ํ๋ซํผ UI ํ๋ ์์ํฌ์ ๋ํ ์ข์ ๊ธฐํ์ผ ์๋ ์์ง๋ง, ์ด๋ ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ์ฃผ๋ชฉํด์ผ ํ ์ ์ XAML์๋ '๋ถ๋ถ ํด๋์ค' ์ง์์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ง๋์? ๋ฐ๋ผ์ UI ์์์ ์ปจํธ๋กค์ ์ถ๊ฐํ ์ ์์ต๋๋ค. Rust๊ฐ ์ด๊ฒ์ ์ง์ํฉ๋๊น? ์ ์ฐจ์ ๋งคํฌ๋ก๋ก ๋ชจ๋ฐฉํ ์ ์์ต๋๊น?
๋ชจ๋ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๊ณ์ ํ์ธ์.
@suleyth - Xaml API์๋ ๋ถ๋ถ ํด๋์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด๋ Xaml ์ปดํ์ผ๋ฌ์์ ์ฌ์ฉํ๋ C# ์ธ์ด์ ๊ธฐ๋ฅ์ ๋๋ค. C++์ ์ด์ Rust์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ํด๋น ์ธ์ด์ ๋ ์์ฐ์ค๋ฌ์ด ์์ ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ํ๊ตฌํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค, ์ ์ฐจ์ ๋งคํฌ๋ก๋ Rust์์ ์ด๊ฒ์ ํด๊ฒฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. winrt-rs ์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
์ด์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
ํธ์ง: winui๋ก ๋
น์ ์ง์ํ๊ธฐ ์ํ ๋ก๋๋งต์ด ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
WinUI ํ์ ๋๋ณํ ์๋ ์์ง๋ง Rust์ ๋ํ ์ง์์ ๋๋ถ๋ถ์ Rust/WinRT ์ธ์ด ํ๋ก์ ์ ( winrt-rs )์์ ๋์ต๋๋ค. ํนํ, ์ ๋ ์ด์ Rust์์ COM ๋ฐ WinRT ์ ํ์ ์ ์ํ๊ณ ๊ตฌํ ํ๊ธฐ ์ํ ์ง์์ ์ถ๊ฐํ๋ ์์ ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ ์์ ํ Xaml ํตํฉ์ ์ํ ์ฃผ์ ์ ์ ์กฐ๊ฑด์ ๋๋ค. ์ค๋น๊ฐ ๋๋ฉด Rust์์ Xaml ๋ฐ์ธ๋ฉ ์ง์์ ๋ณด๋ค ์์ฐ์ค๋ฝ๊ฒ ์กฐ๋ช ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
winrt-rs
๋ ์ฐ๊ฒฐ์ ๋ฌ์ฑํ ์ ์์ง๋ง ํ์ํ ์ข ์์ฑ์ ๊ฐ์ ธ์ค๊ณ Hello World๊ฐ ์๋ํ๋ ๋ช ์์ ์ธwinui3-rs
ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๋ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.