처음 C언어를 배울 때 세미콜론을 자주 빠트렸던 기억이 있다. 마침표도 아니고, 세미콜론으로 명령어를 끝맺는 건 언뜻 보기에 부자연스럽다. 어셈블리어와 같은 초기의 프로그래밍 언어는 개행으로 명령문을 구별했다. 그 뒤 무슨 일이 있어났는지는 모르겠지만 C나 자바(Java)같은 언어는 세미콜론을 쓰고 파이썬(Python)이나 루비(Ruby)는 쓰지 않는다. 이 세미콜론이라는 게 대체 어디서부터, 어떤 이유로 쓰이게 된 것일까.
세미콜론은 알골로부터
새로운 프로그래밍 언어는 기존에 있던 프로그래밍 언어의 특징이나 구조를 그대로 따르는 경우가 많다. C와 자바 역시 그럴 것이다. 처음 세미콜론을 사용한 언어인 알골(ALGOL)에서 그 이유를 찾아보자. 알골의 설계자들은 최대한 수학 식에 가깝게 코드를 구성하고 싶어했다. 그러나 그 당시의 모든 컴퓨터가 수학 식을 입력할 수 있는 기능을 제공하지 않았을 뿐더러, 컴퓨터마다 지원하는 문자가 달라 서로 호환이 되지 않았다. 때문에 우선 기준이 되는 언어를 정하고, 여기에 맞추어 각 컴퓨터의 문자로 표현할 수 있는 변형된 언어가 존재할 수 있도록 허용했다.
그러기 위해서는 우선 기준이 되는 언어를 명확히 다루어야 했다. 언어의 여러 구성 요소를 기호로 표현한다면, 특정 시스템에서는 이 기호에 이러이러한 문자가 대응한다라는 것을 쉽게 정의할 수 있다. 명령문과 명령문을 구분하는 문자 역시 기호로서 정의할 필요가 있었다. 개행은 기호라고 치기 어려우므로 채택할 수 없었을 것이다. 무언가를 구분하는 문자로서 가장 유명한 것은 쉼표인데, 쉼표는 이미 리스트를 만들 때 각 요소의 구분 기호로 쓰이고 있었다:
for a := 1, 3, 5, 9.76, ..., -13.75;
그래서 대신 쉼표와 유사한 의미를 가진 세미콜론을 채택한 것으로 보인다.
명령문 사이에서 명령문 끝으로
세미콜론의 원래 의미는 두 대상을 구분하기 위함이지만, 이상하게도 C에서는 명령어의 사이가 아니라 명령어의 끝에 추가하도록 강제하고 있다. 이는 C의 가까운 조상 언어인 PL/I의 설계자들이 세미콜론을 명령문 끝에 추가하는 게 더 배우기 쉽고 오류도 적다고 판단했기 때문이다. 실제로 파스칼(Pascal)은 알골과 유사하게 세미콜론을 두 명령어의 사이에 넣는데, 종종 이러한 문제로 인해 비판의 대상이 되곤 한다. 다음 파스칼 코드를 보자:
if a then begin
b0;
b
end;
c;
여기에 else문을 추가한다면 다음과 같이 end;
에서 세미콜론을 빼야 하는 번거로움이 있다:
if a then begin
b0;
b
end
else
d;
c;
장단점
개행이 아니라 세미콜론같이 특정한 문자를 정해서 명령문을 구분한다면 모니터든 종이든 출력 매체에 상관 없이 자유롭게 개행할 수 있어 편리하다는 장점이 있다. 명령문을 개행으로 구분하는 언어에서는 하나의 명령문을 두 줄에 걸쳐 나누어 입력할 때 백슬래시와 같은 줄 연결 문자를 통해 명령문을 연결해야 하는데, 백슬래시 기호를 붙여서 명령문을 잇는 건 그냥 바로 개행하는 것에 비해 부자연스럽다.
그렇다고 세미콜론을 쓰는 게 마냥 좋은 것만은 아니다. 세미콜론이라는 문자는 우리가 일상 생활에서 잘 사용하지 않는 문자다. C나 자바에서는 문장을 마치는 용도로 쓰는데, 일상 생활에서의 언어에서는 그런 용도로 쓰는 경우가 없다. 때문에, 특히 초심자의 경우 이를 빠트리거나 잘못된 곳에 사용하는 경향이 있다.
PL/I에서는 세미콜론을 명령문 사이사이가 아닌 명령문 끝에 항상 추가하는 것을 선택했다. 그렇다면 끝에 추가한다는 의미에 걸맞게 차라리 마침표를 쓰면 어떨까? 실제로 코볼(COBOL)은 명령문을 마침표로 끝맺어 자연 언어와 최대한 닮은 꼴을 유지하려 한다. 이런 방법이 사용자에게 친숙함을 줄 수 있겠지만, 모든 언어가 꼭 자연 언어같이 보이는 것만을 중요하게 여겨야 하는 것은 아니다. 언어를 설계할 때 기존의 있었던 언어들과의 유사성에 더 높은 우선순위를 둘 수도 있다. 기존 언어에서 굳이 바꿀 필요가 없는 부분이라고 생각한다면, 그냥 그 부분을 가져오는 게 사용자들에게 친숙한 느낌을 주기도 하고 여러모로 좋다. 여전히 많은 언어가 마침표나 개행이 아닌 세미콜론을 사용하는 이유는, 알골이 그랬고, PL/I가 그랬고, C가 그랬고, C++이 그랬고, 자바와 C#이 그랬기 때문이 아닐까.
참조
- Report on the Algorithmic Language ALGOL, 1959, 42p
- The Early History and Characteristics of PL/I, 1978, 233p
- Why Pascal is not my favorite programming language, 1981, 10p
- Report on the Algorithmic Language ALGOL 60, 1960, 301p
- Identifying Top Java Errors for Novice Programmers, 2005, 3p
- The early history of COBOL, 1978, 138p