C3 언어, unsigned size의 함정을 파헤치다.

by DD
1개월 전
조회수 2

C3 언어, unsigned size의 오류 발생 가능성(Error Prone)을 인지하고 signed size를 기본값으로 채택

unsigned size 사용 시 발생하는 무한 루프(Infinite Loop), 잘못된 비교(Broken Comparison) 등의 문제점 지적

Rust, Go, Java 등 다른 언어들의 사례를 통해 signed size의 장점(Advantages) 강조

개발자들은 언어 설계의 트레이드오프(Trade-offs)와 타입 시스템에 대한 다양한 의견 제시

Unsigned size의 근본적인 문제점

C3 언어 개발자는 unsigned size를 사용하면서 발생한 문제점을 지적하며, 특히 무한 루프(Infinite Loop)잘못된 비교(Broken Comparison)를 예시로 제시했다. 이러한 문제들은 unsigned size가 기본값으로 설정되었기 때문에 발생하며, C 언어의 암시적 형변환(Implicit Conversion)으로 인해 더욱 악화된다고 분석했다. 또한, unsigned size는 경계값(Boundary)에 가까워질수록 오류 발생 가능성이 높아진다는 점을 강조했다.

Signed size 채택의 배경

C3 언어는 unsigned size의 문제점을 해결하기 위해 signed size를 기본값으로 채택했다. 개발자는 signed size를 사용함으로써 암시적 형변환으로 인한 문제를 줄이고, 코드의 안전성을 높일 수 있다고 설명했다. 또한, Go와 Java의 사례를 통해 signed size가 언어 설계에 있어 합리적인 선택임을 강조하며, unsigned size 사용 시 발생하는 예상치 못한 동작(Unexpected Behavior)을 방지할 수 있다고 주장했다.

링 버퍼(Ring Buffer) 구현의 어려움

글쓴이는 unsigned size를 사용할 때 링 버퍼(Ring Buffer) 구현의 어려움을 지적했다. 특히, offset이 음수일 경우 unsigned 연산으로 인해 예상치 못한 결과가 발생할 수 있으며, 이는 오류를 감지하기 어렵게(Hard to Detect) 만든다고 설명했다. signed size를 사용하면 이러한 문제를 해결할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있다고 강조했다.

Rust, Odin, Carbon 등 다른 언어들의 접근 방식

커뮤니티에서는 Rust, Odin, Carbon 등 다른 언어들의 접근 방식에 대한 논의가 이루어졌다. Rust는 overflow를 error로 처리하고, Odin은 모든 정수 연산을 wrapping 방식으로 정의하며, Carbon은 mixed-sign 비교를 허용하여 수학적으로 정확한 결과를 반환하는 방식을 채택했다. 이러한 다양한 접근 방식은 언어 설계 시 트레이드오프(Trade-offs)를 보여주며, 개발자들은 각 방식의 장단점을 비교 분석했다.

정보 이론 관점에서의 unsigned size

일부 개발자는 정보 이론(Information Theory) 관점에서 unsigned size가 더 단순하고, 값 공간(Value Space)에 직접적으로 매핑된다는 점을 들어 unsigned size의 장점을 주장했다. 하지만 다른 개발자들은 실제 사용되는 값 공간은 전체 범위가 아니며, 경계값에서의 동작이 중요하다고 반박했다. 이러한 논쟁은 언어 설계 시 다양한 관점(Various Perspectives)을 고려해야 함을 보여준다.

Unsigned sizes: a five year mistake