Skip to content

Chapter 5 John Backus: The First High-Level Language #1679

@jongfeel

Description

@jongfeel

Chapter 5 존 배커스: 첫 번째 고수준 언어

존 배커스란 인물

존 워너 배커스(John Warner Backus)는 1924년 12월 3일에 태어났습니다.

배커스가 남다른 흥미를 보이던 분야는 하이파이(hi-fi) 오디오 시스템을 만드는 것입니다. 그는 GI 법(보훈 제도)을 활용하여 라디오 기술 학교에 입학했고, 그곳에서 ‘인생의 첫 훌륭한 스승’을 만나 자신이 수학에 상당한 재능과 흥미가 있음을 깨닫게 됩니다.
이후 배커스는 컬럼비아 대학교(Columbia University) 대학원에 진학하여 수학을 전공합니다.

반짝이는 조명에 사로잡혀

1949년 봄, 컬럼비아 대학교에서 석사 과정을 밟고 있던 그는 우연히 ‘흥미로운 것’을 발견합니다.
친구 권유로 매디슨 애비뉴의 IBM 전시장에 전시된 SSEC(Selective Sequence Electronic Calculator: 선택적 순차 전자 계산기)를 본 것입니다.

진공관과 릴레이가 달칵거리며 돌아가는 이 웅장한 기계는 이후 수십 년간 컴퓨터의 전형적인 모습을 나타내는 표본이 되었습니다.

SSEC는 하버드 마크 I 심포지엄에서 하워드 에이컨에게 홀대 당한 토머스 J. 왓슨의 복수작입니다.
왓슨은 SSEC를 통해 에이컨이 받은 관심을 빼앗고자 했습니다.

SSEC의 개발로 가장 큰 이득을 본 것은 IBM입니다.
매디슨 애비뉴의 1층 전시장에 전시된 이 기계의 거대한 종이테이프와 수많은 진공관이 들어 있는 커다란 캐비닛, 미래적인 느낌의 화려한 조명이 달린 콘솔, 끊임없이 딸깍거리는 릴레이 소리는 사람들의 시선을 사로잡았고 IBM의 위상을 높이는 데 큰 역할을 했습니다.

배커스는 그 반짝이는 불빛과 소리, 기계에서 느껴지는 압도적인 힘에 깊은 인상을 받았습니다.
그래서 수학 석사 학위를 받고 컬럼비아 대학교를 졸업하자마자 IBM 사무실에 들어가 일자리를 요청합니다.
놀랍게도 IBM은 그에게 바로 일자리를 내주었습니다.

흥미로운 점은 사실 배커스가 취업을 위해 IBM을 방문하지는 않았다는 것입니다.
그저 배커스가 IBM 시설을 구경하던 중에 “혹시 IBM에서 사람을 뽑나요?”라고 근처 직원에게 가볍게 물어본 것이 계기가 되어 시버와 즉석 면접을 보게 되었습니다.
그 자리에서 시버는 배커스에게 수학 문제를 몇 개 풀어 보게 한 후 곧바로 그를 합격시켰습니다.
그렇게 배커스는 SSEC 프로그래머라는 것이 어떤 일인지도 모른 채 출근을 시작합니다.

스피드코딩과 IBM 701

1952년, IBM은 첫 대량 생산형11 대형 컴퓨터이자 ‘디펜스 계산기(Defense Calculator)’라 불렀던 IBM 701을 발표했습니다.

IBM 701은 완전한 전자식 컴퓨터로 진공관을 약 4,000개 사용합니다.
또 프로그램 내장 방식(stored-program architecture)을 채택했으며, 1,024비트를 저장할 수 있는 윌리엄스 관(Williams tube)을 72개 사용하여 메모리를 구성했습니다.
또 워드 크기는 36비트였기 때문에 워드를 총 2,048개 저장할 수 있습니다.

전체적으로 IBM 701은 명령어를 초당 약 1만 4,000개 실행할 수 있습니다.

IBM 701에는 드럼과 테이프 메모리, 프린터, 카드 리더 및 천공기 같은 주변 장치들이 포함되어 있었습니다.
그리고 임대료는 월 1만 5,000달러였을 정도로 대단히 고가였습니다.

또 36비트 누산기(accumulator) 레지스터와 36비트 곱셈/나눗셈용 레지스터가 있으며, 명령어는 18비트 길이로 부호 비트 1비트, 연산 코드(opcode) 5비트, 주소 12비트로 구성되어 있습니다.

IBM 701에는 컴파일러가 없었고 어셈블러도 매우 원시적인 수준에 불과했습니다. 따라서 배커스는 로더 프로그램이 숫자 명령어를 제대로 읽을 수 있도록 숫자 명령어에 직접 대응하는 천공 카드를 일일이 작성합니다.

이처럼 지루하고 고된 작업에 진절머리가 난 배커스16는 결국 전혀 새로운 종류의 프로그램을 만들기로 결심합니다. 그는 이 프로그램을 스피드코딩(Speedcoding)이라고 이름 붙였고 다음과 같이 설명했습니다.

“솔직히 말해서 그냥 게으름 때문에 스피드코딩을 만들게 되었다. 프로그래밍은 너무 고된 일이었기 때문이다. 하나하나 세세한 부분까지 신경 써야 했고, 원래는 신경 쓰지 않아도 될 것들까지 다루어야 했으니까. 그래서 나는 이런 부분들을 좀 더 쉽게 만들고 싶었다.”

스피드코딩에는 인쇄, 카드 읽기 및 쓰기, 드럼이나 테이프에 데이터 저장하기 등 다양한 입출력(IO) 연산 기능이 포함되어 있습니다.
이런 기능들을 통해 프로그래밍 작업의 효율성이 획기적으로 향상됩니다.

여기에 추가로 배커스는 세 가지 수준의 추적을 지원하는 간단한 로깅/트레이싱 시스템까지 구현했습니다.
이 기능 덕분에 디버깅에 걸리는 시간도 크게 줄일 수 있었습니다.

하지만 스피드코딩은 천공 카드 기반의 어셈블러 같은 문법 체계로 이루어져 있어 여전히 천공 카드 형식에 의존해야 한다는 단점이 있었습니다.

기술은 빠르게 발전했습니다.
윌리엄스 관보다 빠르고 안정적인 코어 메모리가 등장했으며, 배커스의 스피드코딩으로 ‘높은 추상화를 통한 생산성 향상’이 실제 가능하다는 것이 입증되었습니다.
이에 힘입어 더 큰 메모리 용량과 인덱스 레지스터, 부동소수점 연산을 갖춘 IBM 704가 1954년에 출시됩니다.
4년 후에는 트랜지스터 기반의 IBM 7090까지 탄생합니다.

속도를 향한 갈망

배커스는 자신의 상사인 커스버트 허드(Cuthbert Hurd)에게 곧 발표될 IBM 704용 컴파일러를 개발하자고 제안합니다.
그는 이 작업에 약 6개월 정도가 걸릴 것이라고 예상했습니다.
배커스의 상사인 허드는 뜻밖에도 이를 흔쾌히 승인했고, 그렇게 해서 존 배커스는 팀을 꾸려 프로젝트를 시작하게 되었습니다.

그들에게는 프로그램의 효율성이 가장 중요한 목표였고, 대상 기계는 오직 IBM 704뿐이었습니다.
따라서 그들이 만든 언어는 IBM 704에서만 효율적으로 동작할 수 있도록 발전해 갔으며, 다른 기계에서의 활용은 전혀 고려되지 않았습니다.

배커스가 프로젝트를 완료하는 데 6개월 정도가 걸릴 것이라고 말했지만, 거의 1년이 지나서야 완성된 컴파일러도 언어 명세서도 아닌 그저 ‘예비 보고서(preliminary report)’를 발표할 수 있었습니다.
비록 예비 보고서였지만 발표를 위해 그들이 개발한 언어 이름을 정해야 했습니다.
그리고 배커스가 선택한 이름은 바로 FORmula TRANslation(포트란)입니다.

업무 분담

초기에 배커스 팀은 컴파일러가 IBM 704 실행 프로그램을 생성할 때 소스 코드를 한 번만 읽는 방식으로 만들고 싶었습니다.

프로그래머가 프로그램이나 중간 결과가 담긴 카드 덱을 반복해서 입력해야 하는 번거로움을 없애고 싶었습니다.
따라서 컴파일러는 소스 코드를 한 번에 읽고, 내부적으로 이른바 중간 데이터 구조인 ‘테이블’을 만들어 처리한 후 이를 최종적인 기계어로 변환해야 했습니다.

이를 위해 배커스는 팀을 작업 그룹 여섯 개로 나누고 각각 컴파일러의 특정 섹션을 담당하게 했습니다.
각 그룹은 자신이 처리한 정보를 다른 그룹이 활용할 수 있도록 ‘테이블’이라는 중간 자료 형태로 만들어 제공했습니다.
그 섹션 여섯 개는 다음과 같습니다.

  1. 파서(parser)
  2. 코드 생성(code generator)
  3. 이름 없는 중간 통합 파트
  4. 프로그램 구조화(program structure)
  5. 태그 분석(tag analysis)
  6. 백엔드(back end)

컴파일러 섹션 여섯 개를 완성하는 데는 상당한 시간이 걸렸습니다.
처음 예상했던 6개월보다 훨씬 더 오래 걸렸고, 1957년 초가 되어서야 최초의 포트란 I 프로그램이 실제로 컴파일되고 실행될 수 있었습니다.

하지만 그 기다림은 그만한 가치가 있었습니다.
포트란 I 언어는 작성하기 쉬웠고, 컴파일러가 생성한 704용 기계 코드는 놀라울 만큼 효율적이었습니다.

포트란에 대한 개인적인 의견

과거에서 이어져 온 제약이 너무 많기 때문에 포트란이 진정한 현대 언어로 거듭나기에는 한계가 있습니다.
오래된 이야기이지만, ‘문법으로 덕지덕지 이어 붙인 혹투성이 언어’라는 표현은 지금도 여전히 포트란을 정확히 묘사하는 말인 것 같습니다.

그러나 포트란은 분명 큰 의의를 지닌 언어입니다.
고수준 언어(high-level language)가 프로그램 실행 시간을 최소화하면서도 프로그래머의 시간을 크게 절약해 줄 수 있다는 것을 보여 주었기 때문입니다.
하지만 저는 이 언어를 실질적인 작업에 사용하고 싶지는 않습니다.
사실상 포트란은 이미 죽었거나 거의 죽은 언어이기 때문입니다.

물론 NASA에서 여전히 포트란을 사용하는 사람들이 있다는 것은 알고 있습니다.
기존에 구축된 라이브러리나 운용 중인 우주 탐사선 때문입니다.

ALGOL과 그 밖의 모든 것

ACM은 훗날 ALGOL 60이라는 언어를 만들게 되지만, 초기에 이들이 만들려고 했던 것은 국제 대수 언어(International Algebraic Language, IAL)라는 언어였습니다.

그래서 배커스는 범용적으로 프로그래밍 언어를 기술할 수 있는 방식을 고안하기 시작합니다.
그 결과, 그는 생성 규칙(production rules)들을 차례로 연결하여 프로그래밍 언어의 문법 구조를 설명할 수 있는 기호 기반의 메타 언어를 만들어 냈습니다.
이 메타 언어는 간단한 규칙들을 기반으로 점차 복잡한 문장을 만들어 나갈 수 있도록 설계되었습니다.
추후 이 메타 언어는 배커스 정규형(Backus Normal Form, BNF)이라고 불렀으며, 배커스는 이를 사용하여 1959년 IAL의 공식 명세서를 작성합니다.

위원회 멤버 중 덴마크의 수학자 피터 나우르(Peter Naur)가 배커스의 우려에 공감합니다.
그래서 그는 배커스의 BNF 표기를 사용하여 ALGOL 60의 명세서를 만들었습니다.
이후 피터 나우르는 ALGOL 60의 명세서를 1960년 1월 파리에서 열린 위원회 회의에 제출했고, 그 결과 BNF 표기법이 받아들여집니다.

4년 후 도널드 커누스(Donald Knuth)35는 BNF 이름을 배커스–나우르 표기법(Backus–Naur Form)으로 바꾸자고 제안합니다.
이후 BNF는 프로그래밍 언어를 기술하는 표준 표기법이 되었고, 파서 생성기인 yacc 같은 프로그램에서도 입력 형식으로 널리 사용되고 있습니다.

배커스는 이후에도 IBM 연구소에서 일했고, 미국 국가 과학 메달(National Medal of Science), 튜링상, 드레이퍼상 등을 수상했습니다.

결국 그는 2007년에 세상을 떠났고, 그해 소행성 6830번이 그의 이름을 따 ‘존배커스(Johnbackus)’로 명명되기도 했습니다.

Metadata

Metadata

Assignees

Labels

2026We Programmers우리, 프로그래머들 - AI 시대에 잊혀 가는 '프로그래머 정신'을 다시 깨우다

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions