인프콘 2022 - Rust 크로스 플랫폼 프로그래밍

Chris Ohk
Chris OhkEngine Engineer at Momenti, Inc
Rust 크로스 플랫폼 프로그래밍
하나의 코드를 여기저기 써볼래요?
Momenti 옥찬호
옥찬호 Chris Ohk
• 현 Momenti Engine Engineer
• 전 Nexon Korea Game Programmer
• Microsoft Developer Technologies MVP
• C Korea Founder Administrator
• Reinforcement Learning KR Administrator
• IT 전문서 집필 및 번역 다수
• 게임샐러드로 코드 한 줄 없이 게임 만들기 2013
• 유니티 Shader와 Effect 제작 2014
• 2D 게임 프로그래밍 2014 , 러스트 핵심 노트 2017
• 모던 C 입문 2017 , C 최적화 2019
utilForever gmail.com
utilForever
• Rust 언어의 핵심 기능을 가볍게 살펴봅니다. 자세하게 공부하고 싶다면 공식 문서를 참고하세요.
https://doc.rust lang.org/book/
• 발표 시간을 맞추기 위해 크로스 플랫폼 프로그래밍을 설명할 때 라이브러리/바이너리 파일을 만드는 단계까지만 설명하며,
iOS 앱 또는 웹 사이트랑 연동하는 부분은 저장소에서 별도로 설명합니다.
• 발표 자료와 예제 코드는 다음 저장소에서 확인 가능합니다.
https://github.com/utilForever/2022 INFCON Rust CrossPlatform
들어가며
1
콘텐츠
목차
content
크로스 플랫폼 프로그래밍을 하게 된 이유
기존 개발 상황 및 문제점, 왜 Rust를 선택했는가
2 Rust 언어 소개
Rust 언어의 역사, 기본 문법 맛보기
3 Rust로 크로스 플랫폼 프로그래밍 해보기
Swift for iOS, WebAssembly for Web
4 몇 가지 팁들
애플리케이션 프리징, WebAssembly 디버깅
1
크로스 플랫폼 프로그래밍을 하게 된 이유
https://ppss.kr/archives/149603
• 여러 플랫폼에서 사용할 수 있는 코어 엔진을 만들어주세요.
• iOS
• Android
• Backend
• Web
• …
이직 후 첫번째 업무
• 똑같은 기능을 하는 엔진 코드가 여러 플랫폼에 각각 구현되어 있었다.
• iOS 앱 C Objective C 기반
• 프론트엔드 TypeScript 기반
• 새로운 기능을 구현하거나 기존 기능을 수정해달라는 요청이 들어오면,
• iOS 앱 C 코드를 구현한 뒤, Objective C 코드를 통해 앱에 적용한다.
• 프론트엔드 TypeScript 코드를 구현해 웹에 적용한다.
기존에는 어떻게 개발되고 있었는가
• 어떤 기능을 추가/삭제하거나 변경해야 할 때 지원하는 플랫폼마다 작업을 해줘야 한다.
• 유지보수 측면에서 비효율적이다.
• 지원하는 플랫폼이 늘어날수록 작업량이 늘어난다.
• 똑같은 기능을 수행했을 때 플랫폼마다 동작 결과가 달라질 수 있다.
• 플랫폼마다 서로 다른 사람이 구현하기 때문에 발생하는 문제다.
• 서로 다른 동작으로 인해 사용자에게 불편을 초래할 수 있다.
문제점
• 플랫폼마다 로직을 구현하지 않고, 한 곳에서 작업하면 좋겠다.
• 다양한 플랫폼에 어떻게 대응해야 할까?
• iOS 앱 Swift API 제공
• Android 앱 Kotlin API 제공
• 백엔드 Elixir API 제공
• 웹 사이트 웹어셈블리 바이너리 파일 제공
어떻게 개선할 것인가
• 다양한 언어를 지원하기 위한 API와 웹 어셈블리 코드를 만들 수 있는 언어
• C , Rust, Java, Go, …
• Rust를 선택한 이유
• 타입 안전성
• 메모리 안전성
• 동시성 프로그래밍 안전성
• FFI를 통해 API 지원을 쉽게 할 수 있음
• WebAssembly 바이너리를 쉽게 만들 수 있음
왜 Rust를 선택했는가
• 같은 동작을 하는 프로그램을 여러 플랫폼에서 사용할 수 있도록 만들고 있다.
• iOS 앱 Swift
• Android 앱 Kotlin
• 프론트엔드 TypeScript
• 백엔드 Elixir
• 각 플랫폼에서 사용자 입력에 따라 로직을 처리하고 결과물을 보여주기 위한 코드를 개별적으로 작성한다.
프로젝트 구조
코어 엔진
Rust
FFI
Foreign Function Interface
트랜스파일 Transpile
Swift API
Kotlin API
Elixir API
WebAssembly
ReactiveX
2
Rust 언어 소개
Rust란?
• https://www.rust lang.org/
• 모질라 재단에서 2010년 7월 7일 처음 발표
• 현재는 러스트 재단으로 독립해서 개발되고 있다.
• Rust 언어의 특징
• 안전한 메모리 관리
• 철저한 예외나 에러 관리
• 특이한 enum 시스템
• 트레이트
• 하이지닉 매크로
• 비동기 프로그래밍
• 제네릭
• let 키워드를 사용
• 변수의 자료형을 대부분 유추할 수 있다.
• 변수 숨김 Variable Shadowing 을 지원
• 변수의 이름은 언제나 snake case 형태로 짓는다.
• Rust에서 변수는 기본적으로 변경 불가 Immutable 타입이다.
• 변경 가능 Mutable 한 값을 원한다면 mut 키워드로 표시해줘야 한다.
Rust 기본 문법 변수
• 상수는 변수와 달리 반드시 명시적으로 자료형을 지정해야 한다.
• 상수의 이름은 언제나 SCREAMING SNAKE CASE 형태로 짓는다.
Rust 기본 문법 상수
• switch를 대체하는 구문
• 모든 케이스를 빠짐 없이 처리해야 한다.
Rust 기본 문법 match
• null을 쓰지 않고도 Nullable한 값을 표현할 수 있는 내장된 Generic 열거체
Rust 기본 문법 Option
• 실패할 가능성이 있는 값을 반환할 수 있도록 해주는 내장된 Generic 열거체
Rust 기본 문법 Result
• 소유자가 함수의 인자로 전달되면, 소유권은 그 함수의 매개 변수로 이동 Move 된다.
• 이동된 이후에는 원래 함수에 있던 변수는 더 이상 사용할 수 없다.
• Rust의 참조 규칙
• 단 하나의 변경 가능한 참조 또는 여러개의 변경 불가능한 참조만 허용하며, 둘 다는 안된다.
• 참조는 그 소유자보다 더 오래 살 수 없다.
Rust 기본 문법 소유권
• Rust의 컴파일러는 모든 변수의 생명 주기를 이해하며 참조가 절대로 그 소유자보다 더 오래 존재하지 못하도록 검증을 시도한다.
• 함수에서는 어떤 매개 변수와 리턴 값이 서로 같은 생명 주기를 공유하는지 식별할 수 있도록
심볼로 표시해 명시적으로 생명 주기를 지정할 수 있다.
Rust 기본 문법 생명 주기
• Rust에서는 어떠한 방법으로도 데이터와 동작의 상속이 불가능하다.
• 구조체는 부모 구조체로부터 필드를 상속받을 수 없다.
• 구조체는 부모 구조체로부터 함수를 상속받을 수 없다.
• 대신 Rust는 트레잇으로 다형성을 지원한다. 트레잇은 다른 트레잇의 메소드들을 상속받을 수 있다.
Rust 기본 문법 OOP
3
Rust로 크로스 플랫폼 프로그래밍 해보기
• 다양한 플랫폼에서 Rust 라이브러리에 있는 add 함수와 sub 함수를 호출해 결과를 받은 뒤 출력하는 예제를 만들어 보자.
무엇을 만들 것인가
Rust
Swift
WebAssembly
TypeScript
Objective C
• rust cross : 핵심 코드를 구현하는 크레이트. add 함수와 sub 함수를 구현한다.
• rust cross ios : Swift API를 만들기 위한 코드를 구현하는 크레이트.
• rust cross web : WebAssembly로 트랜스파일하기 위한 코드를 구현하는 크레이트.
프로젝트 구조
Root
rust cross
Core Code
rust cross ios
Swift API
rust cross web
WebAssembly
• 빈 디렉토리에 Cargo.toml 파일을 만든 뒤 다음과 같이 입력한다.
프로젝트 구조 잡기
• cargo new 명령을 통해 만들 수 있다.
• 라이브러리 프로젝트를 만들려면 lib를 붙어야 한다.
• 그렇지 않으면, 바이너리 파일을 생성하는 프로젝트가 만들어진다.
새 Rust 라이브러리 프로젝트 만들기
• 외부에서 사용할 수 있도록 pub 키워드를 붙이자.
• 구현을 완료했다면 cargo build release 명령을 통해 빌드가 되는지 확인한다.
rust cross : add/sub 함수 구현하기
• Xcode를 설치한다.
• App Store에서 설치할 수 있다.
• Xcode 빌드 툴을 설치한다.
• xcode select install
• 그리고 크로스 컴파일이 가능하도록 iOS 아키텍처를 추가한다.
• rustup target add aarch64 apple ios aarch64 apple ios sim x86 64 apple ios
• 크로스 컴파일을 쉽게 할 수 있도록 도와주는 툴인 cargo lipo를 설치한다.
• cargo install cargo lipo
rust cross ios : iOS를 위한 라이브러리 빌드 준비
• Cargo.toml 파일을 연 뒤, 다음과 같이 수정한다.
• 정적/동적 라이브러리를 만들기 위해 lib 의 crate type을 staticlib , cdylib 로 설정한다.
• rust cross 크레이트에 있는 함수들을 사용하므로 dependencies 에 추가한다.
rust cross ios : 프로젝트 설정
• 함수의 이름이 맹글링되지 않도록 # no mangle 을 추가한다.
맹글링 Mangling 이란 소스 코드에 선언된 함수나 변수의 이름을 컴파일 단계에서 일정한 규칙을 갖고 변형하는 걸 말한다.
rust cross ios : C 브릿지에서 호출할 코드 작성
• Rust에서 사용한 매개 변수 타입과 리턴 타입에 호환되는 타입을 사용해야 한다.
• 예 : i32 또는 i64 int
• 구현을 완료했다면 cargo lipo release 명령을 통해 라이브러리 파일 .a 가 생성되는지 확인한다.
rust cross ios : C 브릿지 헤더 파일 작성
• Rust로 WebAssembly 바이너리 파일을 빌드해주는 툴인 wasm pack을 설치한다.
• curl https://rustwasm.github.io/wasm pack/installer/init.sh sSf sh
• JavaScript 번들러를 설치하고 실행할 수 있도록 패키지 매니저인 npm을 설치한다.
• npm install npm latest g
rust cross web : WebAssembly를 위한 라이브러리 빌드 준비
• Cargo.toml 파일을 연 뒤, 다음과 같이 수정한다.
• 동적 시스템/러스트 라이브러리를 만들기 위해 lib 의 crate type을 cdylib , rlib 로 설정한다.
• rust cross 크레이트에 있는 함수들을 사용하므로 dependencies 에 추가한다.
• WebAssembly 빌드를 위해 wasm bindgen을 dependencies 에 추가한다.
rust cross web : 프로젝트 설정
• 필요할 경우 Wrapper로 처리할 수 있도록 # wasm bindgen 을 추가한다.
• 구현을 완료했다면 wasm pack build 명령을 통해 wasm 파일이 생성되는지 확인한다.
rust cross web : WebAssembly로 빌드할 코드 작성
4
몇 가지 팁들
애플리케이션 프리징 문제
• Swift 앱에서 어떤 동작을 수행하기 위해 UI에서 버튼을 누르면, 엔진에서 처리되는 동안에 앱이 멈추는 문제가 발생한다.
• 원인은 Swift에서 필요한 함수들을 직접 호출하며, 모든 함수 호출은 동기적으로 동작하기 때문이다.
Swift
Rust 인스턴스 포인터
Swift UI
Swift UI
Rust
Rust 코드
애플리케이션 프리징 문제
• 이를 해결하려면, 엔진에 대한 모든 요청을 처리하는 워커를 구현해 백그라운드 스레드에서 동작하게 만들어야 한다.
• 백그라운드 스레드에서 워커 Worker 를 통해 요청들을 Job Queue에 넣으면 작업을 비동기적으로 수행한다.
Rust 인스턴스 포인터
Swift UI
Swift UI
Rust
Swift
백그라운드 스레드
워커 Worker
Job Queue
Fetch
Process
Rust 코드
WebAssembly에서의 함수 맹글링 문제
• Rust WebAssembly로 빌드하면 함수 이름들이 맹글링된다.
• 맹글링된 함수 이름 때문에 콜 스택을 제대로 확인할 수 없는 문제가 있다.
WebAssembly에서의 함수 맹글링 문제
• 이 문제를 해결하려면 WebAssembly 코드를 배포하는 크레이트의 Cargo.toml에 각 빌드에 따른 설정을 해줘야 한다.
디버깅을 위해, dev 빌드에서 demangle name section을 true로 설정하고 wasm opt에 플래그 _g를 추가한다.
• 이제 wasm 파일이 빌드되면 웹쪽 코드에 pkg 폴더를 붙여넣기하고 실행하면 된다.
• npm을 실행했을 때 Failed to decode custom name section 2024365; ignoring Maximum call stack size exceeded
오류가 발생하는 경우가 있다. 이 때는 node를 실행할 때 stack size 10000을 추가해서 스택 크기를 늘려야 한다.
• 하지만 보안 이슈로 인해 NODE OPTIONS를 사용할 수는 없고, package.json에서 npm start에 해당하는 부분에 추가하면 된다.
• 심볼 정보를 전부 포함한 채로 실행하기 때문에 불러오는데 꽤 오랜 시간이 걸릴 수 있다. 인내하고 기다리자!
WebAssembly에서의 함수 맹글링 문제
• 이제 잘 실행되고 디맹글링된 함수 이름들을 볼 수 있다.
WebAssembly에서의 함수 맹글링 문제
모멘티와 함께 성장할 분들을 찾습니다!
https://rebrand.ly/momenti
감사합니다!
utilForever gmail.com
https://github.com/utilForever
Facebook, Twitter: utilForever
1 of 44

Recommended

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019 by
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
6K views75 slides
쿠키런 1년, 서버개발 분투기 by
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
109.6K views43 slides
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오... by
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...Amazon Web Services Korea
4.4K views44 slides
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3 by
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3Heungsub Lee
13.5K views251 slides
Ndc14 분산 서버 구축의 ABC by
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
3K views107 slides
Multiplayer Game Sync Techniques through CAP theorem by
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
11.8K views64 slides

More Related Content

What's hot

임태현, 게임 서버 디자인 가이드, NDC2013 by
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
20.2K views85 slides
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012 by
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
16.1K views53 slides
중앙 서버 없는 게임 로직 by
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
8.2K views111 slides
How to build massive service for advance by
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
13.2K views90 slides
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막) by
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
43.8K views370 slides
NoSQL 위에서 MMORPG 개발하기 by
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기Hoyoung Choi
4.9K views134 slides

What's hot(20)

임태현, 게임 서버 디자인 가이드, NDC2013 by devCAT Studio, NEXON
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON20.2K views
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012 by devCAT Studio, NEXON
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON16.1K views
중앙 서버 없는 게임 로직 by Hoyoung Choi
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
Hoyoung Choi8.2K views
How to build massive service for advance by DaeMyung Kang
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
DaeMyung Kang13.2K views
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막) by Heungsub Lee
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
Heungsub Lee43.8K views
NoSQL 위에서 MMORPG 개발하기 by Hoyoung Choi
NoSQL 위에서 MMORPG 개발하기NoSQL 위에서 MMORPG 개발하기
NoSQL 위에서 MMORPG 개발하기
Hoyoung Choi4.9K views
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지 by 강 민우
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
강 민우11.8K views
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference by Xionglong Jin
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
Xionglong Jin18.7K views
Next-generation MMORPG service architecture by Jongwon Kim
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
Jongwon Kim7.1K views
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019 by devCAT Studio, NEXON
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
devCAT Studio, NEXON14.2K views
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018 by devCAT Studio, NEXON
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
[NDC 2009] 행동 트리로 구현하는 인공지능 by Yongha Kim
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
Yongha Kim28.3K views
온라인 게임 처음부터 끝까지 동적언어로 만들기 by Seungjae Lee
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee7.7K views
사용자 스토리 기반의 스크럼 by Junyi Song
사용자 스토리 기반의 스크럼사용자 스토리 기반의 스크럼
사용자 스토리 기반의 스크럼
Junyi Song22.2K views
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버 by Heungsub Lee
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Heungsub Lee50.2K views
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플... by Tae-Seong Park
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
Tae-Seong Park61 views
임태현, MMO 서버 개발 포스트 모템, NDC2012 by devCAT Studio, NEXON
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
실시간 게임 서버 최적화 전략 by YEONG-CHEON YOU
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
YEONG-CHEON YOU3.8K views
MMOG Server-Side 충돌 및 이동처리 설계와 구현 by YEONG-CHEON YOU
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU1.6K views
05_Reliable UDP 구현 by noerror
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현
noerror2.9K views

Similar to 인프콘 2022 - Rust 크로스 플랫폼 프로그래밍

ant로 안드로이드 앱을 자동으로 빌드하자 by
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
19K views39 slides
Slack과 Rust로 Amazon ECS에서 서비스 배포하기 by
Slack과 Rust로 Amazon ECS에서 서비스 배포하기Slack과 Rust로 Amazon ECS에서 서비스 배포하기
Slack과 Rust로 Amazon ECS에서 서비스 배포하기Eunchong Yu
677 views37 slides
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016 by
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016Amazon Web Services Korea
4.9K views58 slides
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017 by
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017Amazon Web Services Korea
5.7K views75 slides
DevOps with AWS Edge by
DevOps with AWS EdgeDevOps with AWS Edge
DevOps with AWS EdgeGS Neotek
149 views29 slides
SOSCON 2017 - Backend.AI by
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AIJoongi Kim
327 views42 slides

Similar to 인프콘 2022 - Rust 크로스 플랫폼 프로그래밍(20)

ant로 안드로이드 앱을 자동으로 빌드하자 by Sewon Ann
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
Sewon Ann19K views
Slack과 Rust로 Amazon ECS에서 서비스 배포하기 by Eunchong Yu
Slack과 Rust로 Amazon ECS에서 서비스 배포하기Slack과 Rust로 Amazon ECS에서 서비스 배포하기
Slack과 Rust로 Amazon ECS에서 서비스 배포하기
Eunchong Yu677 views
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016 by Amazon Web Services Korea
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016
AWS와 함께하는 DevOps이야기 :: 박선용 :: AWS Summit Seoul 2016
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017 by Amazon Web Services Korea
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
DevOps with AWS Edge by GS Neotek
DevOps with AWS EdgeDevOps with AWS Edge
DevOps with AWS Edge
GS Neotek149 views
SOSCON 2017 - Backend.AI by Joongi Kim
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AI
Joongi Kim327 views
React native development by SangSun Park
React native developmentReact native development
React native development
SangSun Park1.2K views
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기 by NAVER D2
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
NAVER D26.5K views
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해 by Terry Cho
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
Terry Cho33.9K views
이클립스 플랫폼 by Kenu, GwangNam Heo
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
Kenu, GwangNam Heo216 views
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기 by Sumin Byeon
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon8.9K views
AngularJS In Production by MooYeol Lee
AngularJS In ProductionAngularJS In Production
AngularJS In Production
MooYeol Lee1.2K views
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기 by Chanwoong Kim
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
Chanwoong Kim2.5K views
[NDC17] Kubernetes로 개발서버 간단히 찍어내기 by SeungYong Oh
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
SeungYong Oh17.5K views
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크 by Jeongkyu Shin
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Backend.AI: 오픈소스 머신러닝 인프라 프레임워크
Jeongkyu Shin3.6K views
초보 개발자/학생들을 위한 오픈소스 트랜드 by YoungSu Son
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
YoungSu Son829 views
강좌 04 펌웨어 구조 설계 by chcbaram
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
chcbaram6K views
[17.01.19] docker introduction (Korean Version) by Ildoo Kim
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)
Ildoo Kim472 views
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기 by NAVER Engineering
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
NAVER Engineering459 views

More from Chris Ohk

Momenti Seminar - 5 Years of RosettaStone by
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStoneChris Ohk
1.3K views27 slides
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기 by
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
1.5K views21 slides
Momenti Seminar - A Tour of Rust, Part 2 by
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Chris Ohk
622 views62 slides
Momenti Seminar - A Tour of Rust, Part 1 by
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Chris Ohk
797 views45 slides
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021 by
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Chris Ohk
766 views48 slides
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021 by
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Chris Ohk
1K views45 slides

More from Chris Ohk(20)

Momenti Seminar - 5 Years of RosettaStone by Chris Ohk
Momenti Seminar - 5 Years of RosettaStoneMomenti Seminar - 5 Years of RosettaStone
Momenti Seminar - 5 Years of RosettaStone
Chris Ohk1.3K views
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기 by Chris Ohk
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
Chris Ohk1.5K views
Momenti Seminar - A Tour of Rust, Part 2 by Chris Ohk
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
Chris Ohk622 views
Momenti Seminar - A Tour of Rust, Part 1 by Chris Ohk
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
Chris Ohk797 views
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021 by Chris Ohk
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Evolving Reinforcement Learning Algorithms, JD. Co-Reyes et al, 2021
Chris Ohk766 views
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021 by Chris Ohk
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Adversarially Guided Actor-Critic, Y. Flet-Berliac et al, 2021
Chris Ohk1K views
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020 by Chris Ohk
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Agent57: Outperforming the Atari Human Benchmark, Badia, A. P. et al, 2020
Chris Ohk1K views
Proximal Policy Optimization Algorithms, Schulman et al, 2017 by Chris Ohk
Proximal Policy Optimization Algorithms, Schulman et al, 2017Proximal Policy Optimization Algorithms, Schulman et al, 2017
Proximal Policy Optimization Algorithms, Schulman et al, 2017
Chris Ohk850 views
Trust Region Policy Optimization, Schulman et al, 2015 by Chris Ohk
Trust Region Policy Optimization, Schulman et al, 2015Trust Region Policy Optimization, Schulman et al, 2015
Trust Region Policy Optimization, Schulman et al, 2015
Chris Ohk666 views
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015 by Chris Ohk
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Continuous Control with Deep Reinforcement Learning, lillicrap et al, 2015
Chris Ohk1.1K views
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기 by Chris Ohk
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
GDG Gwangju DevFest 2019 - <하스스톤> 강화학습 환경 개발기
Chris Ohk1.1K views
[RLKorea] <하스스톤> 강화학습 환경 개발기 by Chris Ohk
[RLKorea] <하스스톤> 강화학습 환경 개발기[RLKorea] <하스스톤> 강화학습 환경 개발기
[RLKorea] <하스스톤> 강화학습 환경 개발기
Chris Ohk2.1K views
[NDC 2019] 하스스톤 강화학습 환경 개발기 by Chris Ohk
[NDC 2019] 하스스톤 강화학습 환경 개발기[NDC 2019] 하스스톤 강화학습 환경 개발기
[NDC 2019] 하스스톤 강화학습 환경 개발기
Chris Ohk7K views
C++20 Key Features Summary by Chris Ohk
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
Chris Ohk9.9K views
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지 by Chris Ohk
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
[델리만주] 대학원 캐슬 - 석사에서 게임 프로그래머까지
Chris Ohk2K views
디미고 특강 - 개발을 시작하려는 여러분에게 by Chris Ohk
디미고 특강 - 개발을 시작하려는 여러분에게디미고 특강 - 개발을 시작하려는 여러분에게
디미고 특강 - 개발을 시작하려는 여러분에게
Chris Ohk1.6K views
청강대 특강 - 프로젝트 제대로 해보기 by Chris Ohk
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
Chris Ohk3.2K views
[NDC 2018] 유체역학 엔진 개발기 by Chris Ohk
[NDC 2018] 유체역학 엔진 개발기[NDC 2018] 유체역학 엔진 개발기
[NDC 2018] 유체역학 엔진 개발기
Chris Ohk12.4K views
My Way, Your Way by Chris Ohk
My Way, Your WayMy Way, Your Way
My Way, Your Way
Chris Ohk1.7K views
Re:Zero부터 시작하지 않는 오픈소스 개발 by Chris Ohk
Re:Zero부터 시작하지 않는 오픈소스 개발Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
Chris Ohk3.4K views

인프콘 2022 - Rust 크로스 플랫폼 프로그래밍

  • 1. Rust 크로스 플랫폼 프로그래밍 하나의 코드를 여기저기 써볼래요? Momenti 옥찬호
  • 2. 옥찬호 Chris Ohk • 현 Momenti Engine Engineer • 전 Nexon Korea Game Programmer • Microsoft Developer Technologies MVP • C Korea Founder Administrator • Reinforcement Learning KR Administrator • IT 전문서 집필 및 번역 다수 • 게임샐러드로 코드 한 줄 없이 게임 만들기 2013 • 유니티 Shader와 Effect 제작 2014 • 2D 게임 프로그래밍 2014 , 러스트 핵심 노트 2017 • 모던 C 입문 2017 , C 최적화 2019 utilForever gmail.com utilForever
  • 3. • Rust 언어의 핵심 기능을 가볍게 살펴봅니다. 자세하게 공부하고 싶다면 공식 문서를 참고하세요. https://doc.rust lang.org/book/ • 발표 시간을 맞추기 위해 크로스 플랫폼 프로그래밍을 설명할 때 라이브러리/바이너리 파일을 만드는 단계까지만 설명하며, iOS 앱 또는 웹 사이트랑 연동하는 부분은 저장소에서 별도로 설명합니다. • 발표 자료와 예제 코드는 다음 저장소에서 확인 가능합니다. https://github.com/utilForever/2022 INFCON Rust CrossPlatform 들어가며
  • 4. 1 콘텐츠 목차 content 크로스 플랫폼 프로그래밍을 하게 된 이유 기존 개발 상황 및 문제점, 왜 Rust를 선택했는가 2 Rust 언어 소개 Rust 언어의 역사, 기본 문법 맛보기 3 Rust로 크로스 플랫폼 프로그래밍 해보기 Swift for iOS, WebAssembly for Web 4 몇 가지 팁들 애플리케이션 프리징, WebAssembly 디버깅
  • 7. • 여러 플랫폼에서 사용할 수 있는 코어 엔진을 만들어주세요. • iOS • Android • Backend • Web • … 이직 후 첫번째 업무
  • 8. • 똑같은 기능을 하는 엔진 코드가 여러 플랫폼에 각각 구현되어 있었다. • iOS 앱 C Objective C 기반 • 프론트엔드 TypeScript 기반 • 새로운 기능을 구현하거나 기존 기능을 수정해달라는 요청이 들어오면, • iOS 앱 C 코드를 구현한 뒤, Objective C 코드를 통해 앱에 적용한다. • 프론트엔드 TypeScript 코드를 구현해 웹에 적용한다. 기존에는 어떻게 개발되고 있었는가
  • 9. • 어떤 기능을 추가/삭제하거나 변경해야 할 때 지원하는 플랫폼마다 작업을 해줘야 한다. • 유지보수 측면에서 비효율적이다. • 지원하는 플랫폼이 늘어날수록 작업량이 늘어난다. • 똑같은 기능을 수행했을 때 플랫폼마다 동작 결과가 달라질 수 있다. • 플랫폼마다 서로 다른 사람이 구현하기 때문에 발생하는 문제다. • 서로 다른 동작으로 인해 사용자에게 불편을 초래할 수 있다. 문제점
  • 10. • 플랫폼마다 로직을 구현하지 않고, 한 곳에서 작업하면 좋겠다. • 다양한 플랫폼에 어떻게 대응해야 할까? • iOS 앱 Swift API 제공 • Android 앱 Kotlin API 제공 • 백엔드 Elixir API 제공 • 웹 사이트 웹어셈블리 바이너리 파일 제공 어떻게 개선할 것인가
  • 11. • 다양한 언어를 지원하기 위한 API와 웹 어셈블리 코드를 만들 수 있는 언어 • C , Rust, Java, Go, … • Rust를 선택한 이유 • 타입 안전성 • 메모리 안전성 • 동시성 프로그래밍 안전성 • FFI를 통해 API 지원을 쉽게 할 수 있음 • WebAssembly 바이너리를 쉽게 만들 수 있음 왜 Rust를 선택했는가
  • 12. • 같은 동작을 하는 프로그램을 여러 플랫폼에서 사용할 수 있도록 만들고 있다. • iOS 앱 Swift • Android 앱 Kotlin • 프론트엔드 TypeScript • 백엔드 Elixir • 각 플랫폼에서 사용자 입력에 따라 로직을 처리하고 결과물을 보여주기 위한 코드를 개별적으로 작성한다. 프로젝트 구조 코어 엔진 Rust FFI Foreign Function Interface 트랜스파일 Transpile Swift API Kotlin API Elixir API WebAssembly ReactiveX
  • 14. Rust란? • https://www.rust lang.org/ • 모질라 재단에서 2010년 7월 7일 처음 발표 • 현재는 러스트 재단으로 독립해서 개발되고 있다. • Rust 언어의 특징 • 안전한 메모리 관리 • 철저한 예외나 에러 관리 • 특이한 enum 시스템 • 트레이트 • 하이지닉 매크로 • 비동기 프로그래밍 • 제네릭
  • 15. • let 키워드를 사용 • 변수의 자료형을 대부분 유추할 수 있다. • 변수 숨김 Variable Shadowing 을 지원 • 변수의 이름은 언제나 snake case 형태로 짓는다. • Rust에서 변수는 기본적으로 변경 불가 Immutable 타입이다. • 변경 가능 Mutable 한 값을 원한다면 mut 키워드로 표시해줘야 한다. Rust 기본 문법 변수
  • 16. • 상수는 변수와 달리 반드시 명시적으로 자료형을 지정해야 한다. • 상수의 이름은 언제나 SCREAMING SNAKE CASE 형태로 짓는다. Rust 기본 문법 상수
  • 17. • switch를 대체하는 구문 • 모든 케이스를 빠짐 없이 처리해야 한다. Rust 기본 문법 match
  • 18. • null을 쓰지 않고도 Nullable한 값을 표현할 수 있는 내장된 Generic 열거체 Rust 기본 문법 Option
  • 19. • 실패할 가능성이 있는 값을 반환할 수 있도록 해주는 내장된 Generic 열거체 Rust 기본 문법 Result
  • 20. • 소유자가 함수의 인자로 전달되면, 소유권은 그 함수의 매개 변수로 이동 Move 된다. • 이동된 이후에는 원래 함수에 있던 변수는 더 이상 사용할 수 없다. • Rust의 참조 규칙 • 단 하나의 변경 가능한 참조 또는 여러개의 변경 불가능한 참조만 허용하며, 둘 다는 안된다. • 참조는 그 소유자보다 더 오래 살 수 없다. Rust 기본 문법 소유권
  • 21. • Rust의 컴파일러는 모든 변수의 생명 주기를 이해하며 참조가 절대로 그 소유자보다 더 오래 존재하지 못하도록 검증을 시도한다. • 함수에서는 어떤 매개 변수와 리턴 값이 서로 같은 생명 주기를 공유하는지 식별할 수 있도록 심볼로 표시해 명시적으로 생명 주기를 지정할 수 있다. Rust 기본 문법 생명 주기
  • 22. • Rust에서는 어떠한 방법으로도 데이터와 동작의 상속이 불가능하다. • 구조체는 부모 구조체로부터 필드를 상속받을 수 없다. • 구조체는 부모 구조체로부터 함수를 상속받을 수 없다. • 대신 Rust는 트레잇으로 다형성을 지원한다. 트레잇은 다른 트레잇의 메소드들을 상속받을 수 있다. Rust 기본 문법 OOP
  • 23. 3 Rust로 크로스 플랫폼 프로그래밍 해보기
  • 24. • 다양한 플랫폼에서 Rust 라이브러리에 있는 add 함수와 sub 함수를 호출해 결과를 받은 뒤 출력하는 예제를 만들어 보자. 무엇을 만들 것인가 Rust Swift WebAssembly TypeScript Objective C
  • 25. • rust cross : 핵심 코드를 구현하는 크레이트. add 함수와 sub 함수를 구현한다. • rust cross ios : Swift API를 만들기 위한 코드를 구현하는 크레이트. • rust cross web : WebAssembly로 트랜스파일하기 위한 코드를 구현하는 크레이트. 프로젝트 구조 Root rust cross Core Code rust cross ios Swift API rust cross web WebAssembly
  • 26. • 빈 디렉토리에 Cargo.toml 파일을 만든 뒤 다음과 같이 입력한다. 프로젝트 구조 잡기
  • 27. • cargo new 명령을 통해 만들 수 있다. • 라이브러리 프로젝트를 만들려면 lib를 붙어야 한다. • 그렇지 않으면, 바이너리 파일을 생성하는 프로젝트가 만들어진다. 새 Rust 라이브러리 프로젝트 만들기
  • 28. • 외부에서 사용할 수 있도록 pub 키워드를 붙이자. • 구현을 완료했다면 cargo build release 명령을 통해 빌드가 되는지 확인한다. rust cross : add/sub 함수 구현하기
  • 29. • Xcode를 설치한다. • App Store에서 설치할 수 있다. • Xcode 빌드 툴을 설치한다. • xcode select install • 그리고 크로스 컴파일이 가능하도록 iOS 아키텍처를 추가한다. • rustup target add aarch64 apple ios aarch64 apple ios sim x86 64 apple ios • 크로스 컴파일을 쉽게 할 수 있도록 도와주는 툴인 cargo lipo를 설치한다. • cargo install cargo lipo rust cross ios : iOS를 위한 라이브러리 빌드 준비
  • 30. • Cargo.toml 파일을 연 뒤, 다음과 같이 수정한다. • 정적/동적 라이브러리를 만들기 위해 lib 의 crate type을 staticlib , cdylib 로 설정한다. • rust cross 크레이트에 있는 함수들을 사용하므로 dependencies 에 추가한다. rust cross ios : 프로젝트 설정
  • 31. • 함수의 이름이 맹글링되지 않도록 # no mangle 을 추가한다. 맹글링 Mangling 이란 소스 코드에 선언된 함수나 변수의 이름을 컴파일 단계에서 일정한 규칙을 갖고 변형하는 걸 말한다. rust cross ios : C 브릿지에서 호출할 코드 작성
  • 32. • Rust에서 사용한 매개 변수 타입과 리턴 타입에 호환되는 타입을 사용해야 한다. • 예 : i32 또는 i64 int • 구현을 완료했다면 cargo lipo release 명령을 통해 라이브러리 파일 .a 가 생성되는지 확인한다. rust cross ios : C 브릿지 헤더 파일 작성
  • 33. • Rust로 WebAssembly 바이너리 파일을 빌드해주는 툴인 wasm pack을 설치한다. • curl https://rustwasm.github.io/wasm pack/installer/init.sh sSf sh • JavaScript 번들러를 설치하고 실행할 수 있도록 패키지 매니저인 npm을 설치한다. • npm install npm latest g rust cross web : WebAssembly를 위한 라이브러리 빌드 준비
  • 34. • Cargo.toml 파일을 연 뒤, 다음과 같이 수정한다. • 동적 시스템/러스트 라이브러리를 만들기 위해 lib 의 crate type을 cdylib , rlib 로 설정한다. • rust cross 크레이트에 있는 함수들을 사용하므로 dependencies 에 추가한다. • WebAssembly 빌드를 위해 wasm bindgen을 dependencies 에 추가한다. rust cross web : 프로젝트 설정
  • 35. • 필요할 경우 Wrapper로 처리할 수 있도록 # wasm bindgen 을 추가한다. • 구현을 완료했다면 wasm pack build 명령을 통해 wasm 파일이 생성되는지 확인한다. rust cross web : WebAssembly로 빌드할 코드 작성
  • 37. 애플리케이션 프리징 문제 • Swift 앱에서 어떤 동작을 수행하기 위해 UI에서 버튼을 누르면, 엔진에서 처리되는 동안에 앱이 멈추는 문제가 발생한다. • 원인은 Swift에서 필요한 함수들을 직접 호출하며, 모든 함수 호출은 동기적으로 동작하기 때문이다. Swift Rust 인스턴스 포인터 Swift UI Swift UI Rust Rust 코드
  • 38. 애플리케이션 프리징 문제 • 이를 해결하려면, 엔진에 대한 모든 요청을 처리하는 워커를 구현해 백그라운드 스레드에서 동작하게 만들어야 한다. • 백그라운드 스레드에서 워커 Worker 를 통해 요청들을 Job Queue에 넣으면 작업을 비동기적으로 수행한다. Rust 인스턴스 포인터 Swift UI Swift UI Rust Swift 백그라운드 스레드 워커 Worker Job Queue Fetch Process Rust 코드
  • 39. WebAssembly에서의 함수 맹글링 문제 • Rust WebAssembly로 빌드하면 함수 이름들이 맹글링된다. • 맹글링된 함수 이름 때문에 콜 스택을 제대로 확인할 수 없는 문제가 있다.
  • 40. WebAssembly에서의 함수 맹글링 문제 • 이 문제를 해결하려면 WebAssembly 코드를 배포하는 크레이트의 Cargo.toml에 각 빌드에 따른 설정을 해줘야 한다. 디버깅을 위해, dev 빌드에서 demangle name section을 true로 설정하고 wasm opt에 플래그 _g를 추가한다. • 이제 wasm 파일이 빌드되면 웹쪽 코드에 pkg 폴더를 붙여넣기하고 실행하면 된다.
  • 41. • npm을 실행했을 때 Failed to decode custom name section 2024365; ignoring Maximum call stack size exceeded 오류가 발생하는 경우가 있다. 이 때는 node를 실행할 때 stack size 10000을 추가해서 스택 크기를 늘려야 한다. • 하지만 보안 이슈로 인해 NODE OPTIONS를 사용할 수는 없고, package.json에서 npm start에 해당하는 부분에 추가하면 된다. • 심볼 정보를 전부 포함한 채로 실행하기 때문에 불러오는데 꽤 오랜 시간이 걸릴 수 있다. 인내하고 기다리자! WebAssembly에서의 함수 맹글링 문제
  • 42. • 이제 잘 실행되고 디맹글링된 함수 이름들을 볼 수 있다. WebAssembly에서의 함수 맹글링 문제
  • 43. 모멘티와 함께 성장할 분들을 찾습니다! https://rebrand.ly/momenti