CAR와 CDR, CADR의 역사와 의미
초록
이 논문은 IBM 704 기계 구조와 리스트 처리 함수인 CAR·CDR·CADR·CADADR 등의 명명 유래를 탐구한다. 초기 어셈블리 명령어와 메모리 주소 지정 방식이 이름에 어떻게 반영됐는지 밝히고, 복합 함수 명칭이 리스트 접근을 직관적으로 표현하는 장점을 설명한다.
상세 분석
IBM 704는 1954년 발표된 최초의 대형 전자식 컴퓨터 중 하나로, 36비트 워드와 15비트 주소 필드를 갖는다. 이 시스템은 메모리 워드 안에 ‘주소’와 ‘데이터’를 동시에 저장할 수 있는 ‘주소‑데이터 레지스터(ADR)’ 구조를 사용했으며, 명령어 형식은 ‘오퍼랜드 주소(주소 필드)’와 ‘연산 코드’를 결합한 형태였다. 이러한 설계는 고수준 언어가 없던 시기에 어셈블리 프로그래머가 리스트와 같은 복합 데이터를 직접 조작하도록 만들었다.
Lisp의 창시자인 John McCarthy는 리스트를 구현하기 위해 두 개의 기본 연산, 즉 ‘첫 번째 요소를 반환하는 연산’과 ‘나머지 리스트를 반환하는 연산’을 필요로 했다. 그는 IBM 704의 어셈블리 명령어에서 ‘주소’를 의미하는 ‘A’와 ‘데이터’를 의미하는 ‘D’를 차용해 각각 CAR와 CDR이라는 이름을 만들었다. 여기서 CAR는 “Contents of the Address part of Register”의 약자, CDR은 “Contents of the Decrement part of Register” 혹은 “Contents of the Data part of Register”라는 설득력 있는 해석이 뒤섞여 있다. 실제 IBM 704 매뉴얼에서는 이러한 약어가 명확히 정의되지 않았으며, McCarthy와 그의 동료들이 실용적인 필요에 따라 즉석에서 만든 용어라는 점이 논문의 핵심 주장이다.
이러한 어원적 모호성에도 불구하고, CAR·CDR 체계는 함수 합성을 통해 복잡한 리스트 접근을 간결히 표현할 수 있게 해준다. 예를 들어 CADR은 ‘CAR of CDR’를 의미하고, CADADR은 ‘CAR of CDR of CAR of CDR’를 뜻한다. 이러한 복합 명칭은 Lisp 프로그래머에게 “작은 접근 프로그램”이라는 직관적인 의미를 제공한다. 논문은 이와 같은 명명 방식이 함수형 프로그래밍 패러다임에서 고차 함수와 파이프라인 구성을 촉진했으며, 이후 Scheme, Clojure 등 현대 언어에서도 유사한 패턴이 재현되고 있음을 지적한다.
또한, IBM 704의 물리적 제약—예를 들어 주소와 데이터가 동일 워드 내에 존재하고, 레지스터가 제한된 수량만 제공된다는 점—이 CAR·CDR 명명에 직접적인 영향을 미쳤다는 점을 강조한다. 이러한 역사적 배경을 이해하면, 현재의 고수준 언어 설계자가 메모리 모델과 연산자 이름 사이의 관계를 재검토할 때 유용한 교훈을 얻을 수 있다.