๐ ๋ฌ์คํธ vs C: ์์คํ ์์ค ํ๋ก๊ทธ๋๋ฐ์ ๋๊ฒฐ! ๐ก๏ธ

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฐพ์์์ด์. ๋ฐ๋ก ๋ฌ์คํธ(Rust)์ C ์ธ์ด์ ๋๊ฒฐ! ๐ฅ ์์คํ ์์ค ํ๋ก๊ทธ๋๋ฐ์์ ์ด ๋ ์ธ์ด๊ฐ ์ด๋ป๊ฒ ์์ ์ฑ๊ณผ ์๋๋ฅผ ๊ฒจ๋ฃจ๋์ง ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ใ ใ ใ
๐ญ ์ ๊น! ์ฌ๋ฅ๋ท ํ๋ณด ํ์!
์ฌ๋ฌ๋ถ, ํน์ ํ๋ก๊ทธ๋๋ฐ ์ค๋ ฅ์ ๋ฝ๋ด๊ณ ์ถ์ผ์ ๊ฐ์? ์๋๋ฉด ์๋ก์ด ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ์ผ์ ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ์ฌ๋ฅ๋ท์ ํ ๋ฒ ๋ฐฉ๋ฌธํด๋ณด์ธ์! ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ฌ๋ฅ์ ์ฌ๊ณ ํ ์ ์๋ ๊ณณ์ด๋๋๋ค. ๋ฌ์คํธ๋ C ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์ ์๋ ์๊ณ , ์ฌ๋ฌ๋ถ์ ์ค๋ ฅ์ ๋ฝ๋ผ ์๋ ์์ด์. ์, ์ด์ ๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๋ณผ๊น์?
๐ ๋ฌ์คํธ์ C: ์ฒซ ๋ง๋จ
์, ์ฌ๋ฌ๋ถ! ์ฐ๋ฆฌ์ ์ฃผ์ธ๊ณต ๋ ๋ถ์ ์๊ฐํ ๊ฒ์. ํ ์ชฝ ์ฝ๋์๋ ์ค๋๋ ๊ฐ์ C ์ธ์ด! ๐ด ๋ค๋ฅธ ์ชฝ ์ฝ๋์๋ ์ ํฅ ๊ฐ์ ๋ฌ์คํธ! ๐ฆ ์ด ๋ ์ธ์ด๊ฐ ์ด๋ป๊ฒ ํ์ํ๋์ง, ์ด๋ค ํน์ง์ ๊ฐ์ง๊ณ ์๋์ง ์ดํด๋ณผ๊น์?
๐ฐ๏ธ C ์ธ์ด: ์ปดํจํฐ์ ํ ์๋ฒ์ง
C ์ธ์ด๋ ์ ๋ง ์ญ์ฌ๊ฐ ๊น์ด์. 1972๋ ์ ํ์ด๋ฌ์ผ๋๊น ์ด์ 50์ด์ด ๋์๋ค์! ใ ใ ใ ๋ฒจ ์ฐ๊ตฌ์์ ๋ฐ๋์ค ๋ฆฌ์น์ ์ผ ํฐ์จ์ด ๋ง๋ค์๋ต๋๋ค. ๋น์์๋ UNIX ์ด์ ์ฒด์ ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ด์.
- ๐ ์ฅ์ : ๋น ๋ฅธ ์คํ ์๋, ํ๋์จ์ด ์ง์ ์ ์ด ๊ฐ๋ฅ
- ๐ ๋จ์ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์, ์์ ์ฑ ์ด์
C ์ธ์ด๋ ์ ๋ง ๋น ๋ฅด๊ณ ๊ฐ๋ ฅํด์. ํ์ง๋ง ๊ทธ๋งํผ ์ํํ ์๋ ์์ฃ . ๋ง์น F1 ๋ ์ด์ฑ์นด๋ฅผ ์ด์ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ๋น ๋ฅด์ง๋ง ์กฐ์ฌํด์ ๋ค๋ค์ผ ํด์!
๐ฆ ๋ฌ์คํธ: ์๋ก์ด ์์ ์ ๋ฑ์ฅ
๋ฌ์คํธ๋ 2010๋ ์ ๋ชจ์ง๋ผ์์ ์์๋ ํ๋ก์ ํธ์์. C++์ ๋ณต์ก์ฑ์ ์ค์ด๋ฉด์๋ ์์ ์ฑ์ ๋์ด๋ ค๊ณ ๋ง๋ค์ด์ก์ฃ . ์ด์ 10๋ ํ๋ฐ์ด๋๊น ์์ง ์ฒญ์๋ ์ด๋ค์! ใ ใ ใ
- ๐ ์ฅ์ : ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ง์
- ๐ ๋จ์ : ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ, ์ปดํ์ผ ์๊ฐ์ด ๊ธธ๋ค
๋ฌ์คํธ๋ ๋ง์น ์์ ์ฅ์น๊ฐ ์๋ฉ ๋ฌ๋ฆฐ ์คํฌ์ธ ์นด ๊ฐ์์. ๋น ๋ฅด๋ฉด์๋ ์์ ํ์ง๋ง, ์ด์ ํ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ ๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ์ฃ !
๐ค ์ฌ๋ฅ๋ท ํ!
C๋ ๋ฌ์คํธ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์๋ณด์ธ์. ์จ๋ผ์ธ ๊ฐ์๋ถํฐ 1:1 ์ฝ์นญ๊น์ง ๋ค์ํ ์ต์
์ด ์๋ต๋๋ค. ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ค๋ ฅ์ ํ ๋จ๊ณ ์
๊ทธ๋ ์ด๋ํ ์ ์์ ๊ฑฐ์์!
๐๏ธโโ๏ธ ์์ ์ฑ: ๋ฌ์คํธ vs C
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ ์ธ์ด์ ์์ ์ฑ์ ๋น๊ตํด๋ณผ๊น์? ์ด๊ฑด ๋ง์น ๊ฒฉํฌ๊ธฐ ๋๊ฒฐ ๊ฐ์์. ํ์ชฝ์ ๊ฒฝํ ๋ง์ ๋ฒ ํ ๋, ๋ค๋ฅธ ์ชฝ์ ์ ๊ธฐ์ ๋ก ๋ฌด์ฅํ ์ ์. ๊ณผ์ฐ ๋๊ฐ ์ด๊ธธ๊น์?
๐ก๏ธ ๋ฌ์คํธ์ ์์ ์ฑ ์ฒ ๋ฒฝ ๋ฐฉ์ด
๋ฌ์คํธ๋ ์์ ์ฑ์ ์์ด์๋ ์ ๋ง ๋ํ์์ด์์. ๋ง์น ์ฒ ๋ฒฝ ๋ฐฉ์ด๋ฅผ ํ๋ ๊ฒ์ฒ๋ผ ๊ผผ๊ผผํ๊ฒ ๋ชจ๋ ๊ฒ์ ์ฒดํฌํ๋ต๋๋ค.
- ์์ ๊ถ ์์คํ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํ๋ช !
- ๋น๋ฆผ ์ฒด์ปค: ๋ฐ์ดํฐ ๋ ์ด์ค? ๊ทธ๊ฒ ๋ญ์์? ๋ชป ๋ค์ด๋ดค์ด์~
- ๋ผ์ดํํ์: ๋ณ์์ ์๋ช ์ ์ฒ ์ ํ ๊ด๋ฆฌํด์.
๋ฌ์คํธ์ ์ด๋ฐ ํน์ง๋ค ๋๋ฌธ์ ์ปดํ์ผ ํ์์ ๋๋ถ๋ถ์ ๋ฒ๊ทธ๋ฅผ ์ก์๋ผ ์ ์์ด์. ์คํํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋๊น ์ ๋ง ํธํ์ฃ !
๐ ์์ ๊ถ ์์คํ ์์ธํ ๋ค์ฌ๋ค๋ณด๊ธฐ
๋ฌ์คํธ์ ์์ ๊ถ ์์คํ ์ ์ ๋ง ๋ ํนํด์. ๋ค๋ฅธ ์ธ์ด์์๋ ๋ณผ ์ ์๋ ๊ฐ๋ ์ด์ฃ . ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ฐ๋จํ ์์ ๋ก ์ดํด๋ณผ๊น์?
fn main() {
let s1 = String::from("์๋
");
let s2 = s1; // s1์ ์์ ๊ถ์ด s2๋ก ์ด๋
// println!("{}", s1); // ์ด ์ค์ ์ปดํ์ผ ์๋ฌ!
println!("{}", s2); // ์ด๊ฑด OK!
}
์ ์ฝ๋์์ s1
์ ๊ฐ์ s2
์ ํ ๋นํ๋ฉด, s1
์ ๋ ์ด์ ์ ํจํ์ง ์์์. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ด์ค ํด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์์ฒ ์ฐจ๋จํ ์ ์์ฃ . ๋๋ํ์ฃ ? ใ
ใ
ใ
๐ต๏ธโโ๏ธ ๋น๋ฆผ ์ฒด์ปค: ๋ฐ์ดํฐ ๋ ์ด์ค์ ์ฒ์
๋น๋ฆผ ์ฒด์ปค๋ ๋ฌ์คํธ์ ๋ ๋ค๋ฅธ ์ํผ ํ์ด๋ก์์. ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ์ํ ์ ์๋ ๋ฐ์ดํฐ ๋ ์ด์ค๋ฅผ ๋ฏธ๋ฆฌ ์ก์๋ด์ฃ . ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณผ๊น์?
fn main() {
let mut x = 5;
let y = &mut x; // ๊ฐ๋ณ ์ฐธ์กฐ
// let z = &x; // ์ด ์ค์ ์ปดํ์ผ ์๋ฌ!
*y += 1;
println!("{}", x); // 6
}
์ ์ฝ๋์์ y
๊ฐ x
์ ๊ฐ๋ณ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋, ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฐ๋ก "์ ๊น! ๊ทธ๊ฑด ์ ๋ผ์!"๋ผ๊ณ ๋งํด์ค์. ์ด๋ ๊ฒ ํ๋ฉด ๋์์ ์ฌ๋ฌ ๊ณณ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๋ฌธ์ ๋ฅผ ๋ง์ ์ ์์ฃ .
โณ ๋ผ์ดํํ์: ๋ณ์์ ์ด๋ช ์ ๊ด๋ฆฌํด์
๋ผ์ดํํ์์ ๋ณ์๊ฐ ์ผ๋ง๋ ์ค๋ ์ด์์์์ง ๊ฒฐ์ ํด์. ๋ง์น ๋ณ์์ ์ด๋ช ์ ๊ด๋ฆฌํ๋ ์ ์ด๋๊น์? ใ ใ ใ
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let s1 = String::from("์งง์ ๋ฌธ์์ด");
let s2 = String::from("์ด๊ฒ์ ๋ ๊ธด ๋ฌธ์์ด์
๋๋ค");
let result = longest(s1.as_str(), s2.as_str());
println!("๋ ๊ธด ๋ฌธ์์ด: {}", result);
}
์ ์ฝ๋์์ 'a
๋ ๋ผ์ดํํ์์ ๋ํ๋ด์. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐํ๋๋ ์ฐธ์กฐ๊ฐ ํญ์ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณด์ฅํ ์ ์์ฃ . ๋ฉ์ง์ง ์๋์?
๐ณ๏ธ C์ ์์ ์ฑ: ์ํํ ์คํ๊ธฐ
C ์ธ์ด๋... ์... ์์ ์ฑ์ ์์ด์๋ ์ข ์ํํ ์คํ๊ธฐ๋ฅผ ํ๊ณ ์์ด์. ใ ใ ใ ๋ง์น ์์ปค์ค์์ ์์ ๋ง ์์ด ์คํ๊ธฐ๋ฅผ ํ๋ ๊ฒ ๊ฐ๋ฌ๊น์?
- ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์ค์ํ๋ฉด ํฐ์ผ๋์!
- ํฌ์ธํฐ ์ค์ฉ: ์๋ชป ์ฐ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ป์ด๋ฒ๋ ค์.
- ๋ฒํผ ์ค๋ฒํ๋ก: ํด์ปค๋ค์ด ์ข์ํ๋ ์ทจ์ฝ์ ์ด์ฃ .
C์์๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊ด๋ฆฌํด์ผ ํด์. ์ค์ ํ๋๊ฐ ํฐ ๋ณด์ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ฃ . ๊ทธ๋์ C๋ก ํ๋ก๊ทธ๋๋ฐํ ๋๋ ์ ๋ง ์กฐ์ฌ์กฐ์ฌ ๋ ์กฐ์ฌํด์ผ ํด์!
๐ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์๋ ์ ๊ฒ
C์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํ ๋นํ๊ณ ํด์ ํด์ผ ํด์. ์ด๊ฑด ๋ง์น ์๋ฆฌํ ๋ ๋ถ์ ์ง์ ์กฐ์ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ์ํ๋ฉด ๋ง์๋ ์๋ฆฌ๊ฐ ๋์ง๋ง, ์ค์ํ๋ฉด... ์์์ด ํ๋ฒ๋ฆฌ๊ฒ ์ฃ ? ใ ใ ใ
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int*)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i * 10;
}
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
free(arr); // ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ์์ง ๋ง์ธ์!
return 0;
}
</stdlib.h></stdio.h>
์ ์ฝ๋์์ malloc()
์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ์ฌ์ฉ์ด ๋๋๋ฉด free()
๋ก ํด์ ํด์ผ ํด์. ๋ง์ฝ free()
๋ฅผ ์์ด๋ฒ๋ฆฌ๋ฉด? ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ์ฃ ! ๐ฑ
๐ ํฌ์ธํฐ ์ค์ฉ: ์ํํ ์ฅ๋๊ฐ
C์ ํฌ์ธํฐ๋ ์ ๋ง ๊ฐ๋ ฅํ ๋๊ตฌ์์. ํ์ง๋ง ์๋ชป ์ฌ์ฉํ๋ฉด ์ ๋ง ์ํํด์ง ์ ์์ฃ . ๋ง์น ์ด๋ฆฐ์ด์๊ฒ ์นผ์ ์ฃผ๋ ๊ฒ๊ณผ ๋น์ทํด์. ใ ใ ใ
#include <stdio.h>
int main() {
int x = 10;
int *p = &x;
printf("x์ ๊ฐ: %d\n", x);
printf("p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ: %d\n", *p);
*p = 20; // x์ ๊ฐ์ ๋ณ๊ฒฝ
printf("๋ณ๊ฒฝ ํ x์ ๊ฐ: %d\n", x);
// ์ํํ ์ฝ๋!
// int *q = (int*)100;
// *q = 50; // ๋ฏธ์ ์ ๋์!
return 0;
}
</stdio.h>
์ ์ฝ๋์์ ์ฃผ์ ์ฒ๋ฆฌ๋ ๋ถ๋ถ์ ๋ณด์ธ์. ์ ๋ ๊ฒ ์์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ํฌ๋์๋ ์ ์์ด์. ๋ฌ์คํธ์๋ค๋ฉด ์ปดํ์ผ ๋จ๊ณ์์ ์ด๋ฐ ์ค์๋ฅผ ์ก์์คฌ์ ํ ๋ฐ ๋ง์ด์ฃ .
๐ฅ ๋ฒํผ ์ค๋ฒํ๋ก: ํด์ปค์ ์ฒ๊ตญ
๋ฒํผ ์ค๋ฒํ๋ก๋ C ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ์ ๋ช ๋์ ๋ณด์ ์ทจ์ฝ์ ์ค ํ๋์์. ์ด๊ฑด ๋ง์น ์ปต์ ๋ฌผ์ ๋๋ฌด ๋ง์ด ๋ถ์ด์ ๋์น๋ ๊ฒ๊ณผ ๋น์ทํด์. ๊ทธ๋ฐ๋ฐ ์ด '๋ฌผ'์ด ์ ์ฑ ์ฝ๋๋ผ๋ฉด? ๐จ
#include <stdio.h>
#include <string.h>
void vulnerable_function(char *input) {
char buffer[10];
strcpy(buffer, input); // ์ํํ ํจ์!
printf("%s\n", buffer);
}
int main() {
char *user_input = "์ด ๋ฌธ์์ด์ ๋ฒํผ๋ณด๋ค ๊ธธ์ด์!";
vulnerable_function(user_input);
return 0;
}
</string.h></stdio.h>
์ ์ฝ๋์์ strcpy()
ํจ์๋ ์
๋ ฅ ๊ธธ์ด๋ฅผ ์ฒดํฌํ์ง ์๊ณ ๋ณต์ฌํด์. ๋ง์ฝ ์
๋ ฅ์ด ๋ฒํผ๋ณด๋ค ๊ธธ๋ค๋ฉด? ๋ฒํผ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฅผ ํตํด ํด์ปค๊ฐ ์์คํ
์ ๊ณต๊ฒฉํ ์ ์์ด์. ๋ฌ์คํธ์๋ค๋ฉด ์ด๋ฐ ์ค์๋ฅผ ์ปดํ์ผ ํ์์ ์ก์์คฌ์ ๊ฑฐ์์.
๐ก ์ฌ๋ฅ๋ท ๊ฟํ!
C๋ ๋ฌ์คํธ๋ก ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ ๋ณด์ ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์๋ณด๋ ๊ฒ์ ์ด๋จ๊น์? ์ค์ ํ๋ก์ ํธ ๊ฒฝํ์ด ์๋ ์ ๋ฌธ๊ฐ๋ค์ด ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํด์ฃผ๊ณ , ๋ ์์ ํ ์ฝ๋ฉ ์ต๊ด์ ๊ธฐ๋ฅผ ์ ์๋๋ก ๋์์ค ๊ฑฐ์์!
๐๏ธ ์๋: ๋๊ฐ ๋ ๋น ๋ฅผ๊น?
์, ์ด์ ์๋ ๋๊ฒฐ์ ์๊ฐ์ด์์! ๐ C์ ๋ฌ์คํธ, ๊ณผ์ฐ ๋๊ฐ ๋ ๋น ๋ฅผ๊น์? ์ด๊ฑด ๋ง์น F1 ๋ ์ด์ฑ ๋ํ ๊ฐ์์. ๋ ์ ์๊ฐ ํธ๋์ ๋ฌ๋ฆฌ๋ ๋ชจ์ต์ ์์ํด๋ณด์ธ์. ๋ถ์ ~~ ๐๏ธ๐จ
๐ C: ์๋์ ๋๋ช ์ฌ
C ์ธ์ด๋ ์ค๋ซ๋์ '๋น ๋ฅธ ์ธ์ด'์ ๋๋ช ์ฌ๋ก ๋ถ๋ ค์์ด์. ์ ๊ทธ๋ด๊น์?
- ๋ก์ฐ ๋ ๋ฒจ ์ ๊ทผ: ํ๋์จ์ด์ ๊ฐ๊น์์.
- ์ต์ํ์ ๋ฐํ์: ์คํ ์ ์ถ๊ฐ์ ์ธ ์์ ์ด ๊ฑฐ์ ์์ด์.
- ์๋ ์ต์ ํ: ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ฑ๋ฅ์ ํ๋ํ ์ ์์ด์.
C๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ง์น ๊ฒฝ๋ ๋ ์ด์ฑ์นด์ ๊ฐ์์. ๋ถํ์ํ ๊ฒ๋ค์ ๋ค ์ ๊ฑฐํ๊ณ ์ค์ง ์๋์๋ง ์ง์คํ ๊ฑฐ์ฃ !
๐ง ๋ก์ฐ ๋ ๋ฒจ ์ ๊ทผ: ํ๋์จ์ด์์ ๋ฐ์ ํ ๋ํ
C ์ธ์ด๋ ํ๋์จ์ด์ ์์ฃผ ๊ฐ๊น๊ฒ ๋ํํ ์ ์์ด์. ๋ง์น ์๋์ฐจ ์์ง๊ณผ ์ง์ ๋ํํ๋ ๊ฒ์ฒ๋ผ์. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๊ณ ์? ์๋ฅผ ๋ค์ด๋ณผ๊ฒ์.
#include <stdio.h>
int main() {
int x = 5;
int y = 10;
int *ptr = &x;
printf("x์ ์ฃผ์: %p\n", (void*)&x);
printf("y์ ์ฃผ์: %p\n", (void*)&y);
printf("ptr์ด ๊ฐ๋ฆฌํค๋ ์ฃผ์: %p\n", (void*)ptr);
return 0;
}
</stdio.h>
์ด ์ฝ๋์์ ์ฐ๋ฆฌ๋ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ๋ณผ ์ ์์ด์. ์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๋ค๋ฃฐ ์ ์๋ค๋ ๊ฑด, ํ์ํ๋ค๋ฉด ์์ฃผ ์ธ๋ฐํ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๋ป์ด์์. ๋ฉ์ง์ง ์๋์? ใ ใ ใ
โก ์ต์ํ์ ๋ฐํ์: ๊ฐ๋ฒผ์์ ๊ทน์น
C ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋๋ ์ ๋ง ์ต์ํ์ ์ถ๊ฐ ์์ ๋ง ์ผ์ด๋์. ์ด๊ฑด ๋ง์น ๋ ์ด์ฑ์นด์ ๋ถํ์ํ ์ฅ์์ ๋ค ๋ผ์ด๋ด๊ณ ์ค์ง ๋ฌ๋ฆฌ๋ ๋ฐ ํ์ํ ๊ฒ๋ง ๋จ๊ธด ๊ฒ๊ณผ ๊ฐ์์.
#include <stdio.h>
#include <time.h>
int main() {
clock_t start, end;
double cpu_time_used;
start = clock();
// ์ฌ๊ธฐ์ ์คํํ๊ณ ์ถ์ ์ฝ๋๋ฅผ ๋ฃ์ผ์ธ์
for (int i = 0; i < 1000000; i++) {
// ์๋ฌด๊ฒ๋ ํ์ง ์์
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("์คํ ์๊ฐ: %f ์ด\n", cpu_time_used);
return 0;
}
</time.h></stdio.h>
์ด ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด, 100๋ง ๋ฒ์ ๋ฃจํ๊ฐ ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ์คํ๋๋์ง ์ ์ ์์ด์. C๋ ์ด๋ฐ ๋จ์ํ ์ฐ์ฐ์์ ์ ๋ง ๋น์ ๋ฐํ์ฃ !
๐ ๏ธ ์๋ ์ต์ ํ: ํ๋ก๊ทธ๋๋จธ์ ์์
C์์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์๋ ์ฌ์ง๊ฐ ๋ง์์. ์ด๊ฑด ๋ง์น ๋ ์ด์ฑ์นด ์ ๋น์ฌ๊ฐ ์ฐจ๋ฅผ ์ง์ ํ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ . ์๋ฅผ ๋ค์ด๋ณผ๊น์?
#include <stdio.h>
#include <time.h>
#define SIZE 10000
int main() {
int arr[SIZE][SIZE];
clock_t start, end;
double cpu_time_used;
start = clock();
// ํ ์ฐ์ ์ ๊ทผ (๋น ๋ฆ)
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
arr[i][j] = i + j;
}
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("ํ ์ฐ์ ์ ๊ทผ ์๊ฐ: %f ์ด\n", cpu_time_used);
start = clock();
// ์ด ์ฐ์ ์ ๊ทผ (๋๋ฆผ)
for (int j = 0; j < SIZE; j++) {
for (int i = 0; i < SIZE; i++) {
arr[i][j] = i + j;
}
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("์ด ์ฐ์ ์ ๊ทผ ์๊ฐ: %f ์ด\n", cpu_time_used);
return 0;
}
</time.h></stdio.h>
์ด ์ฝ๋์์ ์ฐ๋ฆฌ๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ ๊ทผํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋น๊ตํด์. ํ ์ฐ์ ์ ๊ทผ์ด ์ด ์ฐ์ ์ ๊ทผ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค๋ ๊ฑธ ์ ์ ์์ฃ . ์ด๋ฐ ์์ผ๋ก C์์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ์ต์ ํํด์ ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์์ด์. ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์์ ๋์ ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ฝ์๋ด๋ ๊ฑฐ์ฃ ! ๐จโ๐ง
๐ฆ ๋ฌ์คํธ: ์์ ํ๋ฉด์๋ ๋น ๋ฅด๋ค!
๋ฌ์คํธ๋ "์์ ์ฑ๊ณผ ์๋, ๋ ๋ค ์ก์๋ค!"๊ณ ์๋ํ๊ณ ์์ด์. ๊ณผ์ฐ ๊ทธ๋ด๊น์?
- ์ ๋ก ๋น์ฉ ์ถ์ํ: ์์ ์ฑ์ ์ํ ๊ธฐ๋ฅ๋ค์ด ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์์์.
- LLVM ๋ฐฑ์๋: ์ต์ ํ๋ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ์์ฑํด์.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ๋ฉํฐ์ฝ์ด CPU๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์์ด์.
๋ฌ์คํธ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ง์น ์ต์ ๊ธฐ์ ์ด ์ ์ฉ๋ ์ ๊ธฐ ๋ ์ด์ฑ์นด ๊ฐ์์. ์์ ํ๋ฉด์๋ ๋น ๋ฅด์ฃ !
๐๏ธ ์ ๋ก ๋น์ฉ ์ถ์ํ: ์์ ์ฑ์ด ๊ณต์ง!
๋ฌ์คํธ์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ '์ ๋ก ๋น์ฉ ์ถ์ํ'์์. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๊ณ ์? ๋ฌ์คํธ์ ์์ ์ฑ ๊ธฐ๋ฅ๋ค์ด ์คํ ์๋์ ๊ฑฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค๋ ๋ป์ด์์. ์๋ฅผ ๋ค์ด๋ณผ๊น์?
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
// ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ํฉ๊ณ ๊ณ์ฐ
let sum: i32 = numbers.iter().sum();
println!("ํฉ๊ณ: {}", sum);
// for ๋ฃจํ๋ฅผ ์ฌ์ฉํ ํฉ๊ณ ๊ณ์ฐ
let mut manual_sum = 0;
for &num in &numbers {
manual_sum += num;
}
println!("์๋ ํฉ๊ณ: {}", manual_sum);
}
์ด ์ฝ๋์์ iter().sum()
์ ์ฌ์ฉํ ๋ฐฉ๋ฒ๊ณผ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ๊ฑฐ์ ๋์ผํ ์ฑ๋ฅ์ ๋ณด์ฌ์ค์. ๋ฌ์คํธ ์ปดํ์ผ๋ฌ๊ฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ต์ ํํด์ฃผ๊ธฐ ๋๋ฌธ์ด์ฃ . ์์ ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์๋ ์ฑ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ ์ ์์ด์. ์์ ๊ฐ์ด๋ ์๋์์? ใ
ใ
ใ
๐ง LLVM ๋ฐฑ์๋: ์ต์ ํ์ ๋ง๋ฒ
๋ฌ์คํธ๋ LLVM(Low Level Virtual Machine)์ด๋ผ๋ ๊ฐ๋ ฅํ ์ปดํ์ผ๋ฌ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํด์. ์ด๊ฑด ๋ง์น ๋ ์ด์ฑ์นด์ ์์ง์ ์ต๊ณ ์ ์์ง๋์ด๋ค์ด ํ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์์. ์ด๋ค ํจ๊ณผ๊ฐ ์๋์ง ๋ณผ๊น์?
#[inline(always)]
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let result = add(5, 10);
println!("๊ฒฐ๊ณผ: {}", result);
}
์ด ์ฝ๋์์ #[inline(always)]
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ์ด์. ์ด๋ ๊ฒ ํ๋ฉด LLVM์ด add
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ