정수형 기본값, Signed가 답일까? 언어 설계의 딜레마
프로그래밍 언어 설계 시 정수형 기본값(Signed/Unsigned) 선택은 중요한 결정임
저자는 Unsigned 정수형의 문제점을 지적하며, Signed를 기본값으로 선택
암묵적 형변환(Implicit Conversion)의 위험성을 강조하며, 명시적 형변환을 권장
오버플로우(Overflow) 및 언더플로우(Underflow) 처리 방식에 대한 다양한 의견 제시
Unsigned 정수형의 함정
저자는 Unsigned 정수형을 사용할 때 발생하는 문제점을 지적하며, 특히 '음수 불가'라는 잘못된 인식(Misunderstanding)으로 인해 발생하는 오류를 강조한다. Unsigned 정수형의 언더플로우(Underflow)는 예상치 못한 결과를 초래하여, 무한 루프(Infinite Loop) 또는 범위 초과 오류(Out-of-bounds Errors)를 발생시킬 수 있다. 이러한 문제는 숙련된 프로그래머조차 간과하기 쉽다고 언급하며, 언어 설계 시 이러한 함정을 고려해야 한다고 주장한다.
암묵적 형변환(Implicit Conversion)의 위험성
저자는 암묵적 형변환이 코드의 의도를 모호하게 만들고, 예기치 않은 버그를 유발할 수 있다고 경고한다. 특히, 서로 다른 정수형 간의 암묵적 변환은 데이터 손실(Data Loss)을 초래할 수 있으며, 이는 디버깅을 어렵게 만든다. Odin 언어에서는 이러한 문제를 방지하기 위해 명시적 형변환만을 허용하며, 개발자가 형변환의 의도를 명확하게 밝히도록 강제한다. 이는 코드의 가독성을 높이고, 잠재적인 오류를 줄이는 데 기여한다.
오버플로우(Overflow) 및 언더플로우(Underflow) 처리 전략
저자는 오버플로우와 언더플로우의 처리 방식에 대한 다양한 접근 방식을 제시한다. Rust와 같이 디버그 빌드에서는 트랩(Trap)을 사용하고, 릴리스 빌드에서는 래핑(Wrapping)을 사용하는 방식은 일관성이 부족하다고 비판한다. Odin에서는 모든 정수 연산에 대해 래핑을 기본으로 하며, 개발자가 나눗셈-0(Division-by-Zero)과 같은 예외적인 상황에 대한 동작을 정의할 수 있도록 한다. 이는 예측 가능한 동작을 보장하고, 개발자가 시스템의 동작을 제어할 수 있도록 돕는다.
언어 설계의 핵심 가치
저자는 언어 설계 시 과거 언어의 실수를 인지하고, 그 배경을 이해하는 것이 중요하다고 강조한다. C 언어에서 발생한 Unsigned 관련 버그는 암묵적 형변환과 같은 설계 결함에서 기인한다. 언어 설계자는 이러한 과거의 실수를 반복하지 않도록, 트레이드오프(Trade-offs)를 신중하게 고려해야 한다. 또한, 언어의 일관성과 명확성을 유지하여 개발자가 안전하고 예측 가능한 코드를 작성할 수 있도록 지원해야 한다.