Hacker News인프라 · 데브옵스오늘의 주요

C의 유연한 정수 타입은 설계 실수가 아니었다

원제 C's Flexible Integer Sizes Were Not a Design Mistake

104 포인트댓글 160
Key Point

C의 정수 타입 설계 철학을 이해하면 왜 현대 언어들은 고정 크기를 택했고 C는 여전히 유연성을 유지하는지, 그리고 이식 가능한 저수준 코드를 어떻게 작성해야 하는지 알 수 있다.

핵심 요약

  • C에서 int, short, long 같은 타입은 고정된 크기를 갖지 않으며, 컴파일러와 머신 아키텍처에 따라 달라진다.
  • 많은 프로그래머는 이를 설계 실수라고 보지만, 실제로는 1970년대 다양한 아키텍처에서 이식성을 달성하기 위한 의도된 선택이었다.
  • C 설계 당시 컴퓨터는 12, 18, 36, 60비트 워드, 6/7/8/9비트 문자 집합, 세 가지 음수 표현 방식 등 극도로 다양했다.
  • BCPL·B 같은 선행 언어는 모든 값을 머신 워드로 취급했는데, PDP-11의 도입으로 문제가 생겼고, C의 타입 시스템은 이를 해결하기 위해 설계됐다.
  • int는 '그 머신에서 가장 자연스럽고 빠른 정수 타입'을 의미했으며, C 표준도 이를 명시하고 있다.
  • 1978년 C는 이미 16비트 int, 32비트 int, 36비트 int를 가진 머신들에서 실행되고 있었고, 같은 코드가 모든 머신에서 효율적으로 동작했다.
  • 만약 int가 고정된 32비트여야 했다면 PDP-11 같은 16비트 머신에서는 연산마다 두 배 이상의 명령어가 필요했을 것이다.
  • ANSI C 표준화 시 C는 고정 크기 대신 보장된 최소 범위를 제공하는 철학을 명시했으며, 로 노출했다.
  • portable C 프로그램은 '정확히 N비트인 타입이 무엇인가' 아니라 '어떤 범위를 보장하는 최소 타입인가'를 묻는 방식으로 작성된다.
  • C99 이후 는 고정 크기 타입(int32_t 등)을 제공하지만, 정확한 너비가 실제로 존재할 때만 제공한다.
  • Lua 같은 현대 프로젝트는 여전히 이 철학을 따르며, 'unsigned int가 최소 32비트인가'를 물어서 16~64비트 int 머신 모두에서 작동한다.
  • 1990년대 이후 설계된 언어들은 8비트 바이트·바이트 주소 지정·2의 보수가 표준이 된 이후 출발했기에 고정 크기를 가정할 수 있었다.
  • Rust, Go, Swift, Zig 같은 현대 언어도 포인터 크기의 자연수 타입(isize, int 등)을 유지했으며, 워드 크기 개념은 '머신 자연 워드'에서 '포인터 크기'로 좁혀졌다.
  • C23은 드디어 부호 있는 정수에 2의 보수를 요구하게 됐지만, 1의 보수와 부호-크기 머신이 극히 드물어진 2020년대에 이를 한 것이다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗