삶의 흔적
[RUST] 학습노트 2. Hello, world 분석 본문
이전에 Hello,world! 를 출력하는 프로그램에서 Rust의 특징을 몇개 찾은것이 있었습니다
"""
fn main() {
println!("Hello, world!");
}
1. 함수의 반환형 선언이 보이지 않는다
2. 함수 호출 시 함수이름 println 뒤에 ! 를 붙였다
3. 하나의 명령 끝에는 ; 를 붙인다
출처: https://badsector-0xe5.tistory.com/12 [삶의 흔적]
"""
1번은 Rust가 컴파일 언어라는 것에 집중을 했던지라
C언어를 주 비교 대상으로 생각을 해버려서 놓쳤던 부분이
파이썬의 함수 선언 키워드 def 같은 역할을 하는 fn키워드가 있었습니다
아마 이 부분은 Rust의 메모리 관리 개념 중 하나인 소유권이
함수가 반환하는 값의 유형(숫자, 문자 등..)에 대한 정보를 처리하지 않나? 라고 추측해 봅니다
2번 함수명 뒤에 !을 붙이게 되면 일반적인 함수가 아닌 'Rust macro'라는것을 호출한다고 합니다.
우리는 '재사용성'을 위해 함수, 매크로를 이용하게 됩니다
매크로와 함수의 차이

함수는 자신만의 영역을 가지고 자신의 역할이 끝나면 결과를 돌려주고 자신의 영역을 치우게 됩니다
반면 매크로는 컴파일러가 작동하기 전 전처리기에 의해 코드가 '복붙'되게 됩니다
따라서 함수의 영역을 생성하고 삭제하는 과정이 생략되어 빨라지게 되지만 코드가 길어지기 때문에
실행파일의 크기는 커지게 됩니다.
속도에는 위험이 따른다
#define PRODUCT(x,y) ((x)*(y))
#define ADD(x,y) x+y
Rust등장 이전의 C언어에선 매크로가 속도면에서는 이득이지만 코드를 '복붙'하기 때문에 위험한 방법입니다.
보통 작성자는 실행 상태의 데이터를 직접 보는 것이 아닌 변수명으로 데이터를 다루게 되어 실수를 저지르게 됩니다
웹에서 정보를 가져오게 되면 문자 데이터와 정수데이터를 구분하기 힘들때도 생기게 됩니다
그 상황을 예로 들면 첫번째 매크로 함수는
int x = PRODUCT(amount, price); # amount: 1, price: "1000"
라고 호출되면 전 처리기에 의해 단순히 치환(복붙)하기 때문 아래 처럼 되며 컴파일러에 따라선 경고 혹은 에러가 발생합니다, 최악의 경우 포인터가 정수처럼 취급되어 그냥 실행되어서 무의미한 값을 내뱉겠죠
int x = ((1)*("1000"));
# C언어로 문자열을 다루려면 price는 char*타입 이어야 하므로 '1'이 담긴 주소값이 되겠지요
두번째 매크로 선언 처럼 괄호를 쓰지 않게 되면 나중에 상당히 머리아픈 일이 발생하게 됩니다
int y = ADD(1,2) * 3;
이 값은 어떤 결과가 나올까요?
함수라면 1+2의 결과가 반환된 다음 * 3과 만나 y에 9가 대입되게 됩니다
그러나 매크로는 단순 치환이기 때문에 코드가
int y = 1+2 * 3;
이렇게 되어 버리고 곱셈 연산이 우선순위가 높기 때문에 1+ (2*3)의 결과인 7이 y에 들어가게 됩니다
여기서 발견되는 매크로의 가장 큰 문제는 의도하지 않은 행동을 하게 되었는데
아무 문제없이 컴파일이 되고 실행되어서 문제를 수정하기 어려워 진다는 것에 있습니다
(IDE에서 빨간줄 안그어 줘서 어디가 문제인지 찾기 힘듦)
C언어에선 이처럼 매크로 함수는 속도에 대한 위험이 큽니다
Rust는 이 부분에 대해 특별한 장치를 해두었다고 들었으니 차차 알아가 봅시다
3번 아이디어를 실험해 보기위해 컴파일 언어보단 스크립트언어인 파이썬을 자주 쓰다보니
Rust는 비교적 최근에 만들어 진 언어인데 명령중 끝에 ;(세미콜론)이 있다는 것이
새삼스럽게 느껴지네요 하지만 다음글에 설명할 rustfmt를 보면 이해가 가기도 하고요.
'사라져가는 열정 > 프로그래밍' 카테고리의 다른 글
| [RUST] 학습노트 4. Hello, cargo (0) | 2022.03.01 |
|---|---|
| [RUST] 학습노트 3. 코드 스타일 (0) | 2022.02.28 |
| [RUST] 학습노트 1. Hello, world! (0) | 2022.02.26 |
| [일지] 1. TCP 소켓 맛보기 그리고 그리드 컴퓨팅 (0) | 2016.10.26 |
| 유클리드 호제법 (0) | 2016.07.23 |