Upgrade to PRO for Only $50/YearโLimited-Time Offer! ๐ฅ
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Rust Programming Language
Search
Hyeon Kim
May 09, 2015
Programming
8
2k
The Rust Programmingย Language
2015 spring, UPnL workshop.
Hyeon Kim
May 09, 2015
Tweet
Share
More Decks by Hyeon Kim
See All by Hyeon Kim
Adopting Rust to a club
simnalamburt
3
1k
Other Decks in Programming
See All in Programming
AIใณใผใใฃใณใฐใจใผใธใงใณใ๏ผskywork๏ผ
kondai24
0
180
ใใใชใใงใใ๏ผๅไบบ้็บใฎใใใ
tinykitten
PRO
0
110
WebRTCใ ็ถบ้บใซ่ฆใใๆปใใใซ่ฆใใ
sublimer
1
190
Developing static sites with Ruby
okuramasafumi
0
300
S3 VectorsใจStrands Agentsใๅฉ็จใใAgentic RAGใทในใใ ใฎๆง็ฏ
tosuri13
6
310
FluorTracer / RayTracingCamp11
kugimasa
0
230
้็บใซๅฏใใใ่ชๅใในใใฎๅฎ็พ
goyoki
2
1k
C-Shared Buildใง็ช็ ดใใAI Agent ใใใฏใในใใฎๅฃ
po3rin
0
390
Navigation 3: แแ ฅแจแแ ณแผแแ งแผ UIแ แ ณแฏ แแ ฑแแ กแซ แแ ขแธ แแ กแทแแ ขแจ
fornewid
1
340
ใชใชใผในๆใใในใใใใใใคใชใผๅฎ่กใใธ๏ผ้็บใใใผใธใฃใๅใ็ตใใ ใใฌใฌใทใผ่ชๅใในใใฎใขใใณๅๆฆ็ฅ
goataka
0
130
ๆใ่ถณใใชใ๏ผๅ ผๆฅญใใผใฟใจใณใธใใขใซๅฟ ่ฆใ ใฃใใขใผใญใใฏใใฃใจ็ซใกๅใ
zinkosuke
0
720
ๅ ็ขใชใใญใณใใจใณใใในใๅบ็คใๆง็ฏใใใใใซ่กใฃใๅใ็ตใฟ
shogo4131
8
2.4k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Done Done
chrislema
186
16k
A better future with KSS
kneath
240
18k
Music & Morning Musume
bryan
46
7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
4 Signs Your Business is Dying
shpigford
186
22k
Designing for humans not robots
tammielis
254
26k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Writing Fast Ruby
sferik
630
62k
Site-Speed That Sticks
csswizardry
13
1k
Transcript
The Rust Programming Language ์ฝ๊ณ ์์ ํ ์์คํ ํ๋ก๊ทธ๋๋ฐ ๊น์งํ 2015-05-09
๋ฐํ์ ์๊ฐ 13ํ๋ฒ ๊น์งํ UPnL ์๋ฒ๊ด๋ฆฌ์ (2014~now) @simnalamburt
target non-target ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ณ ์ถ์ผ์ ๋ถ, ํ๊ฒ๋์ค๋ถ ์์คํ ํ๋ก๊ทธ๋๋ฐ ์ํ ์ฌ๋
์ด ๋ฐํ๋ ์๋ด๊ธฐ๋ค์ ์ํด ๋์ด๋์กฐ์ ๋์ด์์ต๋๋ค.
Why Rust <****> ๋ฌ์คํธ๋ฅผ ์์ํ๊ณ ์ธ๊ธฐ๋จ์ด ๋์์ด์!
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
Dennis MacAlistair Ritchie 1941 ~ 2011 UNIX, C
malloc(), free() โข ์ํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ค๋ค โข
ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ ๋ฆฌ์ ์๋ฌด๊ฐ ์์ void *malloc(size_t size); void free(void *ptr)
malloc(), free() โข ๋ฐ์์๋ ์ฃผ์๊ฐ์ free()์ ๋๊ธฐ๋ฉด ๋ โข ๊ทผ๋ฐ
๊น๋จน๊ณ ์ํ๋ฉด Leakage void *mem = malloc(100); /* ... */ free(mem);
malloc(), free() โข ์ค๊ฐ์ ํจ์ ์กฐ๊ธฐ์ข ๊ฒฐ์ด๋ผ๋ ํ๋ค๋ฉด? โข ๊ผผ๊ผผํด์ ธ์ผํจ void
*mem = malloc(100); /* ... */ if (some_problem) { free(mem); return; } /* ... */ free(mem);
malloc(), free() โข ํ ๋น์ ์ ์ด์ ํ๋ฉด? โข ์กฐ๊ธฐ์ข ๊ฒฐ์ ์ธ๋ฒ
์ด์ ํ๋ฉด?
malloc(), free() โข ํ ๋น์ ์ ์ด์ ํ๋ฉด? โข ์กฐ๊ธฐ์ข ๊ฒฐ์ ์ธ๋ฒ
์ด์ ํ๋ฉด?
void *mem1 = malloc(100); void *mem2 = malloc(1000); /* ...
*/ if (some_problem) { free(mem1); free(mem2); return; } /* ... */ void *mem3 = malloc(10000); if (another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ if (yet_another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ free(mem1); free(mem2); free(mem3);
void *mem1 = malloc(100); void *mem2 = malloc(1000); /* ...
*/ if (some_problem) { free(mem1); free(mem2); return; } /* ... */ void *mem3 = malloc(10000); if (another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ if (yet_another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ free(mem1); free(mem2); free(mem3);
void *mem1 = malloc(100); void *mem2 = malloc(1000); /* ...
*/ if (some_problem) { free(mem1); free(mem2); return; } /* ... */ void *mem3 = malloc(10000); if (another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ if (yet_another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ free(mem1); free(mem2); free(mem3);
void *mem1 = malloc(100); void *mem2 = malloc(1000); /* ...
*/ if (some_problem) { free(mem1); free(mem2); return; } /* ... */ void *mem3 = malloc(10000); if (another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ if (yet_another_problem) { free(mem1); free(mem2); free(mem3); return; } /* ... */ free(mem1); free(mem2); free(mem3);
์ฌ์ค ์ด๋ ๊ฒ ํ๋ฉด ๋จ โข ๋ฌธ์ ํด๊ฒฐ? void *mem1 =
malloc(100); void *mem2 = 0; void *mem3 = 0; /* ... */ if (some_problem) { goto ERROR; } mem2 = malloc(1000); /* ... */ mem3 = malloc(10000); if (another_problem) { goto ERROR; } /* ... */ if (yet_another_problem) { goto ERROR; } /* ... */ ERROR: free(mem1); mem1 = 0; free(mem2); mem2 = 0; free(mem3); mem3 = 0;
์ฌ์ค ์ด๋ ๊ฒ ํ๋ฉด ๋จ โข ๋ฌธ์ ํด๊ฒฐ? โข malloc(), free()
์ธ์ ๋ค๋ฅธ ๋ฆฌ์ ์ค ํ ๋น์ ์คํ ์๋ฏ์ด ํ๋ฉด? โข double-free, use-after-free ์ ์ ์์ ํ๊ฐ? โข ์ฌ์ ํ free ๊น๋จน๊ณ ์ํ ๊ฐ๋ฅ์ฑ void *mem1 = malloc(100); void *mem2 = 0; void *mem3 = 0; /* ... */ if (some_problem) { goto ERROR; } mem2 = malloc(1000); /* ... */ mem3 = malloc(10000); if (another_problem) { goto ERROR; } /* ... */ if (yet_another_problem) { goto ERROR; } /* ... */ ERROR: free(mem1); mem1 = 0; free(mem2); mem2 = 0; free(mem3); mem3 = 0;
์ฌ์ค ์ด๋ ๊ฒ ํ๋ฉด ๋จ โข ๋ฌธ์ ํด๊ฒฐ? โข malloc(), free()
์ธ์ ๋ค๋ฅธ ๋ฆฌ์ ์ค ํ ๋น์ ์คํ ์๋ฏ์ด ํ๋ฉด? โข double-free, use-after-free ์ ์ ์์ ํ๊ฐ? โข ์ฌ์ ํ free ๊น๋จน๊ณ ์ํ ๊ฐ๋ฅ์ฑ void *mem1 = malloc(100); void *mem2 = 0; void *mem3 = 0; /* ... */ if (some_problem) { goto ERROR; } mem2 = malloc(1000); /* ... */ mem3 = malloc(10000); if (another_problem) { goto ERROR; } /* ... */ if (yet_another_problem) { goto ERROR; } /* ... */ ERROR: free(mem1); mem1 = 0; free(mem2); mem2 = 0; free(mem3); mem3 = 0;
์ฌ์ค ์ด๋ ๊ฒ ํ๋ฉด ๋จ โข ๋ฌธ์ ํด๊ฒฐ? โข malloc(), free()
์ธ์ ๋ค๋ฅธ ๋ฆฌ์ ์ค ํ ๋น์ ์คํ ์๋ฏ์ด ํ๋ฉด? โข double-free, use-after-free ์ ์ ์์ ํ๊ฐ? โข ์ฌ์ ํ free ๊น๋จน๊ณ ์ํ ๊ฐ๋ฅ์ฑ void *mem1 = malloc(100); void *mem2 = 0; void *mem3 = 0; /* ... */ if (some_problem) { goto ERROR; } mem2 = malloc(1000); /* ... */ mem3 = malloc(10000); if (another_problem) { goto ERROR; } /* ... */ if (yet_another_problem) { goto ERROR; } /* ... */ ERROR: free(mem1); mem1 = 0; free(mem2); mem2 = 0; free(mem3); mem3 = 0;
C++ Golden Rule Resource Acquisition Is Initialization
C++, RAII โข ์๋ฉธ์ ๋ฌธ๋ฒ โข ๊ดํธ๊ฐ ์ด๋ฆฌ๋ฉด, ๋ซํ๊ฒ์ด ๋ฌด์กฐ๊ฑด
๋ณด์ฅ๋จ struct raii { raii() { hello(); } ~raii() { bye(); } }; int main() { for (int a = 0; a < 10; ++a) { raii a; // ์๋์ผ๋ก hello() ๊ฐ ํธ์ถ๋จ /* ... */ } // ์ค์ฝํ๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ์๋์ผ๋ก bye() ๊ฐ ํธ์ถ๋จ }
์ค๋งํธ ํฌ์ธํฐ โข ๋๋ํ ํฌ์ธํฐ { int *dumb = new
int(10); /* ... */ } // <- LEAK! { auto smart = unique_ptr(new int(10)); /* ... */ } // <- RAII โฅ
์ด์ ์ง์ง ๋๊ฑด๊ฐ?!
None
1. ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๋ค 2. ์ค์ํ๊ธฐ ์ฝ๋ค C++์ ๋ฌธ์
1. ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๋ค 2. ์ค์ํ๊ธฐ ์ฝ๋ค C++์ ๋ฌธ์
1. ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๋ค 2. ์ค์ํ๊ธฐ ์ฝ๋ค C++์ ๋ฌธ์
C++ is not even close to memory safety โข Dangling
reference auto list = vector<int>(); /* ... */ auto& elem = list[0]; list.push_back(100); cout << elem; // BOOM!!
Case study: Firefox โข ํ์ดํผํญ์ค ๋ฒ๊ทธ, ๋ณด์์ทจ์ฝ์ ๋ค์ ์์ธ์ค double free,
user after free๊ฐ ์ฌ์ ํ ์์๊ถ์
Case study: Mabinogi 2
Case study: Mabinogi 2
Admit it C++ is not that good
Admit it C++ is not that good ์ฌ์ ํ ์ข๋ค๊ณ ์๊ฐํ์ ๋ค๋ฉด
์คํกํ๋ฆ ์ฆํ๊ตฐ์ ์์ฌํด๋ณด์ญ์์ค
โ์๋ ๊ธฐ์กด์๊ฒ์ ๋ซ๊ฒ ๋ง๋๋๊ฒ ์ ์ธ์ด ๋ง๋ค์ด์ ํ๋๊ฒ๋ณด๋ค ํจ์ฌ ํ๋ค์ด.โ
๋ฉํฐ์ฝ์ด ์ปดํจํ ์ฐ๊ตฌ์ค ์ด์ฌ์ง ๊ต์๋ 5์ 6์ผ 301๋ 101ํธ ๋ฉํฐ์ฝ์ด ์์ ์๊ฐ์ค ๋ฐ์ท
โ์๋ ๊ธฐ์กด์๊ฒ์ ๋ซ๊ฒ ๋ง๋๋๊ฒ ์ ์ธ์ด ๋ง๋ค์ด์ ํ๋๊ฒ๋ณด๋ค ํจ์ฌ ํ๋ค์ด.โ
๋ฉํฐ์ฝ์ด ์ปดํจํ ์ฐ๊ตฌ์ค ์ด์ฌ์ง ๊ต์๋ 5์ 6์ผ 301๋ 101ํธ ๋ฉํฐ์ฝ์ด ์์ ์๊ฐ์ค ๋ฐ์ท โ๊ธฐ์กด์๊ฒ์ ๋ซ๊ฒ ๋ง๋๋๋ ์ ์ธ์ด ๋ง๋๋๊ฒ ํจ์ฌ ์ฌ์.โ
None
None
โTo design and implement a safe, concurrent, practical, static systems
language.โ
fn main() { println!("Hello, world!"); } http://rust-lang.org
Why Rust <****> ๋ฌ์คํธ๋ฅผ ์์ํ๊ณ ์ธ๊ธฐ๋จ์ด ๋์์ด์!
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
LLVM
LLVM โข ์ปดํ์ผ๋ฌ ๊ธฐ๋ฐ๊ตฌ์กฐ โข ํ๋ฅญํ์ ๋ถ๋ค์ด ์ ๋ง๋ค์ด๋จ์
LLVM โข ์ปดํ์ผ๋ฌ ๊ธฐ๋ฐ๊ตฌ์กฐ โข ํ๋ฅญํ์ ๋ถ๋ค์ด ์ ๋ง๋ค์ด๋จ์
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
None
None
None
None
None
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
์ฌ์ก C++ โข ์๊ฑธ๋ฆฌ๋ ๋ฌธ๋ฒ โข ๋ฐฐ์ธ๊ฒ ๊ฑ ๋ง์ โข
Makefile, autoconf, cmake, ninja, ... โข ํต์ผ๋ ํจํค์ง๋งค๋์ X Rust โข ์ ์ โข ๊ฐ๋จํจ โข cargo โข cargo https://crates.io โข ๋งคํฌ๋ก, annotation, ...
๋ํ๋์ ๊ด๋ฆฌ โข ๊ฑ pip, npm, gem ์๋ค๋ ๋ค๋ฅผ๊ฑฐ ์์
โข ์ด๋ฌ๋ฉด ์ํฐ์น๋ก ๋ค ์ค์น๋จ โข ๋ฐ๋ฉด C++์์ ์ปดํ์ผ์ต์ ๋ฐ๊พธ๊ณ ๊ฒฝ๋ก์ค์ ํ๊ณ ๋ผ์ด ๋ธ๋ฌ๋ฆฌ๋ง๋ค ์ค์น๋ฐฉ๋ฒ ๋ค ๋ค๋ฅด๊ณ ๋๋ฆฌ๋ฅผ ์น์ง [dependencies] time = "*" glutin = "*"
rustdoc ๊ธฐ๋ณธ ๋ด์ฅ โข ์ฝ๋์ ์ฃผ์๋ง ์ ์ ํ ๋ฌ๋ฉด
rustdoc ๊ธฐ๋ณธ ๋ด์ฅ
rustdoc ๊ธฐ๋ณธ ๋ด์ฅ
๋๋ฒ๊น โข gdb, lldb, ์๊ธฐ๊ฐ ์ํ๋๊ฑฐ ์ฐ๋ฉด ๋จ โข LLVM
๊ธฐ๋ฐ์ด๋ค๋ณด๋ Xcode๋ก๋ ๋๋ฒ๊ทธํ ์ ์์
โRust Once, Run Everywhereโ ํฌ๋ก์ค ํ๋ซํผ
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy
๋น ๋ฅด๋ค ์์ ํ๋ค ์ฝ๋ค Fast Safe Easy 5์ 15์ผ Rust 1.0.0
์ด ์ถ์๋ ์์
์ข์ ์ปค๋ฎค๋ํฐ โข ๋ ๋ง, IRC, ์์ฒด ํฌ๋ผ โข #rust, #rust-gamedev,
#rust-webdev, #servo, ...
rust-kr.org โข ํ๋ฌ์ ํ๋ฒ์ฉ ๋ชจ์ฌ์ ์ฝ๋ฉ๋ชจ์์ ํจ โข ํ๊ต ๋ฐ์
๊ณ์๋ ์ข์ ๋ถ๋ค์ ๋ง์ด ๋ง๋ ์ ์๋ ์ ํํ ๊ธฐํ!
์ ์: UPnL ์ฌ๋ฆ Rust ์คํฐ๋ โข ๋จผ์ Rust์ ๋ํด ๋ฐฐ์ฐ๊ณ ,
๊ฐ์, ํน์ ๊ฐ์ด ๋ญ๊ฐ๋ฅผ ๋ง๋ค๋ฉด์ ์งํํ๊ณ ์ ํจ โข ๊ธฐ๋ํจ๊ณผ โข ์ํ์ ์ต์ํด์ง๋ฉด C/C++ ์ตํ๋๋ฐ์๋ ํจ์ฌ ๋์ ๋ง์ด ๋ ๊ฑฐ์์ผ โข ๋ ์์ฌํ ์ฌ๋ฆ๋ฐฉํ โข ์๋ด๊ธฐ์ ๊ฒฝ์ฐ ์ ๋ฐฐ๋ค์ ๋ฏ์ด๋จน์ ์ ์์ โข ํ์ฐธ์ โข sgkim โข apple โข kinetic
๋ด๊ฐ ํ๊ฒ โข obj-rs Wavefront OBJ 3D ๋ชจ๋ธ ํ์
๊ทผํฉ โข Rust + OpenGL๋ก 3D ๋์ ์ก์ ๊ฒ์ ๋ง๋๋์ค โข ๋น ๋ฆ
+ ํฌ๋ก์คํ๋ซํผ โข sgkim์ด๋ ๊ฐ์ดํ๋์ค โข ๊ด์ฌ์๋ ์๋ด๊ธฐ๋ ์ฐ๋ฝํ์์ค
Any Question? ๊น์งํ