โน๏ธ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.7 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://blog.cro.sh/posts/four-years-of-rust/ |
| Last Crawled | 2026-03-16 17:53:23 (21 days ago) |
| First Indexed | 2022-12-19 05:09:37 (3 years ago) |
| HTTP Status Code | 200 |
| Meta Title | 4๋ ๊ฐ์ Rust ์ฌ์ฉ ํ๊ธฐ | Option::None |
| Meta Description | 2018๋ ์ค์๋ถํฐ 4๋ ๊ฐ Rust๋ฅผ ์ฌ์ฉํด๋ณด์๊ณ , ์ต๊ทผ 1๋ ๋ฐ ๊ฐ๋์ ๋ณ์ญํน๋ก๋ฅผ ํ๋ฉด์ ํ๋ก๋์ ์์๋ ์ฌ์ฉ์ ํด ๋ณด์๋ค. ์ฐ๋ง์ด๊ธฐ๋ ํ๋, ๊ทธ ๋์ ๋ด๊ฐ Rust๋ฅผ ํ๋ฉด์ ์ด๋ค ์ธ์์ ๋ฐ์๋์ง๋ฅผ ์ค์ ์ผ๋ก ํ์ฌ ๋๋์๋ณด๊ณ ์ ํ๋ค. |
| Meta Canonical | null |
| Boilerpipe Text | 2018๋
์ค์๋ถํฐ 4๋
๊ฐ Rust๋ฅผ ์ฌ์ฉํด๋ณด์๊ณ , ์ต๊ทผ 1๋
๋ฐ ๊ฐ๋์ ๋ณ์ญํน๋ก๋ฅผ ํ๋ฉด์ ํ๋ก๋์
์์๋ ์ฌ์ฉ์ ํด ๋ณด์๋ค.
์ฐ๋ง์ด๊ธฐ๋ ํ๋, ๊ทธ ๋์ ๋ด๊ฐ Rust๋ฅผ ํ๋ฉด์ ์ด๋ค ์ธ์์ ๋ฐ์๋์ง๋ฅผ ์ค์ ์ผ๋ก ํ์ฌ ๋๋์๋ณด๊ณ ์ ํ๋ค.
์ฃผ์: ์์ฑ์์ ์ฌ๊ฒฌ์ด ๋ค๋ ํฌํจ๋์ด ์์ต๋๋ค.
Rust๋ ํญ๋๊ฒ ์ฐ์ด๋ ๋ค๋ฅธ ์ธ์ด๋ค์ ๋นํด ์๋นํ ์ด์ง์ ์ธ ๋ถ๋ถ์ด ๋ง๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ค๊ณ ๋จ๊ณ์์๋ถํฐ
ํน์ ํ ์ฒ ํ ํน์ ๊ท์น์ ์ ์ฉํ์ฌ ๋ฐ์ํ๋ ๊ดด๋ฆฌ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด ์ดํดํ๋ฉด ์กฐ๊ธ ๋ Rust๋ฅผ ์ฝ๊ฒ
๋ฐฐ์ธ ์ ์์ ๊ฒ์ด๋ค.
Zero-cost Abstraction
The concept of zero cost abstractions originally came from the functional world.
However, the terminology comes from C++. According to Bjarne Stroustrup,
In general, C++ implementations obey the zero-overhead principle:
What you donโt use, you donโt pay for. And further: What you do use, you couldnโt hand code any better.
1
๋ณดํต zero-cost abstraction์ ๋ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๋ฒ์ญํ์ฌ ์ค๋ช
ํ๊ณค ํ๋ค.
์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ์๋ ๋น์ฉ์ ์ง๋ถํ์ง ์๋๋ค.
์ถ์ํํ ์ฝ๋์ ๋น์ฉ์ด ์ถ์ํํ์ง ์์ ๋ ๊ฒ์ ๊ตฌํ๊ณผ ๋์ผํ๋ค.
1๋ฒ์ ์๋ฅผ ๋ค์ด๋ณด๋ฉด, Rust ์ธ์ด์ ์ฃผ์ํ ์์ ์ค ํ๋์ธ lifetime์ ํฌ์ธํฐ(ํน์ ๋ ํผ๋ฐ์ค)์ ์ ํจ์ฑ์ ๋ฐํ์์ด ์๋ ์ปดํ์ผ
ํ์์ ๊ฒ์ฆํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
JavaScript๋ฅผ ์๋ก ๋ค์ด๋ณด์. ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋ด๋๋ค๋ ๊ฒ์, ์ฌ์ค์ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณ์์ ๋ด๋๋ค๋ ๊ฒ์ด๊ณ ,
๊ทธ ๊ฐ์ฒด์ ์ง์ ์ ๊ทผํ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์
(
=
) ์ฐ์ฐ์ ํตํด ๋ณ์๋ฅผ โ๋ณต์ โํ์ฌ๋, ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ณต์ ๋์ด ์์ฑ๋๋ ๊ฒ์ด
์๋๋ผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๊ฐ ํ๋ ๋ ์๊ธฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๋ ํผ๋ฐ์ค๊ฐ ํญ์ โ์ด์ ์๋โ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค๋
๊ฒ์ ์ด๋ป๊ฒ ํ์ ํ ์ ์์๊น? ๋ต์ ์ญ์ค์ ์ด๊ฒ๋ โ์์ ์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๊ฐ ์กด์ฌํ๋ ๋์์๋ ๊ฐ์ฒด๊ฐ ํญ์ด ์ด์ ์๋๋คโ๋
๊ฒ์ด๋ค.
๋ค์ ๋งํด, JavaScript๋ ๋ฐํ์์ ์์ ์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค์ ์, ์ ์ํ ๋ง๋ก
refcount๋ฅผ ์ถ์ ํ๋ ๋น์ฉ์ ํ๋ก๊ทธ๋๋จธ์ ์๋์ ๊ด๊ณ์์ด ๊ณ ์ ์ผ๋ก ์ง์ถ๋๋ ๊ฒ์ด๋ค. (์์ฆ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋นํ ์ต์ ํ๊ฐ
๋์ด ์์ด์ ์๋ช
ํ ๊ฒฝ์ฐ์๋ ์์จ ์๋ ์๊ฒ ๋ค.)
Rust์ ๊ฒฝ์ฐ์๋ ๋ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํด์ ์ปดํ์ผ ํ์์ ๊ฐ๊ฐ์ ๊ฐ๋ค์ด ์ธ์ ์ฌ๋ผ์ ธ๋ ์์ ํ์ง๋ฅผ ์ถ์ ํ๊ณ , ๋ฐํ์์๋
๊ทธ๋ฌํ ๋น์ฉ์ด ๋ค์ง ์๋๋ก ์ค๊ณํ๋๋ฐ, ์ด โ์ธ์ โ ์์ ์ lifetime์ด ๊ฒฐ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
2๋ฒ์ ์๋ ๋ค์ด๋ณด์. Java์์ ์ค๋ฒ๋ผ์ด๋๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ๋ฉ์๋์ ์ค์ ๊ตฌํ์ ์ฐพ์ ๋ค์ ํด๋น ๊ตฌํ์ ์ฌ์ฉํด์ผ
ํ๊ธฐ์, dynamic dispatch๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ค. Dynamic์ด๋ผ๋ ๋ง์ด ๋ค์ด๊ฐ ๊ธฐ๋ฅ๋ต๊ฒ, ์ด๋ ๊ณต์ง๊ฐ ์๋๋ค. JVM์์
์ต์ ํ๋ฅผ ํ ์๋ ์๊ฒ ์ง๋ง ๋น์ฉ์ 0์ผ๋ก ๋ง๋ค ์๋ ์๋ค.
Rust์ ๊ฒฝ์ฐ์๋ (trait object๋ฅผ ์ ์ธํ๋ฉด) ๋ชจ๋ static dispatch๋ฅผ ์ํํ๋ค. ๋ค๋ฅด๊ฒ ๋งํ๋ฉด, ์ปดํ์ผ ์์ ์ ๋ชจ๋ ํจ์ ํธ์ถ์ด
์ด๋ ๊ตฌํ์ ์ฌ์ฉํด์ผ ํ๋์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค(๋์ ์ด ๋ํ Java์ ๋นํด ์ด์ง์ ์ด๊ฑฐ๋ ๊ฒฝ์ง๋ ์ค๊ณ๋ฅผ ์ ๋ํ๋ ์์ธ์ด ๋๋ค).
Zero-cost abstraction์ด ์ฃผ๋ ์ ์ฝ๋ ๋ง์ง๋ง, ๋๋ Rust๊ฐ C++์ ๊ฒฝ์ํ๋ฉฐ ๋ ๋์๊ฐ ์๋ง์ ํ๋ซํผ์์ ์คํ ๊ฐ๋ฅํ๋๋ก
ํ๋ ๋ฐ ๊ธฐ์ฌํ๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ โRust์ ์ฅ์ โ ๋ฌธ๋จ์์ ๋ค์ ์ธ๊ธํ๊ฒ ๋ค.
์๋ฌต์ ๋ณด๋ค๋ ๋ช
์์ ํํ์ ์งํฅ
C์์์ integer promotion์ ๊ธฐ์ตํ๋๊ฐ?
If an int can represent all values of the original type (as restricted by the width, for a bit-field),
the value is converted to an int; otherwise, it is converted to an unsigned int.
These are called the integer promotions. All other types are unchanged by the integer promotions.
2
๋์ถฉ ์์ฝํ๋ฉด C์์์ ์ ์ ์ฐ์ฐ์ ์์ค์ด ์ผ์ด๋์ง ์๋ ํ ์์์ ์ผ๋ก ๊ฐ ๊ฐ์ int ํน์ unsigned int๋ก ๋ณํ ํ ๊ณ์ฐํ๋ค.
C๊ฐ ์๋๋๋ผ๋, Javascript์
1 + 'a'
๋ผ๋๊ฐ ํ๋, ์์์ ํ๋ณํ์ด ๊ฐ์ ธ์ฌ ์ ์๋ footgun์ด๋ ์จ๊ฒจ์ง ๋น์ฉ ๋ฌธ์ ๋ฅผ
์ ๊ฑฐํ๊ธฐ ์ํด์ Rust๋ ๊ฐ๋ฅํ ํ ๋ช
์์ ์ผ๋ก ์ฝ๋๋ฅผ ํํํ๋ ๊ฒ์ ์ข์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์๋ฅผ ๋ค์ด dynamic dispatch๋ฅผ
๊ฐ๋ฅ์ผ ํ๋ trait object๋ ์๋ trait ์ด๋ฆ ๊ทธ ์์ฒด๋ง ์ฐ๋ฉด ๋์์ง๋ง Rust 2018๋ถํฐ๋ dyn์ด๋ผ๋ ํค์๋๋ฅผ ์์ ๋ถ์ฌ์ผ
ํ๋๋ก ๋ฐ๋์๋ค. ์์ ๋งํ ํ์
์บ์คํ
๋ ๋ชจ๋
as
ํค์๋๋
try_from
(์ ๋ณด ์์ค์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ ํ์๊ฐ ๊ถ์ฅ๋๋ค)
๋ฉ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํด์ผ๋ง ๋ฐ์ํ๋ค.
Rust์ ์ฅ์
๋ด๊ฐ 4๋
๋์, ์ง๋ฆฌ์ง๋ ์๊ณ Rust๋ฅผ ์ฌ์ฉํ ์ ์์๋ ์ด์ ๋ฅผ ์๊ฐํด๋ณด๊ณ ์ ํ๋ค.
๋งค์ฐ ๊ฐ๋ ฅํ ํ์
์์คํ
๊ณผ ์ด์ ๋ฐ๋ผ๋ถ๋ ํํ๋ ฅ
Rust์ ํ์
์์คํ
์ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋งํ ๋ ๊ฑฐ์ฌ๋ฆด ์ผ์ด ์์ ์ ๋๋ก ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ,
ํ์
์ถ๋ก ๊ณผ ํ์
๋ ๋ฒจ ์ฐ์ฐ ๊ธฐ๋ฅ๋ ์์ฃผ ํ๋ฅญํด์ zero-cost abstraction์ ๋ฌ์ฑํ๋ ๋ฐ์ ๋ง์ ๋์์ ์ค๋ค.
๊ทธ ์ค์์ ๋ช ๊ฐ๋ฅผ ๊ผฝ์๋ณด์๋ฉดโฆ
Generics
Rust์ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ์ ์์ฃผ ๊ฐ๋ ฅํด์, ๋ค์์ ๊ธฐ๋ฅ๋ค์ ๊ฐ์ง๊ณ ์๋ค
Trait: ํ์
์ โํน์ฑโ ์ ์์ ํ ์ ์๋ค. ์ด ํ์
์ ์ ์์๋ฅผ ๊ฐ์ง๋ค๊ฑฐ๋, ๋ฌธ์์ด๋ก ๋ณํ ๊ฐ๋ฅํ๋ค๋๊ฐโฆ
(interface์ฒ๋ผ ๋ค์ค ๊ตฌํ์ด ๊ฐ๋ฅํ์ง๋ง abstract class์ฒ๋ผ default implementation์ด ๊ฐ๋ฅํ, ์ค๊ฐ์ ๋ฌด์ธ๊ฐ๋ก
๋ด๋ ๋ฌด๋ฐฉํ๋ค.)
pub
trait
Ord
:
Eq
+
PartialOrd
<
Self
>
{
fn
cmp
(
&
self
, other:
&
Self
) ->
Ordering
;
fn
max
(
self
, other:
Self
) ->
Self
{
..
. }
fn
min
(
self
, other:
Self
) ->
Self
{
..
. }
fn
clamp
(
self
, min:
Self
, max:
Self
) ->
Self
where
Self
:
PartialOrd
<
Self
>
,
{
..
. }
}
๊ฐ์ด ์ ์์๋ฅผ ๊ฐ์ง์ ํํํ๋ Ord๋, ์์ ์ ์์ธ cmp๋ง ๊ตฌํํ๋ฉด
max, min, clamp ๋ฉ์๋์ default implementation์ด ๋ฐ๋ผ์จ๋ค.
Type bound: ํ์
ํ๋ผ๋ฏธํฐ์ trait/lifetime ์กฐ๊ฑด์ ๋ช
์ํ ์ ์๋ค.
fn
find_max
<
T:
Ord
>
(xs:
&
[T]) ->
&
T
{
// T๊ฐ Ord๋ฅผ ๊ตฌํํด์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
match
xs.len() {
0
=>
panic!
(
"xs is empty"
),
1
=>
&
xs[
0
],
_
=>
{
let
mut
max
=
&
xs[
0
];
for
x
in
xs {
if
x
>
max {
// ์ฌ๊ธฐ์ T: Ord๊ฐ ํ์ํด์ง๋ค
max
=
x;
}
}
max
}
}
}
Generic trait: Trait์๋ ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ์ผ ์ ์๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ์์๋ก
From<T>
๋ฅผ ๋ณด์.
pub
trait
From
<
T
>
{
fn
from
(T) ->
Self
;
}
์ด๋ค ํ์
์ด
From<T>
๋ฅผ ๊ตฌํํ๋ฉด, T๋ก๋ถํฐ ์์ (
Self
)์ผ๋ก ์๋ช
ํ๊ฒ ๋ณํ ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค.
Associated type: Trait์ โ์ฐ๊ด๋โ ํ์
์ ์ ์ํ์ฌ ๊ตฌํํ๋ ํ์
์ด ์ง์ ํค์ฃผ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
From<T>
์ โ์คํจ ๊ฐ๋ฅํโ ๋ฒ์ ์ธ
TryFrom<T>
๋ฅผ ๋ณด์.
pub
trait
TryFrom
<
T
>
{
type
Error
;
fn
try_from
(value:
T
) ->
Result
<
Self
, Self::Error
>
;
}
์ด๋ค ํ์
์ด
TryFrom<T>
๋ฅผ ๊ตฌํํ๋ ค๋ฉด, โ์คํจ ๊ฐ๋ฅํโ
T
๋ก๋ถํฐ ์ค๋ ๋ณํ๋ ์ ์ํ๊ณ , ๋ณํ์ด ์คํจํ์ ๋
๋ฐํํ ๋ฆฌํด ํ์
๋ ์ง์ ํด์ผ ํ๋ค.
Generic implementation: ํจ์์ trait๋ง ์ผ๋ฐํ ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋ผ,
impl
๋ธ๋ก๋ ์ผ๋ฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
์ฆ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์
๋ชจ๋์ ๋ํด์ ๋ค๋ฅธ Trait์ ๋ํ ๊ตฌํ์ ์ถ๊ฐํ ์ ์๋ค.
impl
<
T, U
>
Into
<
U
>
for
T
where
U:
From
<
T
>
,
{
fn
into
(
self
) ->
U
{
U::from(
self
)
}
}
Into<U>
๋
From<T>
์ โ์ญ์โ trait์ผ๋ก,
T -> U
๋ฐฉํฅ์ ๋ค์ง์ด์
U -> T
๋ฐฉํฅ์ผ๋ก (
something.into()
์ ๊ฐ์ด)
์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํด ์ฃผ๋ trait์ด๋ค(
From
์ด ์กด์ฌํ๋๋ฐ
Into
๊ฐ ์ ํ์ํ๋๊ณ ์๋ฌธ์ ๊ฐ์ง ์ ์์ง๋ง, ๋งค์ฐ ์ฌ์ํ(?)
์ด์ ์ด๋ฏ๋ก ์ผ๋จ ์๋ค๋ ์ฌ์ค๋ง ์๊ณ ๊ฐ์).
์ด
Into<U>
๋ฅผ
U: From<T>
๋ฅผ ๋ง์กฑํ๋ U์ ํด๋นํ๋ ๊ฐ๊ฐ์ ํ์
์ ๋๊ณ ๊ตฌํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ์ผ๋ฐํ๋
impl
์
์ฌ์ฉํ์ฌ ๋ชจ๋ ํ์
์ ๋ํด ํ ๋ฒ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
Generic associated type: associated type๋ ์ผ๋ฐํ์ํฌ ์ ์๋ค. ๋ค์ ๋งํด associated type๋ ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ์
์๋ค๋ ๊ฒ์ธ๋ฐ, ์กฐ๊ธ ๋ณต์กํ ์์๋ฅผ ํ๋ ๋ค์ด๋ณด๋ฉด:
trait
PointerFamily
{
type
Pointer
<
T
>
:
Deref
<
Target
=
T
>
;
fn
new
<
T
>
(value:
T
) ->
Self
::Pointer
<
T
>
;
}
struct
ArcFamily
;
impl
PointerFamily
for
ArcFamily {
type
Pointer
<
T
>
=
Arc
<
T
>
;
fn
new
<
T
>
(value:
T
) ->
Self
::Pointer
<
T
>
{
Arc::new(value)
}
}
struct
RcFamily
;
impl
PointerFamily
for
RcFamily {
type
Pointer
<
T
>
=
Rc
<
T
>
;
fn
new
<
T
>
(value:
T
) ->
Self
::Pointer
<
T
>
{
Rc::new(value)
}
}
struct
Foo
<
P:
PointerFamily
>
{
bar:
P
::Pointer
<
String
>
,
}
3
์ฌ๋ฌ ์ข
๋ฅ์ (์ค๋งํธ) ํฌ์ธํฐ๋ฅผ PointerFamily๋ผ๋ ํ๋์ trait์ผ๋ก ๋ฌถ์ด์ ํํํ ์ ์๊ฒ ๋๋ค.
ํฌ์ธํฐ๋
Rc<T>
,
Arc<T>
์ ๊ฐ์ด ๊ทธ ์์ฒด๋ก ์ผ๋ฐํ๋์ด์์ผ๋ฏ๋ก ํ ์ฐจ์ ์์์ ๋ค์ ํ๋ฒ ์ผ๋ฐํํ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ฐ,
์ด๋ฅผ GAT๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ Rust์ ๊ฐ๋ ฅํ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์ ์๋์ ADT์ ์กฐํฉํ๋ฉด,
์ฌ์ค์ ๊ฑฐ์ ๋ชจ๋ ๋ฌธ์ ์ํฉ์ ํ์
์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์๊ฒ ๋๋ค.
ADT:
enum
๊ณผ ํจํด ๋งค์นญ
Algebraic Data Type์ ์ค์๋ง๋ก, ํ์
์ ์ด๋ฅผ ๋ง์กฑํ๋ ๊ฐ๋ค์ ์งํฉ์ผ๋ก ๋ณด์์ ๋ ์งํฉ ๊ฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก ๋์ค๋
ํ์
์ ๋งํ๋ค. ์ผ๋ฐ์ ์ผ๋ก โํฉ์ฐ์ฐโ๊ณผ โ๊ณฑ์ฐ์ฐโ์ ๋ฐ์ง๋๋ฐ, ๊ฐ๊ฐ Rust์
enum
๊ณผ
struct
์ ๋์๋๋ค.
๋ค์ ๋งํด,
enum
์ โorโ,
struct
๋ โandโ๋ฅผ ๋ปํ๊ธฐ ๋๋ฌธ์ ํํํ๊ณ ์ถ์ ์ํฉ์ ํ์
์ผ๋ก ๋ํ๋ด๊ธฐ์ ๋งค์ฐ ์ ํฉํ๋ค.
์๋ฅผ ๋ค์ด, 3์ธต์ง๋ฆฌ ์ฐฌ์ฅ์ ์๋ ์ธ ๊ฐ์ง ์๊น์ ์ปต์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋์ด ์๋์ง ์๊ณ ์ถ๋ค๊ณ ํ์.
์ฐฌ์ฅ์ ๊ฐ โ์ธตโ์ ๋์์ ์กด์ฌํ๋ฏ๋ก, โandโ ์ฐ์ฐ์ธ
struct
๋ฅผ ์ด์ฉํ๋๋ก ํ๋ค.
struct
Cupboard
{
first:
Vec
<
Cup
>
,
second:
Vec
<
Cup
>
,
third:
Vec
<
Cup
>
,
}
์ปต์ ๊ฒฝ์ฐ์๋ ์ธ ๊ฐ์ง ์๊น์ด ์๊ณ ๋์์ ๋ ๊ฐ์ง ์์ ๊ฐ์ง ์๋ ์์ผ๋ฏ๋ก โorโ ์ฐ์ฐ์ธ โenumโ์ ์ด์ฉํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
enum
Cup
{
Red,
Blue,
Green,
}
๋ ๋์๊ฐ์, Rust์ enum์๋ ๊ฐ variant๋ง๋ค ๊ฐ์ ๋ฃ์ ์ ์๋ค. ๋ง์ฝ ์ฐฌ์ฅ์ ๋ฃ์ ์ ์๋ ๊ฒ์ด ์ ์๋ ์๋ค๋ฉด?
enum
Object
{
Cup(Cup),
Dish(Dish),
}
์ด๋ฒ์๋, ์ ์๋ฅผ ์์์ ๋ณด๊ดํ ์๋ ์๋ค๋ฉด?
enum
Object
{
Cup(Cup),
Dish(Dish),
StackedDish(
Vec
<
Dish
>
),
}
์ด๋ ๊ฒ ๋ง๋ค์ด์ง enum์ด๋ struct์์ ๊ฐ์ ๋ฝ์์ค๋ ค๋ฉด, ํจํด ๋งค์นญ์ ์ฌ์ฉํ ์ ์๋ค(struct์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ด์ ๋์ผํ๊ฒ
.
์ผ๋ก
์ ๊ทผํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค).
match
object {
Cup(cup)
=>
{
/* ... */
}
Dish(dish)
=>
{
/* ... */
}
StackedDish(stacked_dish)
=>
{
/* ... */
}
}
๊ฐ๊ฐ์ match ๊ณ๊ฐ์ง๋ค์์ ๊ฐ variant๊ฐ ๋ด๊ณ ์๋ ๊ฐ์ ๋ณ์๋ก ํ ๋นํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์ ์ ์๋ค.
ํจํด ๋งค์นญ์ ๋จ์ํ โํ ๊ฒนโ ๋ฒ๊ธฐ๋ ๊ฒ์ ๋์ด ์ค์ฒฉ๋ ํจํด์๋ ๋งค์นญํ ์ ์๋ค.
match
(object1, object2) {
// ๋ ๊ฐ์ ๋ํด ๋์์ ๋งค์นญํ๋ฉด์, ์์ชฝ์ ๊ฐ์ ๋ํด์๋ ํ๋ฒ ๋ ๋งค์นญ
(Cup(Cup::Red), Cup(Cup::Blue))
=>
{
/* ... */
}
// ๋ ๊ฐ์ ๋ํด ๋์์ ๋งค์นญํ๋ฉด์, ์์ชฝ์ ๊ฐ์ ์จ์ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด ์ ์
(Cup(a), Cup(b))
if
a
==
b
=>
{
/* ... */
}
// Cup: Eq ๋ผ ๊ฐ์ ํ์.
// _ ๋ ํญ์ ๋งค์นญ์ ์ฑ๊ณตํ๋ ๊ฐ์ด๋ค.
(Dish(dish), _)
=>
{
/* ... */
}
(StackedDish(stacked_dish), _)
=>
{
/* ... */
}
// ์์ ํจํด๋ค ์ค ์๋ฌด๊ฒ๋ ๋ง์กฑํ์ง ์์ผ๋ฉด...
_
=>
{
/* ... */
}
}
์กฐ๊ธ ๋ ํ์ค์ ์ธ enum์ ์์๋ก๋, ์๋ฌ ํธ๋ค๋ง์ ์ค์ถ๊ฐ ๋๋
Result<T, E>
ํ์
์ด ์๋ค.
enum
Result
<
T, E
>
{
Ok
(T),
Err
(E)
}
(์ฌ๊ธฐ์ ์ ์ ์๊ฒ ์ง๋ง enum์ด๋ struct๋ ์ผ๋ฐํํ ์ ์๋ค.)
๋์ ๋ฐํ์ ์ฑ๋ฅ
Rust์ zero-cost abstraction ๋๋ถ์, Rust ํ๋ก๊ทธ๋จ์ ์ผ๋ง๋ ์ง ํ์ํ ๋งํผ๋ง ์ฌ์ฉํ๋ โ๊ฐ๋ฒผ์ดโ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค(์ฃผ์:
์ฝ๊ฐ์ ์์ธ ์์). ์ด๋ ๋์ ๋ฒ์ฉ์ฑ๊ณผ๋ ๋ง๋ฌผ๋ฆฌ๋๋ฐ, ์ข ๋ ์๋์์ ์์ ํ๊ฒ ๋ค.
Zero-cost Asynchronous Programming
Rust์์ ์ ์ผ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ฅผ ๊ผฝ์ผ๋ผ๋ฉด, ๋๋ ๋ง์ค์ ์์ด
async
/
await
์ ์ ํํ ๊ฒ์ด๋ค.
๋ค๋ฅธ ์ธ์ด์์ ๊ตฌํํ๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ง๋ง(์ฒด๊ณ ์์ฒด๊ฐ ์กฐ๊ธ ๋ ๋ช
์์ ์ด๋ค),
์์ผ๋ก state machine์ ์ง์ ๊ตฌํํ ๊ฒ๊ณผ ๋๋ฑํ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ
4
GC๊ฐ ํ์์๋ ์ธ์ด ์ค์์๋ Rust๊ฐ
๋
๋ณด์ ์ผ๋ก ํธ์์ฑ๊ณผ ์์ ์ฑ ๋ฉด์์ ์ฐ์๋ฅผ ์ ํ๊ณ ์๋ค.
ํนํ ์ด๋ ๋๊ท๋ชจ ๋คํธ์ํฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์
์์ ์ ์ง์ฐ, ๊ณ ๋ถํ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ ๋ ํฌ๊ฒ ์์ฉํ๋๋ฐ,
Discord๋
GC๋ก ์ธํ ์ง์ฐ์๊ฐ ํธ์ฐจ๋ก ์ธํด Rust๋ก ํน์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์์ฑํ์ฌ ํฐ ์ฑ๋ฅ ํฅ์์
์ป์๊ณ
, CloudFlare๋
๋ด/์ธ๋ถ๋ง์ ์ฐ๊ฒฐํ๋ ํ๋ก์๋ฅผ
NGINX์์ ์์ฒด Rust ๊ตฌํ์ผ๋ก ๊ต์ฒดํ์ฌ CPU ์์์ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋
ํ๋ค
.
๋ค์ผ๋ก ์ป๋ memory safety ๋์ CloudFlare๋
์๋ฐฑ์กฐ ๋จ์์
์์ฒญ์ ์ฒ๋ฆฌํ๋ฉด์ ๋จ ํ๋ฒ์ ํ๋ก์ ๋ฒ๊ทธ๋ก ์ธํ ํฌ๋์๋ ๊ฒฝํํ์ง ์์๋ค๊ณ ํ๋ค. ์คํ๋ ค ํ๋์จ์ด ๋ฌธ์ ์
์๋ ค์ง์ง ์์
๋ฆฌ๋
์ค ์ปค๋์ ๋ฒ๊ทธ
๋ฅผ ์ฐพ๊ธฐ๊น์ง ํ๋ค๊ณ โฆ
๊ฐ๋ฐ ๋๊ตฌ์ ์ฑ์ํจ
๊ฐ์ธ์ ์ผ๋ก Visual Studio๋ณด๋ค๋ ํ ์ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ค๋ฅธ โ์ ์โ ์ธ์ด๋ค๊ณผ ๋น๊ตํ๋ฉด ๋
๋ณด์ ์ธ 1์์๋ฅผ ๋ฌ๋ฆฌ๊ณ ์์ง
์๋ ์๊ฐํ๋ค. ๋น๋ ์์คํ
๊ณผ ์์กด์ฑ ๊ด๋ฆฌ ์ญํ ์ ํด ์ฃผ๋
cargo
๋ ๋ค๋ฅธ ์ธ์ด์์ ๋ฒค์น๋งํนํ ์ ๋๋ก
5
Rust์ ์ฅ์ ์ค ํ๋๋ก ๊ผฝํ๊ณ , Rust ํด์ฒด๋ค์ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ค์น๋ฅผ ๋์์ฃผ๋
rustup
๋ ๋งค์ฐ ํธ๋ฆฌํ๋ค.
LSP ๊ตฌํ์ฒด์ธ
rust-analyzer
๋๋ถ์ LSP ํด๋ผ์ด์ธํธ๊ฐ ๋ด์ฅ๋ ๋ง์ ์๋ํฐ์์ IDE์ ๋น์ทํ ๊ฒฝํ์ ๊ฐ์ง ์๋ ์๋ค.
Memory Safety
์์ ๋งํ zero-cost abstraction์ ํตํด ๊ถ๊ทน์ ์ผ๋ก Rust๋ โmemory safetyโ๋ฅผ ๋ฌ์ฑํ๋ค. Rust์์ unsafe ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง
์๋ ํ, ์ปดํ์ผ๋๋ ๋ชจ๋ ์ฝ๋๋
๋ฉ๋ชจ๋ฆฌ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํค์ง ์์์ด ๋ณด์ฅ๋๋ค
. ์์ฃผ ๊ฐ๋์ฉ safe ์ฝ๋๋ง์ผ๋ก undefined
behavior๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ตฌ๋ฉ์ด ๋ฐ์ํ์ง๋ง(soundness hole), ๊ทธ๋ฌํ ๋์๋ค์ ๋ช
๋ฐฑํ ๋ฒ๊ทธ๋ก ๊ท์ ๋์ด ์ต์ฐ์ ์ ์ผ๋ก
์์ ๋๋ค.
๋ฒ์ฉ์ฑ
์์์ ๊ณ์ ์ธ๊ธํ๋ฏ์ด, Rust ์ฝ๋๋ ์๋ง์ ํ๋ซํผ์์ ๊ตฌ๋๋๊ณ ์๋ค.
๋ฐ์คํฌํ ๋ฐ ์ค๋งํธํฐ OS์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ
Windows, Linux, MacOS, Android, iOS
๊ณ ์ฑ๋ฅ ์น ๋ฐฑ์๋
Linux Kernel ๋๋ผ์ด๋ฒ (>= 6.1)
eBPF ๋ฐ WebAssembly
๋ธ๋ก์ฒด์ธ(๋ธ๋ก์ฒด์ธ ๋
ธ๋, ์ค๋งํธ ์ปจํธ๋ํธ ๊ตฌํ ๋ฑ์ ๋ชจ๋ ์ฐ์ธ๋ค).
์๋ฒ ๋๋ ํ๋ก๊ทธ๋๋ฐ(์ด ์ชฝ์ ๋น๊ต์ ์ํ๊ณ๊ฐ ์ฝํ๋ค)
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ Rust๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก zero-cost abstraction์ ์งํฅํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํ๋ซํผ์ ์ฌ๋ ค๋์๋
์ถ๊ฐ์ ์ธ ๋น์ฉ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด Javascript๋ฅผ eBPF ์์ ์ฌ๋ฆฌ๋ ค ํ๋ฉด, ๊ฐ๋น์ง ์ปฌ๋ ์
์ด๋
์ฝํ ๋์ ํ์
์์คํ
์ ๋น์ฉ์ด ํ์ฐ์ ์ผ๋ก ๋ฐ๋ผ์ค๊ฒ ๋ ๊ฒ์ด๋ค. (AssemblyScript์ ๊ฐ์ด ํํธํ๋ ์ํ๊ณ๊ฐ ๋ฐ์ํ ์๋ ์๋ค).
Rust์ ๋จ์
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๋ฉด Rust๋ โ์์ ํโ ์ธ์ด ๊ฐ์ง๋ง, ๊ทธ๋ ์ง ์๋ค. Rust๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด์ ๊ทธ๋ฌํ ๊ฒฐ์ ๋ค์ ํฌ๊ฒ ์ฒด๊ฐํ ์ ์์๋ค.
๋์ ์ง์
์ฅ๋ฒฝ
Rust๋ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ์ถ์ํํ์ง ์๋๋ค(์ฝ๊ฒ ์ถ์ํํ๋ฉด ๋ฐ๋์ ๋น์ฉ์ด ๋ฐ์ํ๋ ์ง์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค)
6
.
์๋ฅผ ๋ค์ด, Rust์์ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์ผ๋ฉด ๋ค์์ ํ์
๋ค์ ๋ํด ์ดํดํ ํ์๊ฐ ์๋ค:
String
(ํ์ ํ ๋น๋ UTF-8 ๋ฌธ์์ด)
&str
(๋ฌธ์์ด โ์ฌ๋ผ์ด์คโ. UTF-8๋ก ํํ๋ ๋ฐ์ดํธ์ด์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค)
&String์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ , ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ &str์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
&[u8]
(๋ฐ์ดํธ์ด. ๊ทธ ์์ฒด๋ก ๋ฌธ์์ด์ ์๋์ง๋ง ํ์ฑ ์ ์ ๋ง๋ ํ๋ฅ ์ด ๋๋ค)
Cow<str>
(โCopy-on-Writeโ ๋ฌธ์์ด. ๋ณต์ฌ๋ฅผ ์ต์ํํ๊ณ ์ถ์ ๋ ๋ง๋ ์ ์๋ค)
impl AsRef<str>
(๊ทธ ์์ฒด๋ก ํ์
์ ์๋์ง๋ง,
&str
๊ณผ
String
์ ๋์์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค)
OsString
,
CString
,
Path
์ ๊ฐ์ด ํน์ํ ๋ชฉ์ ์ ์ง๋ ํ์
๋ค์ ๊ฑฐ๋ก ํ์ง ์์๋๋ฐ๋ ๋ฒ์จ ๊ณต๋ถํ ๊ฒ์ด ์ฐ๋๋ฏธ๊ฐ ๋์๋ค.
๋ค๋ฅธ ์ธ์ด๋ค์ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๋ฐฐ์ ํ๊ณ ์ฌ์ด ๊ธธ๋ก (๋น์ฉ์ ์ง๋ถํ๊ณ )๋์๊ฐ ์ ์์ง๋ง, Rust์ ๊ฒฝ์ฐ์๋ ๊ทธ๊ฒ์ ํ์ฉํ์ง ์์
ํ์ต์๋ฅผ ์ข์ ์ํค๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ๋ค.
๋ฌผ๋ก Rust๋ โ์ฌ์ด ๊ธธโ์ ํํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง, ๋๋ถ๋ถ์ ์ค์ ์ฝ๋๋ค์ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋น์ฉ์ ์ง๋ถํ๋์ง์กฐ์ฐจ๋
์๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ค๊ณ์ ์ ์ฝ
์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ADT๋ฅผ ์ฐฌ์ํ๋ค๊ฐ ์ ์ฝ์ด ์๋ค๊ณ ํ๋ฉด ๋ชจ์๋์ง ์๋๊ณ ํ ์๋ ์์ง๋ง, Rust์ ํ์
์์คํ
์ด
โ์์ ํ๋ฉฐ ๋น์ฉ ์์ดโ ํํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ ์๋ค. ์๊ธฐ์ฐธ์กฐ/์ํ์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ ๊ทธ๊ฒ์ธ๋ฐ, lifetime์ ์กด์ฌ๋ก ์ธํด ๋ชจ๋ Rust์
๊ฐ๋ค ๊ฐ์ ์ฐธ์กฐ ๊ด๊ณ๋ DAG(๋ฐฉํฅ ์๊ณ ์ํ ์๋ ๊ทธ๋ํ)๋ก ํํ๋ ์๋ฐ์ ์๋ค. ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ ์๊ฐ lifetime์
์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ์ ์คํจํ๋ค.
๋ฌผ๋ก
Arc::new_cyclic
๊ณผ ๊ฐ์ด ์ํ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ ๋๊ตฌ๋ค๋ ์์ผ๋, weak pointer๋ฅผ ์ฌ์ฉํ๋ค๋๊ฐ ํ๋ ์์ผ๋ก
์ถ๊ฐ์ ์ธ ๋น์ฉ(๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌํจ)์ ์ง๋ถํ๊ฑฐ๋,
Pin::new_unchecked
๋ฅผ ์จ์ unsafeํ๊ฒ ์์ฑํด์ผ ํ๋ค.
(ํ์๋
ouroboros
๋ผ๋ crate๊ฐ ์๊ธฐ์ฐธ์กฐ๋ฅผ ํธํ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํด ์ค๋ค๊ณ ํ๋๋ฐ,
์ง์ ์จ๋ณด์ง๋ ์์์ ์ธ๊ธํ์ง๋ ์๊ฒ ๋ค.)
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ๊ตฌ์กฐ๊ฐ ํ์ํ์ง ์๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ต์ ์ธ๋ฐ, ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค ์ง์
ํ ์ด์ฌ์ ์
์ฅ์์๋
์ด๋ ค์ธ ์๋ฐ์ ์๋ค. C/C++/Java ๋ฑ์ผ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ํ์ค ํ์ค(line-by-line) ๋ฒ์ญํด ์ด์ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌํ ์ธ์ด๋ค์์๋ ์๊ธฐ์ฐธ์กฐ๋ ์ํ์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ ๋ํ๋๋ ํจํด์ด ์ข
์ข
๋ณด์ด๊ณค ํ๋ค. (๋งํฌ๋ ๋ฆฌ์คํธ๋ผ๋๊ฐ, ์๋ฐฉํฅ ๊ทธ๋ํ๋ผ๋๊ฐ)
์๊ธฐ์ฐธ์กฐ๊ฐ ์๋๋๋ผ๋, Rust์ borrow checker์ ๊ถํฉ์ด ๋ง์ง ์๋ ํจํด๋ค์ด ์ฌ๋ฟ ์กด์ฌํ๋๋ฐ, ์๋ฅผ ๋ค์ด
์ด๋ฒคํธ ๋ฆฌ์ค๋์ callback์ด ์ฃผ๊ฐ ๋๋ ์ต์ ๋ฒ ๋ชจ๋ธ์ ๊ฒฝ์ฐ callback์ด ์ฌ์ฉํ๋ ๊ฐ๋ค์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ปดํ์ผ ํ์์ ์ถ์ ํ๋
๊ฒ์ด ํ๋ค๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ํ ๋น์ด๋ ๋ ํผ๋ฐ์ค ์นด์ดํ
์ด ํ์ํด์ง๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด์๋ง ์ฃผ์ ๊น๊ฒ unsafe ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๋น์ฉ์ ์ง๋ถํ์ฌ ๋ชจ๋ํํ๋ ์์ผ๋ก ๊ฒฉ๋ฆฌํ ์๋
์์ง๋ง(Rust์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.)
Rust๊ฐ ์๋ํ๋ ์ด์์ด ํญ์ ํ์ค์ 100% ์ ์ฉ๋ ์๋ ์๋ค๋ ์ฌ์ค์ ์ธ์งํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ โ๊ฒฉ๋ฆฌโ ์์
์ unsafe๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ โ์ฌ๋ฐ๋ฅด๊ฒโ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ์ด ์์ฃผ ์ด๋ ค์ด ๊ฒ์ผ๋ก ํ๊ฐ๋๋ค.
Rust์ memory safety ๋ฑ์ด ์ ๊ณตํ๋ ๋ณด์ฅ์ ํน์ฑ์, ์ง์ผ์ผ ํ๋ ๊ท์น์ด ์๊ฒฉํ๊ณ ์ด๋ฅผ ์๋ฐํ ์์ ์ปดํ์ผ๋ฌ์ ๊ณต๊ฒฉ์ ์ธ
์ต์ ํ๋ก ์ธํ ์ค์๋์ด ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋น๊ต์ ๋ฎ์ ์์ฐ์ฑ(๊ฐ๋ฐ ์๋)
์๋ จ๋ Rust ํ๋ก๊ทธ๋๋จธ๋ lifetime, borrow checker, type checker์ ์จ๋ฆํ๋ ์ผ์ด ์์ฃผ ๋ฐ์ํ๋ค. ๋น ๋ฅด๊ฒ ๊ตฌํํด์ ๋ด๋ณด๋ด๋
ํ๋ก์ธ์ค๊ฐ ์ ๋ฆฝ๋ B2C ์๋น์ค๋ค์ ์ด์ํ๋ ๊ธฐ์
์ ๊ฒฝ์ฐ์๋ Rust๋ฅผ ๋์
ํ์ ๋ ๊ฐ๋ฐ ์๋๊ฐ ๋น๊ต์ ๋จ์ด์ง ์๋
์์์ ๋ช
์ฌํด์ผ ํ๋ค.
์ฌ๊ฒฌ์ผ๋ก, ์ด๋ Go๊ฐ ์น ๋ฐฑ์๋ ๋ถ์ผ์์ ํฌ๊ฒ ์ ํํ ์ด์ ์ ๊ฑฐ์ ์ ๋ฐ๋๋๋๋ฐ, Go๋ ๋ณต์กํ ๋ฌธ์ ๋ ๋น์ฉ์ ๋ด๊ณ
์ฝ๊ฒ ์ถ์ํํ๋ฉฐ, ํ์
์์คํ
์ ๋ณ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์๊ณ (1.18์์ผ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ์ด ์ ์์ผ๋ก ์ถ๊ฐ๋์๋ค), ๋ค๋ฅธ ๊ธฐ๋ฅ๋
๋ง์ง ์์ ์ง์
์ฅ๋ฒฝ์ด ๋งค์ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๋์ ์์ฐ์ฑ์ ๊ธฐ๋ํ ์ ์๋ค.
๋งคํฌ๋ก
์ด ๊ธฐ๋ฅ์ Rust์์ ๋ฌด์ ํ์ ๊ฐ๊น์ด ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง,
๊ฐ์ธ์ ์ผ๋ก๋ ์ฉ ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ ํ๊ณ ์ ํ๋ค.
์ฒซ ๋ฒ์งธ๋ก, ๋งคํฌ๋ก๋ ๋ฌธ๋ฒ ํ ํฐ ํธ๋ฆฌ๋ฅผ ๋ฐ์์ ํน์ ์์
์ ์ํํ์ฌ ์๋ก์ด ๋ฌธ๋ฒ ํธ๋ฆฌ๋ฅผ ๋ฐํํ๋ ๊ท์น์ด๋ผ๊ณ ๋งํ ์ ์๋๋ฐ,
์ค๋ช
์์๋ ์ ์ถํ ์ ์๋ฏ์ด ๊ธฐ์กด์ Rust ์ง์๊ณผ๋ ํ์ดํ, Rust์ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ๊ดํ ์ง์์ ์ต๋ํด์ผ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ค์ ๋งํด, ๋งคํฌ๋ก๋ ์ฌ์ค์ Rust ๋ฌธ๋ฒ๋ง ์ฐจ์ฉํ ๋๋ค๋ฅธ Rust ์์ ๋ฏธ๋ ์ธ์ด๋ก์ ๊ธฐ๋ฅํ๋ค๋ ์ ์์ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ดด๋ฆฌ๋ฅผ ๋ฐ์์ํจ๋ค.
(์ด ๋จ์ ์ ๋ ๊ฐ์ง ์ข
๋ฅ์ ๋งคํฌ๋ก ์ ์ ๋ฐฉ์์ธ procedural macro์ declarative macro์ ๋ชจ๋ ํด๋น๋๋ค.)
๋ ๋ฒ์งธ๋ก, proc-macro๋ ๋งคํฌ๋ก๋ฅผ ์ ์ฉํ๋ ค๋ ์ฝ๋ ์ด์ ์ ์ปดํ์ผ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์ปดํ์ผ ์๊ฐ์ ์ฆ๊ฐ์ํจ๋ค.
ํนํ ์ด๋ ์์ค์ฝ๋๋ง์ ์์ถํด์ ์ฌ๋ฆฌ๋ Rust์ crate ์์คํ
๊ณผ ๋ง๋ฌผ๋ ค ๋ฌธ์ ๋ฅผ ๊ฐ์ค์ํค๋๋ฐ, proc-macro๋ฅผ ๋ฏธ๋ฆฌ ์ปดํ์ผํ
๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(๊ด๋ จํ์ฌ
watt
๋ผ๋ ์คํ์ ์ธ WebAssembly ๊ธฐ๋ฐ
proc-macro ๋ฐํ์์ด ์์ง๋ง ๋ฉ์ธ์คํธ๋ฆผ์ ๋ค์ด์ค๊ธฐ๋ ์์ง ๊ณค๋ํ๋ค.)
์ธ ๋ฒ์งธ๋ก, IDE์ proc-macro ๊ฐ์ ์กฐํ๊ฐ ์ข์ ํธ์ ์๋๋ผ proc-macro๋ฅผ ์ง๋์น๊ฒ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ ๊ฒฝํ์ด ์คํ๋ ค
๊ฐ์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โ์ ํต์ ์ธโ ๋งคํฌ๋ก ์ ์ ๋ฐฉ๋ฒ์ธ โdecl-macroโ, ๋ค๋ฅธ ๋ง๋ก macros by example ๋ฐฉ์์ ์์ ํ ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ
๋ฌธ์ ์ ๋ํด ๋น๊ต์ ์์ ๋กญ์ง๋ง, proc-macro๋ณด๋ค๋ ๋ ์ด์ง์ ์ธ ๋ฌธ๋ฒ๊ณผ ์ ์ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์๊ณ (๊ฐ๋จํ ์ค๋ช
ํ๋ฉด,
Rust ์ฝ๋์ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ๋ํด ํจํด ๋งค์นญ์ ์๋ํ๋ค), ํํ ๊ฐ๋ฅํ ๋ฒ์์๋ ์ ์ฝ์ด ์์ด์ ๊ธฐ๋ฅ์ ๋ณต์ก๋๊ฐ ํน์ ์ง์ ์
๋์ผ๋ฉด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. (๊ทธ ์์๋ก, ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋
pin-project
์
pin-project-lite
๋ฅผ ๋ณด๋ฉด ์ ์๋ proc-macro, ํ์๋ macros by example ๋ฐฉ์์ธ๋ฐ
ํ์๋ ์ ์์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์์๋ ๋ถ๊ตฌํ๊ณ ํจ์ฌ ๋ ์ดํดํ๊ธฐ ์ด๋ ต๋ค).
๋ง์ด๋๋ฆฌํฐ
Rust ๊ตฌ์ธ/๊ตฌ์ง ์์ฅ์ Go์ ๋น๊ตํด์๋ ๋งค์ฐ ์ข๋ค. ํนํ ํ๊ตญ์ ๊ฒฉ์ฐจ๊ฐ ํจ์ฌ ์ฌํ๋ค.
๊ฒฐ๋ก : 10๋
๋ค์๋ Rust๋ก ๋ฐฅ๋ฒ์ด๊ฐ ๊ฐ๋ฅํ ๊น?
๋จ์ ์ ์ค์ค์ด ๋์ดํ์ง๋ง ๋ต์ โyesโ๋ผ๊ณ ์๊ฐํ๋ค. ๋ด๊ฐ ์๊ฐํ๋ ํ์ฌ(๊ทธ๋ฆฌ๊ณ ๊ทผ๋ฏธ๋)์ Rust ์ฌ์ฉ์ฒ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋๊ท๋ชจ ์๋น์ค์ ๋ฐฑ์๋
ํ์ฌ๋ก์๋, ๊ฐํ ๋งํ๊ฑด๋ฐ ๋ค์์ ์ํฉ์์ Rust๋ฅผ ์ด๊ธธ ๋์์ ์๋ค.
๋๊ท๋ชจ ์๋น์ค๋ฅผ ์ด์ํ์ฌ ๋์ ์ํฌ๋ก๋๋ฅผ ๊ฐ์ง๊ณ
I/O๊ฐ ๋งค์ฐ ์ฆ์ผ๋ฉฐ
๋ถํน์ ๋ค์์๊ฒ ์๋น์ค(B2C)ํ์ฌ ๊ฐ๊ฑด์ฑ์ ํนํ ์ ๊ฒฝ์จ์ผ ํ๋
(์ด๋ค ์ค ๋ ๊ฐ๋ง ํด๋น๋์ด๋ ์์ฃผ ๋งค๋ ฅ์ ์ธ ์ ํ์ด ๋๋ค)
ํํ ๋งํ๋ โ๋น
ํ
ํฌโ ๋ฐฑ์๋ ๋ถ์ผ์์๋ Rust์ zero-cost abstraction,
async
/
await
, memory safety๋ ๋
๋ณด์ ์ธ
๋งค๋ ฅ์ ๊ฐ์ง๋ค. ํ ๊ฐ์ง ๋ฌธ์ ์ ์ ์ด๋ฌํ ๋งค๋ ฅ์ด ๋น๊ต์ ์์ ์กฐ์ง์์๋ ์ดํ๋๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค.
ํฌ๋ก์คํ๋ซํผ ๋น์ฆ๋์ค ๋ก์ง ๋ชจ๋
Rust์ ํํ๋ ฅ๊ณผ ๋ฒ์ฉ์ฑ์ ์ฌ๋ฌ ํ๋ซํผ์์ ๊ณต์ ๋์ด์ผ ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ ๋ ํฐ ์ด์ ์ด ๋๋ค.
rustc์
ํ๊น ๋ชฉ๋ก
์ ๋ณด๋ฉด, ์ฃผ๋ก ์ฌ์ฉ๋๋ PC/๋ชจ๋ฐ์ผ
ํ๋ซํผ๋ค์ ๋ชจ๋ Tier 1/2์ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ Rust ์ฝ๋๋ฅผ ๊ฐ ํ๋ซํผ์ ๋ํด ๋ค์ดํฐ๋ธ๋ก ๋น๋ํ์ฌ ์ฌ์ฉํ์ฌ๋ ๋ฌด๋ฐฉํ๋ค.
๋ํ
rust-bindgen
,
cbindgen
๋ฑ์ ์ฌ์ฉํ๋ฉด C FFI๋ฅผ ํตํด ํ๋ซํผ ๊ณ ์ ์ฝ๋์ ์ํตํ๋ ๋ฐ์๋ ์ด๋ ค์์ด ์๋ค.
์ด ๋ถ๋ถ์
์ธํ์ฝ 2022์์ ํฌ๋ก์คํ๋ซํผ Rust๋ฅผ ๋ฐํํ ์๋ฃ
๋ฅผ
์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
FFI๋ก ํธ์ถ ๊ฐ๋ฅํ ๊ณ ์ฑ๋ฅ ์ฐ์ฐ ๋ชจ๋
์ต๊ทผ์ ์๊ฒ ๋์ด ์์ง ๊ฒํ ๊ฐ ๋ถ์กฑํ์ง๋ง ๋ถํ์คํจ์ ๋ฌด๋ฆ
์ฐ๊ณ ์ฌ๊ธฐ์ ์ฃผ์ฅ์ ๋จ๊ฒจ ๋ณด๋ฉด, Rust์ ๋น๊ต์ ๊ฒฝ์ง๋ ์ค๊ณ๋ฅผ
์ต์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ์คํฌ๋ฆฝํ
์ธ์ด์์ ๋ฐ์ธ๋ฉ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ํจํ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
์๋ฅผ ๋ค์ด, Python์ ์ฝ๊ฒ Rust ์ฝ๋๋ฅผ ๋ถ์ผ ์ ์๋
PyO3
๋, Ruby ์ต์คํ
์
์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋
Magnus
๋ฑ์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํ
์ ์์ฃผ๋ก ์์ฑํ๋ ๋ณ๋ชฉ ์ง์ ์์
Rust๋ก ์์ฑํ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ์ ๊พํ๋ ๋ฐฉ์์ด๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ LuaJIT๊ณผ์ ์ฐ๋์ ๊ด์ฌ์ด ์๋๋ฐ,
mlua
๋ผ๋ crate๊ฐ ์์ด ์ฃผ์๊น๊ฒ ์ง์ผ๋ณด๊ณ ์๋ค.
๋ง๋ฌด๋ฆฌ
Rust๋ฅผ ์ ๋์ ์ผ๋ก ๋์
ํ ์ฌ๋ก๋ค์์ ์ ์ ์๋ฏ์ด, ์์์ ๋น
ํ
ํฌ ํ์ฌ๋ค์ ์์์ผ๋ก ํ Rust์ ๋ฌผ๊ฒฐ์ ์ด์ ๋ถ์ ํ๊ธฐ
์ด๋ ต๊ฒ ๋์๋ค. ์์ ํ์๋ฏ์ด Rust๊ฐ ๋ชจ๋ ์ํฉ์์ ๋ง๋ฅ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ํํ์ด ๋ ์๋ ์๋ ๊ฑธ ์๋ฉด์๋, Rust๋ฅผ
์ข์ํ๋ ๊ฐ๋ฐ์ ์
์ฅ์์๋ Rust๊ฐ ์ง๊ธ๋ณด๋ค ํจ์ฌ ํญ๋์ ๋ฒ์์์ ์ฌ์ฉ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์ด ์๋ค. ์์ผ๋ก๋ Rust๋ฅผ ์จ์ ์ข์ํ๋
์ผ์ ํ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ฉฐ ๋ถ์กฑํ ํ๊ณ ๋ก์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.
https://stackoverflow.com/a/73518476
ย
โฉ๏ธ
https://stackoverflow.com/a/44456310
ย
โฉ๏ธ
https://rust-lang.github.io/rfcs/1598-generic_associated_types.html#associated-type-constructors-of-type-arguments
ย
โฉ๏ธ
http://aturon.github.io/tech/2016/08/11/futures
ย
โฉ๏ธ
https://github.com/python-poetry/poetry/tree/c5c7624ef64f34d9f50c3b7e8118f7f652fddbbd#why
ย
โฉ๏ธ
https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride#parting-words
ย
โฉ๏ธ |
| Markdown | [Option::None](https://blog.cro.sh/ "Option::None (Alt + H)")
- [Search](https://blog.cro.sh/search/ "Search (Alt + /)")
# 4๋
๊ฐ์ Rust ์ฌ์ฉ ํ๊ธฐ
December 11, 2022
2018๋
์ค์๋ถํฐ 4๋
๊ฐ Rust๋ฅผ ์ฌ์ฉํด๋ณด์๊ณ , ์ต๊ทผ 1๋
๋ฐ ๊ฐ๋์ ๋ณ์ญํน๋ก๋ฅผ ํ๋ฉด์ ํ๋ก๋์
์์๋ ์ฌ์ฉ์ ํด ๋ณด์๋ค. ์ฐ๋ง์ด๊ธฐ๋ ํ๋, ๊ทธ ๋์ ๋ด๊ฐ Rust๋ฅผ ํ๋ฉด์ ์ด๋ค ์ธ์์ ๋ฐ์๋์ง๋ฅผ ์ค์ ์ผ๋ก ํ์ฌ ๋๋์๋ณด๊ณ ์ ํ๋ค.
```
์ฃผ์: ์์ฑ์์ ์ฌ๊ฒฌ์ด ๋ค๋ ํฌํจ๋์ด ์์ต๋๋ค.
```
# Rust์ ์ฒ ํ[\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EC%B2%A0%ED%95%99)
Rust๋ ํญ๋๊ฒ ์ฐ์ด๋ ๋ค๋ฅธ ์ธ์ด๋ค์ ๋นํด ์๋นํ ์ด์ง์ ์ธ ๋ถ๋ถ์ด ๋ง๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ค๊ณ ๋จ๊ณ์์๋ถํฐ ํน์ ํ ์ฒ ํ ํน์ ๊ท์น์ ์ ์ฉํ์ฌ ๋ฐ์ํ๋ ๊ดด๋ฆฌ๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด ์ดํดํ๋ฉด ์กฐ๊ธ ๋ Rust๋ฅผ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ ๊ฒ์ด๋ค.
## Zero-cost Abstraction[\#](https://blog.cro.sh/posts/four-years-of-rust/#zero-cost-abstraction)
> The concept of zero cost abstractions originally came from the functional world. However, the terminology comes from C++. According to Bjarne Stroustrup,
>
> > In general, C++ implementations obey the zero-overhead principle: What you donโt use, you donโt pay for. And further: What you do use, you couldnโt hand code any better. [1](https://blog.cro.sh/posts/four-years-of-rust/#fn:1)
๋ณดํต zero-cost abstraction์ ๋ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๋ฒ์ญํ์ฌ ์ค๋ช
ํ๊ณค ํ๋ค.
1. ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ์๋ ๋น์ฉ์ ์ง๋ถํ์ง ์๋๋ค.
2. ์ถ์ํํ ์ฝ๋์ ๋น์ฉ์ด ์ถ์ํํ์ง ์์ ๋ ๊ฒ์ ๊ตฌํ๊ณผ ๋์ผํ๋ค.
1๋ฒ์ ์๋ฅผ ๋ค์ด๋ณด๋ฉด, Rust ์ธ์ด์ ์ฃผ์ํ ์์ ์ค ํ๋์ธ lifetime์ ํฌ์ธํฐ(ํน์ ๋ ํผ๋ฐ์ค)์ ์ ํจ์ฑ์ ๋ฐํ์์ด ์๋ ์ปดํ์ผ ํ์์ ๊ฒ์ฆํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
JavaScript๋ฅผ ์๋ก ๋ค์ด๋ณด์. ๊ฐ์ฒด๋ฅผ ๋ณ์์ ๋ด๋๋ค๋ ๊ฒ์, ์ฌ์ค์ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ณ์์ ๋ด๋๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ ๊ฐ์ฒด์ ์ง์ ์ ๊ทผํ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์
(`=`) ์ฐ์ฐ์ ํตํด ๋ณ์๋ฅผ โ๋ณต์ โํ์ฌ๋, ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ณต์ ๋์ด ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๊ฐ ํ๋ ๋ ์๊ธฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๋ ํผ๋ฐ์ค๊ฐ ํญ์ โ์ด์ ์๋โ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณธ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ํ์ ํ ์ ์์๊น? ๋ต์ ์ญ์ค์ ์ด๊ฒ๋ โ์์ ์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค๊ฐ ์กด์ฌํ๋ ๋์์๋ ๊ฐ์ฒด๊ฐ ํญ์ด ์ด์ ์๋๋คโ๋ ๊ฒ์ด๋ค.
๋ค์ ๋งํด, JavaScript๋ ๋ฐํ์์ ์์ ์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค์ ์, ์ ์ํ ๋ง๋ก refcount๋ฅผ ์ถ์ ํ๋ ๋น์ฉ์ ํ๋ก๊ทธ๋๋จธ์ ์๋์ ๊ด๊ณ์์ด ๊ณ ์ ์ผ๋ก ์ง์ถ๋๋ ๊ฒ์ด๋ค. (์์ฆ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋นํ ์ต์ ํ๊ฐ ๋์ด ์์ด์ ์๋ช
ํ ๊ฒฝ์ฐ์๋ ์์จ ์๋ ์๊ฒ ๋ค.)
Rust์ ๊ฒฝ์ฐ์๋ ๋ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํด์ ์ปดํ์ผ ํ์์ ๊ฐ๊ฐ์ ๊ฐ๋ค์ด ์ธ์ ์ฌ๋ผ์ ธ๋ ์์ ํ์ง๋ฅผ ์ถ์ ํ๊ณ , ๋ฐํ์์๋ ๊ทธ๋ฌํ ๋น์ฉ์ด ๋ค์ง ์๋๋ก ์ค๊ณํ๋๋ฐ, ์ด โ์ธ์ โ ์์ ์ lifetime์ด ๊ฒฐ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
2๋ฒ์ ์๋ ๋ค์ด๋ณด์. Java์์ ์ค๋ฒ๋ผ์ด๋๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ๋ฉ์๋์ ์ค์ ๊ตฌํ์ ์ฐพ์ ๋ค์ ํด๋น ๊ตฌํ์ ์ฌ์ฉํด์ผ ํ๊ธฐ์, dynamic dispatch๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ค. Dynamic์ด๋ผ๋ ๋ง์ด ๋ค์ด๊ฐ ๊ธฐ๋ฅ๋ต๊ฒ, ์ด๋ ๊ณต์ง๊ฐ ์๋๋ค. JVM์์ ์ต์ ํ๋ฅผ ํ ์๋ ์๊ฒ ์ง๋ง ๋น์ฉ์ 0์ผ๋ก ๋ง๋ค ์๋ ์๋ค.
Rust์ ๊ฒฝ์ฐ์๋ (trait object๋ฅผ ์ ์ธํ๋ฉด) ๋ชจ๋ static dispatch๋ฅผ ์ํํ๋ค. ๋ค๋ฅด๊ฒ ๋งํ๋ฉด, ์ปดํ์ผ ์์ ์ ๋ชจ๋ ํจ์ ํธ์ถ์ด ์ด๋ ๊ตฌํ์ ์ฌ์ฉํด์ผ ํ๋์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค(๋์ ์ด ๋ํ Java์ ๋นํด ์ด์ง์ ์ด๊ฑฐ๋ ๊ฒฝ์ง๋ ์ค๊ณ๋ฅผ ์ ๋ํ๋ ์์ธ์ด ๋๋ค).
Zero-cost abstraction์ด ์ฃผ๋ ์ ์ฝ๋ ๋ง์ง๋ง, ๋๋ Rust๊ฐ C++์ ๊ฒฝ์ํ๋ฉฐ ๋ ๋์๊ฐ ์๋ง์ ํ๋ซํผ์์ ์คํ ๊ฐ๋ฅํ๋๋ก ํ๋ ๋ฐ ๊ธฐ์ฌํ๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ โRust์ ์ฅ์ โ ๋ฌธ๋จ์์ ๋ค์ ์ธ๊ธํ๊ฒ ๋ค.
## ์๋ฌต์ ๋ณด๋ค๋ ๋ช
์์ ํํ์ ์งํฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EC%95%94%EB%AC%B5%EC%A0%81%EB%B3%B4%EB%8B%A4%EB%8A%94-%EB%AA%85%EC%8B%9C%EC%A0%81-%ED%91%9C%ED%98%84%EC%9D%84-%EC%A7%80%ED%96%A5)
C์์์ integer promotion์ ๊ธฐ์ตํ๋๊ฐ?
> If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions. [2](https://blog.cro.sh/posts/four-years-of-rust/#fn:2)
๋์ถฉ ์์ฝํ๋ฉด C์์์ ์ ์ ์ฐ์ฐ์ ์์ค์ด ์ผ์ด๋์ง ์๋ ํ ์์์ ์ผ๋ก ๊ฐ ๊ฐ์ int ํน์ unsigned int๋ก ๋ณํ ํ ๊ณ์ฐํ๋ค.
C๊ฐ ์๋๋๋ผ๋, Javascript์ `1 + 'a'`๋ผ๋๊ฐ ํ๋, ์์์ ํ๋ณํ์ด ๊ฐ์ ธ์ฌ ์ ์๋ footgun์ด๋ ์จ๊ฒจ์ง ๋น์ฉ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์ Rust๋ ๊ฐ๋ฅํ ํ ๋ช
์์ ์ผ๋ก ์ฝ๋๋ฅผ ํํํ๋ ๊ฒ์ ์ข์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์๋ฅผ ๋ค์ด dynamic dispatch๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ trait object๋ ์๋ trait ์ด๋ฆ ๊ทธ ์์ฒด๋ง ์ฐ๋ฉด ๋์์ง๋ง Rust 2018๋ถํฐ๋ dyn์ด๋ผ๋ ํค์๋๋ฅผ ์์ ๋ถ์ฌ์ผ ํ๋๋ก ๋ฐ๋์๋ค. ์์ ๋งํ ํ์
์บ์คํ
๋ ๋ชจ๋ `as` ํค์๋๋ `try_from`(์ ๋ณด ์์ค์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ ํ์๊ฐ ๊ถ์ฅ๋๋ค) ๋ฉ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํด์ผ๋ง ๋ฐ์ํ๋ค.
# Rust์ ์ฅ์ [\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EC%9E%A5%EC%A0%90)
๋ด๊ฐ 4๋
๋์, ์ง๋ฆฌ์ง๋ ์๊ณ Rust๋ฅผ ์ฌ์ฉํ ์ ์์๋ ์ด์ ๋ฅผ ์๊ฐํด๋ณด๊ณ ์ ํ๋ค.
## ๋งค์ฐ ๊ฐ๋ ฅํ ํ์
์์คํ
๊ณผ ์ด์ ๋ฐ๋ผ๋ถ๋ ํํ๋ ฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%A4%EC%9A%B0-%EA%B0%95%EB%A0%A5%ED%95%9C-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C%EA%B3%BC-%EC%9D%B4%EC%97%90-%EB%94%B0%EB%9D%BC%EB%B6%99%EB%8A%94-%ED%91%9C%ED%98%84%EB%A0%A5)
Rust์ ํ์
์์คํ
์ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ๋ฅผ ๋ชจ๋ธ๋งํ ๋ ๊ฑฐ์ฌ๋ฆด ์ผ์ด ์์ ์ ๋๋ก ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ , ํ์
์ถ๋ก ๊ณผ ํ์
๋ ๋ฒจ ์ฐ์ฐ ๊ธฐ๋ฅ๋ ์์ฃผ ํ๋ฅญํด์ zero-cost abstraction์ ๋ฌ์ฑํ๋ ๋ฐ์ ๋ง์ ๋์์ ์ค๋ค. ๊ทธ ์ค์์ ๋ช ๊ฐ๋ฅผ ๊ผฝ์๋ณด์๋ฉดโฆ
### Generics[\#](https://blog.cro.sh/posts/four-years-of-rust/#generics)
Rust์ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ์ ์์ฃผ ๊ฐ๋ ฅํด์, ๋ค์์ ๊ธฐ๋ฅ๋ค์ ๊ฐ์ง๊ณ ์๋ค
- Trait: ํ์
์ โํน์ฑโ ์ ์์ ํ ์ ์๋ค. ์ด ํ์
์ ์ ์์๋ฅผ ๊ฐ์ง๋ค๊ฑฐ๋, ๋ฌธ์์ด๋ก ๋ณํ ๊ฐ๋ฅํ๋ค๋๊ฐโฆ (interface์ฒ๋ผ ๋ค์ค ๊ตฌํ์ด ๊ฐ๋ฅํ์ง๋ง abstract class์ฒ๋ผ default implementation์ด ๊ฐ๋ฅํ, ์ค๊ฐ์ ๋ฌด์ธ๊ฐ๋ก ๋ด๋ ๋ฌด๋ฐฉํ๋ค.)
```
pub trait Ord: Eq + PartialOrd<Self> {
fn cmp(&self, other: &Self) -> Ordering;
fn max(self, other: Self) -> Self { ... }
fn min(self, other: Self) -> Self { ... }
fn clamp(self, min: Self, max: Self) -> Self
where
Self: PartialOrd<Self>,
{ ... }
}
```
๊ฐ์ด ์ ์์๋ฅผ ๊ฐ์ง์ ํํํ๋ Ord๋, ์์ ์ ์์ธ cmp๋ง ๊ตฌํํ๋ฉด max, min, clamp ๋ฉ์๋์ default implementation์ด ๋ฐ๋ผ์จ๋ค.
- Type bound: ํ์
ํ๋ผ๋ฏธํฐ์ trait/lifetime ์กฐ๊ฑด์ ๋ช
์ํ ์ ์๋ค.
```
fn find_max<T: Ord>(xs: &[T]) -> &T { // T๊ฐ Ord๋ฅผ ๊ตฌํํด์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
match xs.len() {
0 => panic!("xs is empty"),
1 => &xs[0],
_ => {
let mut max = &xs[0];
for x in xs {
if x > max { // ์ฌ๊ธฐ์ T: Ord๊ฐ ํ์ํด์ง๋ค
max = x;
}
}
max
}
}
}
```
- Generic trait: Trait์๋ ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ์ผ ์ ์๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ์์๋ก `From<T>`๋ฅผ ๋ณด์.
```
pub trait From<T> {
fn from(T) -> Self;
}
```
์ด๋ค ํ์
์ด `From<T>` ๋ฅผ ๊ตฌํํ๋ฉด, T๋ก๋ถํฐ ์์ (`Self`)์ผ๋ก ์๋ช
ํ๊ฒ ๋ณํ ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค.
- Associated type: Trait์ โ์ฐ๊ด๋โ ํ์
์ ์ ์ํ์ฌ ๊ตฌํํ๋ ํ์
์ด ์ง์ ํค์ฃผ๋๋ก ๊ฐ์ ํ ์ ์๋ค. `From<T>`์ โ์คํจ ๊ฐ๋ฅํโ ๋ฒ์ ์ธ `TryFrom<T>`๋ฅผ ๋ณด์.
```
pub trait TryFrom<T> {
type Error;
fn try_from(value: T) -> Result<Self, Self::Error>;
}
```
์ด๋ค ํ์
์ด `TryFrom<T>`๋ฅผ ๊ตฌํํ๋ ค๋ฉด, โ์คํจ ๊ฐ๋ฅํโ `T`๋ก๋ถํฐ ์ค๋ ๋ณํ๋ ์ ์ํ๊ณ , ๋ณํ์ด ์คํจํ์ ๋ ๋ฐํํ ๋ฆฌํด ํ์
๋ ์ง์ ํด์ผ ํ๋ค.
- Generic implementation: ํจ์์ trait๋ง ์ผ๋ฐํ ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋ผ, `impl` ๋ธ๋ก๋ ์ผ๋ฐํ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์
๋ชจ๋์ ๋ํด์ ๋ค๋ฅธ Trait์ ๋ํ ๊ตฌํ์ ์ถ๊ฐํ ์ ์๋ค.
```
impl<T, U> Into<U> for T
where
U: From<T>,
{
fn into(self) -> U {
U::from(self)
}
}
```
`Into<U>` ๋ `From<T>` ์ โ์ญ์โ trait์ผ๋ก, `T -> U` ๋ฐฉํฅ์ ๋ค์ง์ด์ `U -> T` ๋ฐฉํฅ์ผ๋ก (`something.into()`์ ๊ฐ์ด) ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํด ์ฃผ๋ trait์ด๋ค(`From`์ด ์กด์ฌํ๋๋ฐ `Into`๊ฐ ์ ํ์ํ๋๊ณ ์๋ฌธ์ ๊ฐ์ง ์ ์์ง๋ง, ๋งค์ฐ ์ฌ์ํ(?) ์ด์ ์ด๋ฏ๋ก ์ผ๋จ ์๋ค๋ ์ฌ์ค๋ง ์๊ณ ๊ฐ์).
์ด `Into<U>`๋ฅผ `U: From<T>`๋ฅผ ๋ง์กฑํ๋ U์ ํด๋นํ๋ ๊ฐ๊ฐ์ ํ์
์ ๋๊ณ ๊ตฌํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ์ผ๋ฐํ๋ `impl`์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ์
์ ๋ํด ํ ๋ฒ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
- Generic associated type: associated type๋ ์ผ๋ฐํ์ํฌ ์ ์๋ค. ๋ค์ ๋งํด associated type๋ ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์กฐ๊ธ ๋ณต์กํ ์์๋ฅผ ํ๋ ๋ค์ด๋ณด๋ฉด:
```
trait PointerFamily {
type Pointer<T>: Deref<Target = T>;
fn new<T>(value: T) -> Self::Pointer<T>;
}
struct ArcFamily;
impl PointerFamily for ArcFamily {
type Pointer<T> = Arc<T>;
fn new<T>(value: T) -> Self::Pointer<T> {
Arc::new(value)
}
}
struct RcFamily;
impl PointerFamily for RcFamily {
type Pointer<T> = Rc<T>;
fn new<T>(value: T) -> Self::Pointer<T> {
Rc::new(value)
}
}
struct Foo<P: PointerFamily> {
bar: P::Pointer<String>,
}
```
[3](https://blog.cro.sh/posts/four-years-of-rust/#fn:3)
์ฌ๋ฌ ์ข
๋ฅ์ (์ค๋งํธ) ํฌ์ธํฐ๋ฅผ PointerFamily๋ผ๋ ํ๋์ trait์ผ๋ก ๋ฌถ์ด์ ํํํ ์ ์๊ฒ ๋๋ค. ํฌ์ธํฐ๋ `Rc<T>`, `Arc<T>`์ ๊ฐ์ด ๊ทธ ์์ฒด๋ก ์ผ๋ฐํ๋์ด์์ผ๋ฏ๋ก ํ ์ฐจ์ ์์์ ๋ค์ ํ๋ฒ ์ผ๋ฐํํ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ฐ, ์ด๋ฅผ GAT๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ Rust์ ๊ฐ๋ ฅํ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์ ์๋์ ADT์ ์กฐํฉํ๋ฉด, ์ฌ์ค์ ๊ฑฐ์ ๋ชจ๋ ๋ฌธ์ ์ํฉ์ ํ์
์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์๊ฒ ๋๋ค.
### ADT: `enum`๊ณผ ํจํด ๋งค์นญ[\#](https://blog.cro.sh/posts/four-years-of-rust/#adt-enum%EA%B3%BC-%ED%8C%A8%ED%84%B4-%EB%A7%A4%EC%B9%AD)
Algebraic Data Type์ ์ค์๋ง๋ก, ํ์
์ ์ด๋ฅผ ๋ง์กฑํ๋ ๊ฐ๋ค์ ์งํฉ์ผ๋ก ๋ณด์์ ๋ ์งํฉ ๊ฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก ๋์ค๋ ํ์
์ ๋งํ๋ค. ์ผ๋ฐ์ ์ผ๋ก โํฉ์ฐ์ฐโ๊ณผ โ๊ณฑ์ฐ์ฐโ์ ๋ฐ์ง๋๋ฐ, ๊ฐ๊ฐ Rust์ `enum`๊ณผ `struct`์ ๋์๋๋ค. ๋ค์ ๋งํด, `enum`์ โorโ, `struct`๋ โandโ๋ฅผ ๋ปํ๊ธฐ ๋๋ฌธ์ ํํํ๊ณ ์ถ์ ์ํฉ์ ํ์
์ผ๋ก ๋ํ๋ด๊ธฐ์ ๋งค์ฐ ์ ํฉํ๋ค.
์๋ฅผ ๋ค์ด, 3์ธต์ง๋ฆฌ ์ฐฌ์ฅ์ ์๋ ์ธ ๊ฐ์ง ์๊น์ ์ปต์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋์ด ์๋์ง ์๊ณ ์ถ๋ค๊ณ ํ์. ์ฐฌ์ฅ์ ๊ฐ โ์ธตโ์ ๋์์ ์กด์ฌํ๋ฏ๋ก, โandโ ์ฐ์ฐ์ธ `struct`๋ฅผ ์ด์ฉํ๋๋ก ํ๋ค.
```
struct Cupboard {
first: Vec<Cup>,
second: Vec<Cup>,
third: Vec<Cup>,
}
```
์ปต์ ๊ฒฝ์ฐ์๋ ์ธ ๊ฐ์ง ์๊น์ด ์๊ณ ๋์์ ๋ ๊ฐ์ง ์์ ๊ฐ์ง ์๋ ์์ผ๋ฏ๋ก โorโ ์ฐ์ฐ์ธ โenumโ์ ์ด์ฉํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
```
enum Cup {
Red,
Blue,
Green,
}
```
๋ ๋์๊ฐ์, Rust์ enum์๋ ๊ฐ variant๋ง๋ค ๊ฐ์ ๋ฃ์ ์ ์๋ค. ๋ง์ฝ ์ฐฌ์ฅ์ ๋ฃ์ ์ ์๋ ๊ฒ์ด ์ ์๋ ์๋ค๋ฉด?
```
enum Object {
Cup(Cup),
Dish(Dish),
}
```
์ด๋ฒ์๋, ์ ์๋ฅผ ์์์ ๋ณด๊ดํ ์๋ ์๋ค๋ฉด?
```
enum Object {
Cup(Cup),
Dish(Dish),
StackedDish(Vec<Dish>),
}
```
์ด๋ ๊ฒ ๋ง๋ค์ด์ง enum์ด๋ struct์์ ๊ฐ์ ๋ฝ์์ค๋ ค๋ฉด, ํจํด ๋งค์นญ์ ์ฌ์ฉํ ์ ์๋ค(struct์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ด์ ๋์ผํ๊ฒ `.`์ผ๋ก ์ ๊ทผํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค).
```
match object {
Cup(cup) => { /* ... */ }
Dish(dish) => { /* ... */ }
StackedDish(stacked_dish) => { /* ... */ }
}
```
๊ฐ๊ฐ์ match ๊ณ๊ฐ์ง๋ค์์ ๊ฐ variant๊ฐ ๋ด๊ณ ์๋ ๊ฐ์ ๋ณ์๋ก ํ ๋นํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์ ์ ์๋ค.
ํจํด ๋งค์นญ์ ๋จ์ํ โํ ๊ฒนโ ๋ฒ๊ธฐ๋ ๊ฒ์ ๋์ด ์ค์ฒฉ๋ ํจํด์๋ ๋งค์นญํ ์ ์๋ค.
```
match (object1, object2) {
// ๋ ๊ฐ์ ๋ํด ๋์์ ๋งค์นญํ๋ฉด์, ์์ชฝ์ ๊ฐ์ ๋ํด์๋ ํ๋ฒ ๋ ๋งค์นญ
(Cup(Cup::Red), Cup(Cup::Blue)) => { /* ... */ }
// ๋ ๊ฐ์ ๋ํด ๋์์ ๋งค์นญํ๋ฉด์, ์์ชฝ์ ๊ฐ์ ์จ์ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด ์ ์
(Cup(a), Cup(b)) if a == b => { /* ... */ } // Cup: Eq ๋ผ ๊ฐ์ ํ์.
// _ ๋ ํญ์ ๋งค์นญ์ ์ฑ๊ณตํ๋ ๊ฐ์ด๋ค.
(Dish(dish), _) => { /* ... */ }
(StackedDish(stacked_dish), _) => { /* ... */ }
// ์์ ํจํด๋ค ์ค ์๋ฌด๊ฒ๋ ๋ง์กฑํ์ง ์์ผ๋ฉด...
_ => { /* ... */ }
}
```
์กฐ๊ธ ๋ ํ์ค์ ์ธ enum์ ์์๋ก๋, ์๋ฌ ํธ๋ค๋ง์ ์ค์ถ๊ฐ ๋๋ `Result<T, E>` ํ์
์ด ์๋ค.
```
enum Result<T, E> {
Ok(T),
Err(E)
}
```
(์ฌ๊ธฐ์ ์ ์ ์๊ฒ ์ง๋ง enum์ด๋ struct๋ ์ผ๋ฐํํ ์ ์๋ค.)
## ๋์ ๋ฐํ์ ์ฑ๋ฅ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%86%92%EC%9D%80-%EB%9F%B0%ED%83%80%EC%9E%84-%EC%84%B1%EB%8A%A5)
Rust์ zero-cost abstraction ๋๋ถ์, Rust ํ๋ก๊ทธ๋จ์ ์ผ๋ง๋ ์ง ํ์ํ ๋งํผ๋ง ์ฌ์ฉํ๋ โ๊ฐ๋ฒผ์ดโ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค(์ฃผ์: ์ฝ๊ฐ์ ์์ธ ์์). ์ด๋ ๋์ ๋ฒ์ฉ์ฑ๊ณผ๋ ๋ง๋ฌผ๋ฆฌ๋๋ฐ, ์ข ๋ ์๋์์ ์์ ํ๊ฒ ๋ค.
### Zero-cost Asynchronous Programming[\#](https://blog.cro.sh/posts/four-years-of-rust/#zero-cost-asynchronous-programming)
Rust์์ ์ ์ผ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ฅผ ๊ผฝ์ผ๋ผ๋ฉด, ๋๋ ๋ง์ค์ ์์ด `async`/`await`์ ์ ํํ ๊ฒ์ด๋ค. ๋ค๋ฅธ ์ธ์ด์์ ๊ตฌํํ๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ง๋ง(์ฒด๊ณ ์์ฒด๊ฐ ์กฐ๊ธ ๋ ๋ช
์์ ์ด๋ค), ์์ผ๋ก state machine์ ์ง์ ๊ตฌํํ ๊ฒ๊ณผ ๋๋ฑํ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ[4](https://blog.cro.sh/posts/four-years-of-rust/#fn:4) GC๊ฐ ํ์์๋ ์ธ์ด ์ค์์๋ Rust๊ฐ ๋
๋ณด์ ์ผ๋ก ํธ์์ฑ๊ณผ ์์ ์ฑ ๋ฉด์์ ์ฐ์๋ฅผ ์ ํ๊ณ ์๋ค.
ํนํ ์ด๋ ๋๊ท๋ชจ ๋คํธ์ํฌ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์
์์ ์ ์ง์ฐ, ๊ณ ๋ถํ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ ๋ ํฌ๊ฒ ์์ฉํ๋๋ฐ, Discord๋ [GC๋ก ์ธํ ์ง์ฐ์๊ฐ ํธ์ฐจ๋ก ์ธํด Rust๋ก ํน์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์์ฑํ์ฌ ํฐ ์ฑ๋ฅ ํฅ์์ ์ป์๊ณ ](https://discord.com/blog/why-discord-is-switching-from-go-to-rust), CloudFlare๋ [๋ด/์ธ๋ถ๋ง์ ์ฐ๊ฒฐํ๋ ํ๋ก์๋ฅผ NGINX์์ ์์ฒด Rust ๊ตฌํ์ผ๋ก ๊ต์ฒดํ์ฌ CPU ์์์ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ๋ ํ๋ค](https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet). ๋ค์ผ๋ก ์ป๋ memory safety ๋์ CloudFlare๋ **์๋ฐฑ์กฐ ๋จ์์** ์์ฒญ์ ์ฒ๋ฆฌํ๋ฉด์ ๋จ ํ๋ฒ์ ํ๋ก์ ๋ฒ๊ทธ๋ก ์ธํ ํฌ๋์๋ ๊ฒฝํํ์ง ์์๋ค๊ณ ํ๋ค. ์คํ๋ ค ํ๋์จ์ด ๋ฌธ์ ์ ์๋ ค์ง์ง ์์ [๋ฆฌ๋
์ค ์ปค๋์ ๋ฒ๊ทธ](https://lkml.org/lkml/2022/3/15/6)๋ฅผ ์ฐพ๊ธฐ๊น์ง ํ๋ค๊ณ โฆ
## ๊ฐ๋ฐ ๋๊ตฌ์ ์ฑ์ํจ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EA%B0%9C%EB%B0%9C-%EB%8F%84%EA%B5%AC%EC%9D%98-%EC%84%B1%EC%88%99%ED%95%A8)
๊ฐ์ธ์ ์ผ๋ก Visual Studio๋ณด๋ค๋ ํ ์ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ค๋ฅธ โ์ ์โ ์ธ์ด๋ค๊ณผ ๋น๊ตํ๋ฉด ๋
๋ณด์ ์ธ 1์์๋ฅผ ๋ฌ๋ฆฌ๊ณ ์์ง ์๋ ์๊ฐํ๋ค. ๋น๋ ์์คํ
๊ณผ ์์กด์ฑ ๊ด๋ฆฌ ์ญํ ์ ํด ์ฃผ๋ `cargo`๋ ๋ค๋ฅธ ์ธ์ด์์ ๋ฒค์น๋งํนํ ์ ๋๋ก[5](https://blog.cro.sh/posts/four-years-of-rust/#fn:5) Rust์ ์ฅ์ ์ค ํ๋๋ก ๊ผฝํ๊ณ , Rust ํด์ฒด๋ค์ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ค์น๋ฅผ ๋์์ฃผ๋ `rustup`๋ ๋งค์ฐ ํธ๋ฆฌํ๋ค. LSP ๊ตฌํ์ฒด์ธ `rust-analyzer` ๋๋ถ์ LSP ํด๋ผ์ด์ธํธ๊ฐ ๋ด์ฅ๋ ๋ง์ ์๋ํฐ์์ IDE์ ๋น์ทํ ๊ฒฝํ์ ๊ฐ์ง ์๋ ์๋ค.
## Memory Safety[\#](https://blog.cro.sh/posts/four-years-of-rust/#memory-safety)
์์ ๋งํ zero-cost abstraction์ ํตํด ๊ถ๊ทน์ ์ผ๋ก Rust๋ โmemory safetyโ๋ฅผ ๋ฌ์ฑํ๋ค. Rust์์ unsafe ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ, ์ปดํ์ผ๋๋ ๋ชจ๋ ์ฝ๋๋ **๋ฉ๋ชจ๋ฆฌ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํค์ง ์์์ด ๋ณด์ฅ๋๋ค**. ์์ฃผ ๊ฐ๋์ฉ safe ์ฝ๋๋ง์ผ๋ก undefined behavior๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ตฌ๋ฉ์ด ๋ฐ์ํ์ง๋ง(soundness hole), ๊ทธ๋ฌํ ๋์๋ค์ ๋ช
๋ฐฑํ ๋ฒ๊ทธ๋ก ๊ท์ ๋์ด ์ต์ฐ์ ์ ์ผ๋ก ์์ ๋๋ค.
## ๋ฒ์ฉ์ฑ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%B2%94%EC%9A%A9%EC%84%B1)
์์์ ๊ณ์ ์ธ๊ธํ๋ฏ์ด, Rust ์ฝ๋๋ ์๋ง์ ํ๋ซํผ์์ ๊ตฌ๋๋๊ณ ์๋ค.
- ๋ฐ์คํฌํ ๋ฐ ์ค๋งํธํฐ OS์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Windows, Linux, MacOS, Android, iOS
- ๊ณ ์ฑ๋ฅ ์น ๋ฐฑ์๋
- Linux Kernel ๋๋ผ์ด๋ฒ (\>= 6.1)
- eBPF ๋ฐ WebAssembly
- ๋ธ๋ก์ฒด์ธ(๋ธ๋ก์ฒด์ธ ๋
ธ๋, ์ค๋งํธ ์ปจํธ๋ํธ ๊ตฌํ ๋ฑ์ ๋ชจ๋ ์ฐ์ธ๋ค).
- ์๋ฒ ๋๋ ํ๋ก๊ทธ๋๋ฐ(์ด ์ชฝ์ ๋น๊ต์ ์ํ๊ณ๊ฐ ์ฝํ๋ค)
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ Rust๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก zero-cost abstraction์ ์งํฅํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํ๋ซํผ์ ์ฌ๋ ค๋์๋ ์ถ๊ฐ์ ์ธ ๋น์ฉ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด Javascript๋ฅผ eBPF ์์ ์ฌ๋ฆฌ๋ ค ํ๋ฉด, ๊ฐ๋น์ง ์ปฌ๋ ์
์ด๋ ์ฝํ ๋์ ํ์
์์คํ
์ ๋น์ฉ์ด ํ์ฐ์ ์ผ๋ก ๋ฐ๋ผ์ค๊ฒ ๋ ๊ฒ์ด๋ค. (AssemblyScript์ ๊ฐ์ด ํํธํ๋ ์ํ๊ณ๊ฐ ๋ฐ์ํ ์๋ ์๋ค).
# Rust์ ๋จ์ [\#](https://blog.cro.sh/posts/four-years-of-rust/#rust%EC%9D%98-%EB%8B%A8%EC%A0%90)
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๋ฉด Rust๋ โ์์ ํโ ์ธ์ด ๊ฐ์ง๋ง, ๊ทธ๋ ์ง ์๋ค. Rust๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด์ ๊ทธ๋ฌํ ๊ฒฐ์ ๋ค์ ํฌ๊ฒ ์ฒด๊ฐํ ์ ์์๋ค.
## ๋์ ์ง์
์ฅ๋ฒฝ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%86%92%EC%9D%80-%EC%A7%84%EC%9E%85-%EC%9E%A5%EB%B2%BD)
Rust๋ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ์ถ์ํํ์ง ์๋๋ค(์ฝ๊ฒ ์ถ์ํํ๋ฉด ๋ฐ๋์ ๋น์ฉ์ด ๋ฐ์ํ๋ ์ง์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค)[6](https://blog.cro.sh/posts/four-years-of-rust/#fn:6).
์๋ฅผ ๋ค์ด, Rust์์ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์ผ๋ฉด ๋ค์์ ํ์
๋ค์ ๋ํด ์ดํดํ ํ์๊ฐ ์๋ค:
- `String` (ํ์ ํ ๋น๋ UTF-8 ๋ฌธ์์ด)
- `&str` (๋ฌธ์์ด โ์ฌ๋ผ์ด์คโ. UTF-8๋ก ํํ๋ ๋ฐ์ดํธ์ด์ ๋ฐ๋ผ๋ณด๋ ๋ ํผ๋ฐ์ค)
```
&String์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ , ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ &str์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
```
- `&[u8]` (๋ฐ์ดํธ์ด. ๊ทธ ์์ฒด๋ก ๋ฌธ์์ด์ ์๋์ง๋ง ํ์ฑ ์ ์ ๋ง๋ ํ๋ฅ ์ด ๋๋ค)
- `Cow<str>` (โCopy-on-Writeโ ๋ฌธ์์ด. ๋ณต์ฌ๋ฅผ ์ต์ํํ๊ณ ์ถ์ ๋ ๋ง๋ ์ ์๋ค)
- `impl AsRef<str>` (๊ทธ ์์ฒด๋ก ํ์
์ ์๋์ง๋ง, `&str`๊ณผ `String`์ ๋์์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค)
`OsString`, `CString`, `Path`์ ๊ฐ์ด ํน์ํ ๋ชฉ์ ์ ์ง๋ ํ์
๋ค์ ๊ฑฐ๋ก ํ์ง ์์๋๋ฐ๋ ๋ฒ์จ ๊ณต๋ถํ ๊ฒ์ด ์ฐ๋๋ฏธ๊ฐ ๋์๋ค. ๋ค๋ฅธ ์ธ์ด๋ค์ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ๋ฐฐ์ ํ๊ณ ์ฌ์ด ๊ธธ๋ก (๋น์ฉ์ ์ง๋ถํ๊ณ )๋์๊ฐ ์ ์์ง๋ง, Rust์ ๊ฒฝ์ฐ์๋ ๊ทธ๊ฒ์ ํ์ฉํ์ง ์์ ํ์ต์๋ฅผ ์ข์ ์ํค๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ๋ค.
๋ฌผ๋ก Rust๋ โ์ฌ์ด ๊ธธโ์ ํํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง, ๋๋ถ๋ถ์ ์ค์ ์ฝ๋๋ค์ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋น์ฉ์ ์ง๋ถํ๋์ง์กฐ์ฐจ๋ ์๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
## ์ค๊ณ์ ์ ์ฝ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EC%84%A4%EA%B3%84%EC%9D%98-%EC%A0%9C%EC%95%BD)
์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ADT๋ฅผ ์ฐฌ์ํ๋ค๊ฐ ์ ์ฝ์ด ์๋ค๊ณ ํ๋ฉด ๋ชจ์๋์ง ์๋๊ณ ํ ์๋ ์์ง๋ง, Rust์ ํ์
์์คํ
์ด โ์์ ํ๋ฉฐ ๋น์ฉ ์์ดโ ํํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ ์๋ค. ์๊ธฐ์ฐธ์กฐ/์ํ์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ ๊ทธ๊ฒ์ธ๋ฐ, lifetime์ ์กด์ฌ๋ก ์ธํด ๋ชจ๋ Rust์ ๊ฐ๋ค ๊ฐ์ ์ฐธ์กฐ ๊ด๊ณ๋ DAG(๋ฐฉํฅ ์๊ณ ์ํ ์๋ ๊ทธ๋ํ)๋ก ํํ๋ ์๋ฐ์ ์๋ค. ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ ์๊ฐ lifetime์ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ์ ์คํจํ๋ค.
๋ฌผ๋ก `Arc::new_cyclic` ๊ณผ ๊ฐ์ด ์ํ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ ๋๊ตฌ๋ค๋ ์์ผ๋, weak pointer๋ฅผ ์ฌ์ฉํ๋ค๋๊ฐ ํ๋ ์์ผ๋ก ์ถ๊ฐ์ ์ธ ๋น์ฉ(๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌํจ)์ ์ง๋ถํ๊ฑฐ๋, `Pin::new_unchecked`๋ฅผ ์จ์ unsafeํ๊ฒ ์์ฑํด์ผ ํ๋ค. (ํ์๋ [`ouroboros`](https://docs.rs/ouroboros)๋ผ๋ crate๊ฐ ์๊ธฐ์ฐธ์กฐ๋ฅผ ํธํ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํด ์ค๋ค๊ณ ํ๋๋ฐ, ์ง์ ์จ๋ณด์ง๋ ์์์ ์ธ๊ธํ์ง๋ ์๊ฒ ๋ค.)
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ๊ตฌ์กฐ๊ฐ ํ์ํ์ง ์๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ต์ ์ธ๋ฐ, ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค ์ง์
ํ ์ด์ฌ์ ์
์ฅ์์๋ ์ด๋ ค์ธ ์๋ฐ์ ์๋ค. C/C++/Java ๋ฑ์ผ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ํ์ค ํ์ค(line-by-line) ๋ฒ์ญํด ์ด์ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌํ ์ธ์ด๋ค์์๋ ์๊ธฐ์ฐธ์กฐ๋ ์ํ์ฐธ์กฐ ๊ตฌ์กฐ๊ฐ ๋ํ๋๋ ํจํด์ด ์ข
์ข
๋ณด์ด๊ณค ํ๋ค. (๋งํฌ๋ ๋ฆฌ์คํธ๋ผ๋๊ฐ, ์๋ฐฉํฅ ๊ทธ๋ํ๋ผ๋๊ฐ)
```
์๊ธฐ์ฐธ์กฐ๊ฐ ์๋๋๋ผ๋, Rust์ borrow checker์ ๊ถํฉ์ด ๋ง์ง ์๋ ํจํด๋ค์ด ์ฌ๋ฟ ์กด์ฌํ๋๋ฐ, ์๋ฅผ ๋ค์ด
์ด๋ฒคํธ ๋ฆฌ์ค๋์ callback์ด ์ฃผ๊ฐ ๋๋ ์ต์ ๋ฒ ๋ชจ๋ธ์ ๊ฒฝ์ฐ callback์ด ์ฌ์ฉํ๋ ๊ฐ๋ค์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ปดํ์ผ ํ์์ ์ถ์ ํ๋
๊ฒ์ด ํ๋ค๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ํ ๋น์ด๋ ๋ ํผ๋ฐ์ค ์นด์ดํ
์ด ํ์ํด์ง๊ฒ ๋ ๊ฒ์ด๋ค.
```
๋ฌผ๋ก ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด์๋ง ์ฃผ์ ๊น๊ฒ unsafe ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๋น์ฉ์ ์ง๋ถํ์ฌ ๋ชจ๋ํํ๋ ์์ผ๋ก ๊ฒฉ๋ฆฌํ ์๋ ์์ง๋ง(Rust์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋งํฌ๋ ๋ฆฌ์คํธ์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.) Rust๊ฐ ์๋ํ๋ ์ด์์ด ํญ์ ํ์ค์ 100% ์ ์ฉ๋ ์๋ ์๋ค๋ ์ฌ์ค์ ์ธ์งํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ โ๊ฒฉ๋ฆฌโ ์์
์ unsafe๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ โ์ฌ๋ฐ๋ฅด๊ฒโ ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ์ด ์์ฃผ ์ด๋ ค์ด ๊ฒ์ผ๋ก ํ๊ฐ๋๋ค. Rust์ memory safety ๋ฑ์ด ์ ๊ณตํ๋ ๋ณด์ฅ์ ํน์ฑ์, ์ง์ผ์ผ ํ๋ ๊ท์น์ด ์๊ฒฉํ๊ณ ์ด๋ฅผ ์๋ฐํ ์์ ์ปดํ์ผ๋ฌ์ ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ๋ก ์ธํ ์ค์๋์ด ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
## ๋น๊ต์ ๋ฎ์ ์์ฐ์ฑ(๊ฐ๋ฐ ์๋)[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%B9%84%EA%B5%90%EC%A0%81-%EB%82%AE%EC%9D%80-%EC%83%9D%EC%82%B0%EC%84%B1%EA%B0%9C%EB%B0%9C-%EC%86%8D%EB%8F%84)
์๋ จ๋ Rust ํ๋ก๊ทธ๋๋จธ๋ lifetime, borrow checker, type checker์ ์จ๋ฆํ๋ ์ผ์ด ์์ฃผ ๋ฐ์ํ๋ค. ๋น ๋ฅด๊ฒ ๊ตฌํํด์ ๋ด๋ณด๋ด๋ ํ๋ก์ธ์ค๊ฐ ์ ๋ฆฝ๋ B2C ์๋น์ค๋ค์ ์ด์ํ๋ ๊ธฐ์
์ ๊ฒฝ์ฐ์๋ Rust๋ฅผ ๋์
ํ์ ๋ ๊ฐ๋ฐ ์๋๊ฐ ๋น๊ต์ ๋จ์ด์ง ์๋ ์์์ ๋ช
์ฌํด์ผ ํ๋ค.
```
์ฌ๊ฒฌ์ผ๋ก, ์ด๋ Go๊ฐ ์น ๋ฐฑ์๋ ๋ถ์ผ์์ ํฌ๊ฒ ์ ํํ ์ด์ ์ ๊ฑฐ์ ์ ๋ฐ๋๋๋๋ฐ, Go๋ ๋ณต์กํ ๋ฌธ์ ๋ ๋น์ฉ์ ๋ด๊ณ
์ฝ๊ฒ ์ถ์ํํ๋ฉฐ, ํ์
์์คํ
์ ๋ณ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์๊ณ (1.18์์ผ ์ผ๋ฐํ ํ๋ก๊ทธ๋๋ฐ์ด ์ ์์ผ๋ก ์ถ๊ฐ๋์๋ค), ๋ค๋ฅธ ๊ธฐ๋ฅ๋
๋ง์ง ์์ ์ง์
์ฅ๋ฒฝ์ด ๋งค์ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๋์ ์์ฐ์ฑ์ ๊ธฐ๋ํ ์ ์๋ค.
```
## ๋งคํฌ๋ก[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%A4%ED%81%AC%EB%A1%9C)
์ด ๊ธฐ๋ฅ์ Rust์์ ๋ฌด์ ํ์ ๊ฐ๊น์ด ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก๋ ์ฉ ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ ํ๊ณ ์ ํ๋ค.
์ฒซ ๋ฒ์งธ๋ก, ๋งคํฌ๋ก๋ ๋ฌธ๋ฒ ํ ํฐ ํธ๋ฆฌ๋ฅผ ๋ฐ์์ ํน์ ์์
์ ์ํํ์ฌ ์๋ก์ด ๋ฌธ๋ฒ ํธ๋ฆฌ๋ฅผ ๋ฐํํ๋ ๊ท์น์ด๋ผ๊ณ ๋งํ ์ ์๋๋ฐ, ์ค๋ช
์์๋ ์ ์ถํ ์ ์๋ฏ์ด ๊ธฐ์กด์ Rust ์ง์๊ณผ๋ ํ์ดํ, Rust์ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ๊ดํ ์ง์์ ์ต๋ํด์ผ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋ค์ ๋งํด, ๋งคํฌ๋ก๋ ์ฌ์ค์ Rust ๋ฌธ๋ฒ๋ง ์ฐจ์ฉํ ๋๋ค๋ฅธ Rust ์์ ๋ฏธ๋ ์ธ์ด๋ก์ ๊ธฐ๋ฅํ๋ค๋ ์ ์์ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ดด๋ฆฌ๋ฅผ ๋ฐ์์ํจ๋ค. (์ด ๋จ์ ์ ๋ ๊ฐ์ง ์ข
๋ฅ์ ๋งคํฌ๋ก ์ ์ ๋ฐฉ์์ธ procedural macro์ declarative macro์ ๋ชจ๋ ํด๋น๋๋ค.)
๋ ๋ฒ์งธ๋ก, proc-macro๋ ๋งคํฌ๋ก๋ฅผ ์ ์ฉํ๋ ค๋ ์ฝ๋ ์ด์ ์ ์ปดํ์ผ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์ปดํ์ผ ์๊ฐ์ ์ฆ๊ฐ์ํจ๋ค. ํนํ ์ด๋ ์์ค์ฝ๋๋ง์ ์์ถํด์ ์ฌ๋ฆฌ๋ Rust์ crate ์์คํ
๊ณผ ๋ง๋ฌผ๋ ค ๋ฌธ์ ๋ฅผ ๊ฐ์ค์ํค๋๋ฐ, proc-macro๋ฅผ ๋ฏธ๋ฆฌ ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (๊ด๋ จํ์ฌ [`watt`](https://github.com/dtolnay/watt)๋ผ๋ ์คํ์ ์ธ WebAssembly ๊ธฐ๋ฐ proc-macro ๋ฐํ์์ด ์์ง๋ง ๋ฉ์ธ์คํธ๋ฆผ์ ๋ค์ด์ค๊ธฐ๋ ์์ง ๊ณค๋ํ๋ค.)
์ธ ๋ฒ์งธ๋ก, IDE์ proc-macro ๊ฐ์ ์กฐํ๊ฐ ์ข์ ํธ์ ์๋๋ผ proc-macro๋ฅผ ์ง๋์น๊ฒ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ ๊ฒฝํ์ด ์คํ๋ ค ๊ฐ์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
โ์ ํต์ ์ธโ ๋งคํฌ๋ก ์ ์ ๋ฐฉ๋ฒ์ธ โdecl-macroโ, ๋ค๋ฅธ ๋ง๋ก macros by example ๋ฐฉ์์ ์์ ํ ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ๋ฌธ์ ์ ๋ํด ๋น๊ต์ ์์ ๋กญ์ง๋ง, proc-macro๋ณด๋ค๋ ๋ ์ด์ง์ ์ธ ๋ฌธ๋ฒ๊ณผ ์ ์ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์๊ณ (๊ฐ๋จํ ์ค๋ช
ํ๋ฉด, Rust ์ฝ๋์ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ๋ํด ํจํด ๋งค์นญ์ ์๋ํ๋ค), ํํ ๊ฐ๋ฅํ ๋ฒ์์๋ ์ ์ฝ์ด ์์ด์ ๊ธฐ๋ฅ์ ๋ณต์ก๋๊ฐ ํน์ ์ง์ ์ ๋์ผ๋ฉด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. (๊ทธ ์์๋ก, ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋ [`pin-project`](https://github.com/taiki-e/pin-project)์ [`pin-project-lite`](https://github.com/taiki-e/pin-project)๋ฅผ ๋ณด๋ฉด ์ ์๋ proc-macro, ํ์๋ macros by example ๋ฐฉ์์ธ๋ฐ ํ์๋ ์ ์์ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์์๋ ๋ถ๊ตฌํ๊ณ ํจ์ฌ ๋ ์ดํดํ๊ธฐ ์ด๋ ต๋ค).
## ๋ง์ด๋๋ฆฌํฐ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%88%EC%9D%B4%EB%84%88%EB%A6%AC%ED%8B%B0)
Rust ๊ตฌ์ธ/๊ตฌ์ง ์์ฅ์ Go์ ๋น๊ตํด์๋ ๋งค์ฐ ์ข๋ค. ํนํ ํ๊ตญ์ ๊ฒฉ์ฐจ๊ฐ ํจ์ฌ ์ฌํ๋ค.
# ๊ฒฐ๋ก : 10๋
๋ค์๋ Rust๋ก ๋ฐฅ๋ฒ์ด๊ฐ ๊ฐ๋ฅํ ๊น?[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EA%B2%B0%EB%A1%A0-10%EB%85%84-%EB%92%A4%EC%97%90%EB%8F%84-rust%EB%A1%9C-%EB%B0%A5%EB%B2%8C%EC%9D%B4%EA%B0%80-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C)
๋จ์ ์ ์ค์ค์ด ๋์ดํ์ง๋ง ๋ต์ โyesโ๋ผ๊ณ ์๊ฐํ๋ค. ๋ด๊ฐ ์๊ฐํ๋ ํ์ฌ(๊ทธ๋ฆฌ๊ณ ๊ทผ๋ฏธ๋)์ Rust ์ฌ์ฉ์ฒ๋ ๋ค์๊ณผ ๊ฐ๋ค.
## ๋๊ท๋ชจ ์๋น์ค์ ๋ฐฑ์๋[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9D%98-%EB%B0%B1%EC%97%94%EB%93%9C)
ํ์ฌ๋ก์๋, ๊ฐํ ๋งํ๊ฑด๋ฐ ๋ค์์ ์ํฉ์์ Rust๋ฅผ ์ด๊ธธ ๋์์ ์๋ค.
- ๋๊ท๋ชจ ์๋น์ค๋ฅผ ์ด์ํ์ฌ ๋์ ์ํฌ๋ก๋๋ฅผ ๊ฐ์ง๊ณ
- I/O๊ฐ ๋งค์ฐ ์ฆ์ผ๋ฉฐ
- ๋ถํน์ ๋ค์์๊ฒ ์๋น์ค(B2C)ํ์ฌ ๊ฐ๊ฑด์ฑ์ ํนํ ์ ๊ฒฝ์จ์ผ ํ๋
(์ด๋ค ์ค ๋ ๊ฐ๋ง ํด๋น๋์ด๋ ์์ฃผ ๋งค๋ ฅ์ ์ธ ์ ํ์ด ๋๋ค)
ํํ ๋งํ๋ โ๋น
ํ
ํฌโ ๋ฐฑ์๋ ๋ถ์ผ์์๋ Rust์ zero-cost abstraction, `async`/`await`, memory safety๋ ๋
๋ณด์ ์ธ ๋งค๋ ฅ์ ๊ฐ์ง๋ค. ํ ๊ฐ์ง ๋ฌธ์ ์ ์ ์ด๋ฌํ ๋งค๋ ฅ์ด ๋น๊ต์ ์์ ์กฐ์ง์์๋ ์ดํ๋๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค.
## ํฌ๋ก์คํ๋ซํผ ๋น์ฆ๋์ค ๋ก์ง ๋ชจ๋[\#](https://blog.cro.sh/posts/four-years-of-rust/#%ED%81%AC%EB%A1%9C%EC%8A%A4%ED%94%8C%EB%9E%AB%ED%8F%BC-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EB%A1%9C%EC%A7%81-%EB%AA%A8%EB%93%88)
Rust์ ํํ๋ ฅ๊ณผ ๋ฒ์ฉ์ฑ์ ์ฌ๋ฌ ํ๋ซํผ์์ ๊ณต์ ๋์ด์ผ ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ ๋ ํฐ ์ด์ ์ด ๋๋ค. rustc์ [ํ๊น ๋ชฉ๋ก](https://doc.rust-lang.org/nightly/rustc/platform-support.html)์ ๋ณด๋ฉด, ์ฃผ๋ก ์ฌ์ฉ๋๋ PC/๋ชจ๋ฐ์ผ ํ๋ซํผ๋ค์ ๋ชจ๋ Tier 1/2์ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ Rust ์ฝ๋๋ฅผ ๊ฐ ํ๋ซํผ์ ๋ํด ๋ค์ดํฐ๋ธ๋ก ๋น๋ํ์ฌ ์ฌ์ฉํ์ฌ๋ ๋ฌด๋ฐฉํ๋ค. ๋ํ [`rust-bindgen`](https://github.com/rust-lang/rust-bindgen), [`cbindgen`](https://github.com/eqrion/cbindgen) ๋ฑ์ ์ฌ์ฉํ๋ฉด C FFI๋ฅผ ํตํด ํ๋ซํผ ๊ณ ์ ์ฝ๋์ ์ํตํ๋ ๋ฐ์๋ ์ด๋ ค์์ด ์๋ค.
์ด ๋ถ๋ถ์ [์ธํ์ฝ 2022์์ ํฌ๋ก์คํ๋ซํผ Rust๋ฅผ ๋ฐํํ ์๋ฃ](https://www.slideshare.net/utilforever/2022-rust)๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
## FFI๋ก ํธ์ถ ๊ฐ๋ฅํ ๊ณ ์ฑ๋ฅ ์ฐ์ฐ ๋ชจ๋[\#](https://blog.cro.sh/posts/four-years-of-rust/#ffi%EB%A1%9C-%ED%98%B8%EC%B6%9C-%EA%B0%80%EB%8A%A5%ED%95%9C-%EA%B3%A0%EC%84%B1%EB%8A%A5-%EC%97%B0%EC%82%B0-%EB%AA%A8%EB%93%88)
์ต๊ทผ์ ์๊ฒ ๋์ด ์์ง ๊ฒํ ๊ฐ ๋ถ์กฑํ์ง๋ง ๋ถํ์คํจ์ ๋ฌด๋ฆ
์ฐ๊ณ ์ฌ๊ธฐ์ ์ฃผ์ฅ์ ๋จ๊ฒจ ๋ณด๋ฉด, Rust์ ๋น๊ต์ ๊ฒฝ์ง๋ ์ค๊ณ๋ฅผ ์ต์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋์ ์คํฌ๋ฆฝํ
์ธ์ด์์ ๋ฐ์ธ๋ฉ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ํจํ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค. ์๋ฅผ ๋ค์ด, Python์ ์ฝ๊ฒ Rust ์ฝ๋๋ฅผ ๋ถ์ผ ์ ์๋ [PyO3](https://pyo3.rs/)๋, Ruby ์ต์คํ
์
์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ [Magnus](https://github.com/matsadler/magnus) ๋ฑ์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํ
์ ์์ฃผ๋ก ์์ฑํ๋ ๋ณ๋ชฉ ์ง์ ์์ Rust๋ก ์์ฑํ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ์ ๊พํ๋ ๋ฐฉ์์ด๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ LuaJIT๊ณผ์ ์ฐ๋์ ๊ด์ฌ์ด ์๋๋ฐ, [mlua](https://github.com/khvzak/mlua)๋ผ๋ crate๊ฐ ์์ด ์ฃผ์๊น๊ฒ ์ง์ผ๋ณด๊ณ ์๋ค.
# ๋ง๋ฌด๋ฆฌ[\#](https://blog.cro.sh/posts/four-years-of-rust/#%EB%A7%88%EB%AC%B4%EB%A6%AC)
Rust๋ฅผ ์ ๋์ ์ผ๋ก ๋์
ํ ์ฌ๋ก๋ค์์ ์ ์ ์๋ฏ์ด, ์์์ ๋น
ํ
ํฌ ํ์ฌ๋ค์ ์์์ผ๋ก ํ Rust์ ๋ฌผ๊ฒฐ์ ์ด์ ๋ถ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋์๋ค. ์์ ํ์๋ฏ์ด Rust๊ฐ ๋ชจ๋ ์ํฉ์์ ๋ง๋ฅ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ํํ์ด ๋ ์๋ ์๋ ๊ฑธ ์๋ฉด์๋, Rust๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์ ์
์ฅ์์๋ Rust๊ฐ ์ง๊ธ๋ณด๋ค ํจ์ฌ ํญ๋์ ๋ฒ์์์ ์ฌ์ฉ๋์์ผ๋ฉด ํ๋ ๋ฐ๋จ์ด ์๋ค. ์์ผ๋ก๋ Rust๋ฅผ ์จ์ ์ข์ํ๋ ์ผ์ ํ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ฉฐ ๋ถ์กฑํ ํ๊ณ ๋ก์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.
***
1. <https://stackoverflow.com/a/73518476> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:1)
2. <https://stackoverflow.com/a/44456310> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:2)
3. <https://rust-lang.github.io/rfcs/1598-generic_associated_types.html#associated-type-constructors-of-type-arguments> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:3)
4. <http://aturon.github.io/tech/2016/08/11/futures> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:4)
5. <https://github.com/python-poetry/poetry/tree/c5c7624ef64f34d9f50c3b7e8118f7f652fddbbd#why> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:5)
6. <https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride#parting-words> [โฉ๏ธ](https://blog.cro.sh/posts/four-years-of-rust/#fnref:6)
ยฉ 2019-2023 Nam Junghyun Powered by [Hugo](https://gohugo.io/) & [PaperMod](https://github.com/adityatelange/hugo-PaperMod/) |
| Readable Markdown | null |
| Shard | 141 (laksa) |
| Root Hash | 15231987969443479941 |
| Unparsed URL | sh,cro!blog,/posts/four-years-of-rust/ s443 |