C 언어 창시자 데니스 리치, &와 | 연산자 설계 비하인드 스토리 공개
C 언어 초기, &와 |는 비트 연산과 논리 연산을 모두 수행하는 이중 역할(Dual Role)을 담당했음
Alan Snyder의 제안으로 &&와 || 연산자가 추가되었지만, 기존 코드 호환성을 위해 &와 |의 우선순위는 변경되지 않았음
데니스 리치는 우선순위 변경의 어려움과 당시 적은 코드 기반을 고려하여 현행 방식을 유지했음을 밝힘
댓글에서는 과거 코드 호환성(Backward Compatibility)에 대한 개발자들의 고민을 엿볼 수 있음
초기 C 언어의 &와 | 연산자
데니스 리치(Dennis Ritchie)는 초기 C 언어에서 &와 | 연산자가 비트 연산과 논리 연산 두 가지 역할을 모두 수행했다고 설명한다. 이는 B 및 BCPL 언어에서 물려받은 '진리값 컨텍스트(Truth-value Context)' 개념에 기인한다. 즉, if, while 문 등에서 &와 |는 &&와 ||처럼, 일반 표현식에서는 비트 연산자로 해석되었다.
&&와 || 연산자 도입 배경
알란 스나이더(Alan Snyder)의 제안으로 &&와 || 연산자가 추가되면서 비트 연산과 단락 회로 평가(Short-circuit Boolean Evaluation)의 개념이 분리되었다. 하지만 데니스 리치는 기존 코드와의 호환성을 고려하여 &와 |의 우선순위를 변경하는 것을 망설였다. 당시 수백 킬로바이트의 소스 코드와 소수의 설치 환경을 고려한 결정이었다.
우선순위 결정에 대한 아쉬움
데니스 리치는 회고를 통해 &의 우선순위를 ==보다 높게 변경하는 것이 더 나은 선택이었을 수 있다고 언급한다. 하지만 기존 코드의 잠재적 문제를 고려하여 안전한 방향을 택했다. 이는 레거시 코드(Legacy Code) 관리의 어려움을 보여주는 사례이며, 현재에도 호환성(Compatibility)과 언어 설계(Language Design) 사이의 균형을 맞추는 것은 어려운 과제임을 시사한다.
커뮤니티 반응: 코드 호환성의 중요성
댓글에서는 기존 코드의 호환성을 유지하려는 결정이 종종 잘못된 결과를 초래할 수 있다는 점을 지적한다. 이는 기술 부채(Technical Debt)의 발생과도 연결될 수 있으며, 개발 과정에서 과거의 결정(Past Decisions)이 미치는 영향에 대한 경각심을 일깨운다. 또한, 지속적인 리팩토링(Refactoring)과 코드 품질 관리(Code Quality Management)의 중요성을 강조한다.