Teco의 시작
댄 머피나는 1962년, MIT 학부 시절 보스턴 차이나타운에 있던 내가 가장 좋아하던 식당 Ye Hong Guey에서 TECO라는 이름을 떠올렸다. 그때 나는 다른 프로그램을 작성하는 데 도움을 주는 작은 프로그램을 만들고 있었다. 당시에는 컴퓨터(디지털 이큅먼트 코퍼레이션의 PDP-1)가 거의 아무 소프트웨어도 없이 제공되던 시절이었기 때문에 이런 일은 흔한 일이었다. 내 프로그램이 어느 정도 완성 단계에 이르자 이름이 필요해졌고, 그래서 친구 Pete Peterson과 나는 가능한 이름들과 그 약어를 이것저것 고민하고 있었다.
몇 년이 지난 뒤, TECO는 “Text Editor and Corrector(텍스트 편집 및 교정기)”라는 의미로 알려지게 되었고 문서에도 그렇게 설명되었다. 그러나 우리가 그날 밤 옥스퍼드 스트리트와 비치 스트리트 모퉁이에서 처음 생각해낸 원래 의미는 “Tape Editor and Corrector(테이프 편집 및 교정기)”였다.
PDP-1에서의 인터랙티브 컴퓨터 사용
우리가 “테이프(tape)”라는 단어를 사용한 이유는, 천공 종이 테이프가 PDP-1에서 프로그램 소스를 저장할 수 있는 유일한 매체였기 때문이다. 하드 디스크도, 플로피 디스크도, 자기 테이프도, 네트워크도 없었다. 운영체제조차 존재하지 않았다. 오직 종이 테이프 리더기와 펀치기, 그리고 콘솔 타자기만이 있었다. 종이 테이프 리더는 빠른 편이었다(적어도 그 당시에는 그렇게 느껴졌다). 초당 300자를 읽을 수 있었다. 반면 펀치기는 훨씬 느려서 초당 20자밖에 처리하지 못했다. 콘솔 장치는 사무실용 전기 타자기를 PDP-1에 연결해 한 글자씩 입력과 출력을 할 수 있도록 만든 것이었다.
PDP-1은 DEC가 처음으로 제작하고 판매한 컴퓨터였으며, 미니컴퓨터 혁명의 선두주자였다. 그러나 오늘날의 기준으로 보면 전혀 “미니”가 아니었다. 최소 구성만 해도 여러 개의 키 큰 캐비닛을 차지했다. 그럼에도 불구하고 주기억장치는 18비트 워드 4,096개(사실상 8KB)에 불과했다. 이 메모리는 얇은 전선에 꿰어진 작은 자기 토로이드(core)들로 이루어진 3차원 격자 구조의 코어 메모리였다. 사이클 타임은 5마이크로초였다. 프로세서는 대부분의 명령어를 두 사이클(10마이크로초)에 실행했다. 첫 번째 사이클에서 메모리로부터 명령어를 가져오고, 두 번째 사이클에서 메모리 피연산자를 읽거나 저장했다. 일부 명령어는 메모리를 참조하지 않았기 때문에 한 사이클만에 실행되었다.
이 모든 제약에도 불구하고, 콘솔 앞에 앉아 컴퓨터를 인터랙티브하게 사용할 수 있다는 것은 매우 흥미로운 일이었다. 이전에 내가 사용해본 컴퓨터는 IBM 709나 7090 같은 대형 메인프레임이었다. 그런 기계에서는 천공 카드에 프로그램을 작성하고, 카드 더미를 컴퓨터 센터에 제출해 배치 처리로 실행한 뒤, 다음 날 결과가 인쇄된 종이를 받아보는 방식이었다. 그러나 PDP-1에서는 코드 작성 → 컴파일 → 디버깅의 순환이 몇 시간에서 몇 분으로 단축되었다. 나는 한 시간의 사용 시간 안에 이 과정을 여러 번 반복할 수 있었다.
젊은 기업이었던 DEC는 영리한 결정으로 MIT 전자연구소(RLE)에 PDP-1 한 대를 기증했다. 이 기계는 학부생을 포함해 거의 누구나 자유롭게 사용할 수 있는 방에 놓여 있었다. 곧 많은 사람들이 몰려들었다. 하지만 PDP-1은 한 번에 한 사람만 사용할 수 있었기 때문에 컴퓨터 시간은 빠르게 부족해졌다. 그래서 가능한 한 많은 프로그램 준비 작업을 오프라인에서 해야 했다. 우리는 이를 위해 Frieden Flexowriter라는 장치를 사용했다. 이는 종이 테이프 리더와 펀치를 갖춘 타자기와 비슷한 장치였다. Flexowriter에는 편집 기능이 전혀 없었기 때문에 프로그램은 먼저 손으로 써야 했다. 할 수 있는 편집이라곤 이미 뚫린 문자를 무효화하기 위해 테이프 펀치를 뒤로 되감아 같은 줄 위에 다시 펀칭(overpunch)하는 정도뿐이었다.
종이 테이프는 몇 가지 면에서는 천공 카드보다 편리했다. 같은 분량의 프로그램을 담을 때 카드보다 가벼웠고, 실수로 떨어뜨려도 코드 줄이 뒤섞이지 않았다. 하지만 이것이 동시에 가장 큰 약점이기도 했다. 프로그램을 수정해야 할 때—몇 줄을 추가하거나 변경하거나 삭제할 때—카드처럼 해당 줄만 교체할 수 없었다. 반드시 전체 테이프를 새로 뚫어야 했다. 그래서 Flexowriter에서의 편집은 매우 고된 작업이었다. 기존 소스 테이프를 읽으면서 동시에 새로운 테이프를 펀칭해야 했고, 변경이 필요한 지점마다 멈춰 새로운 내용을 입력하고 불필요한 옛 내용을 건너뛰어야 했다.
컴퓨터에서 직접 편집하는 것도 가능했고, 실제로 우리는 디버깅과 재컴파일을 하면서 그렇게 했다. PDP-1의 편집기는 단순한 줄 단위 인터페이스를 제공했다. 사용자는 기존 종이 테이프를 한 줄씩 진행하며 새로운 줄을 추가하거나 교체하여 새로운 세대의 소스를 만들 수 있었다. 그러나 이 편집기를 사용하는 것은 귀중한 컴퓨터 시간을 소모했다. 게다가 단순한 작업을 위해 컴퓨터 전체를 사용해야 했기 때문에, 사람들은 이 편집기를 **“Expensive Typewriter(비싼 타자기)”**라고 불렀다.
그 “비싼 타자기”가 텍스트 전체 줄 단위로만 추가, 삭제, 교체를 할 수 있다는 점은 나를 상당히 짜증나게 했다. 천공 카드의 경우 한 줄을 수정하려면 그 줄 전체를 새 카드에 다시 타이핑해야 하는 번거로움이 있었다. 그러나 줄과 줄 사이가 단지 캐리지 리턴 문자로만 구분되는 이 새로운 매체(종이 테이프)에서도 왜 같은 제약이 존재해야 하는지 나는 이해할 수 없었다.
TECO의 탄생
그래서 나는 Expensive Typewriter처럼 종이 테이프를 복사하면서 중간중간 수정을 할 수 있는 프로그램을 작성하기로 결심했다. 하지만 그 수정은 줄 단위가 아니라 문자 단위로 할 수 있도록 하려 했다.
그에 따라, 초기 명령어에는 다음과 같은 기능들이 포함되었다:
-
한 글자 삭제
-
한 줄 삭제 (여전히 줄 단위 작업이 편리한 경우도 있었기 때문에)
-
텍스트 삽입 (한 글자부터 여러 줄까지 어떤 길이든 가능)
-
변경을 원하는 지점에서 특정 텍스트 검색
TECO는 처음부터 인터랙티브한 온라인 편집기로 의도된 것은 아니었다. 컴퓨터 사용 시간이 매우 부족했기 때문에, 온라인 편집은 다소 낭비적인 것으로 여겨졌다. 우리는 다음 사용 시간 슬롯이 올 때까지 기다렸다가 다음 소스 개정본을 준비해야 하는 상황을 원하지 않았다.
따라서 TECO는 오프라인, 즉 Flexowriter에서 사용하도록 설계되었다. 우리는 기존 소스 테이프를 편집하기 위해 필요한 명령들을 별도의 종이 테이프로 준비할 생각이었다. 사람들이 흔히 말하듯, “그 당시에는 좋은 아이디어처럼 보였다.” 즉, 아이디어는 이랬다. 소스 출력물을 손으로 표시해 수정 사항을 적고, 그 변경을 수행하기 위한 TECO 명령들을 Flexowriter에 입력하는 것이다. (예: 위치를 찾고, 삭제하고, 삽입하고, 다음 위치로 이동하기 등.) 그리고 우리의 컴퓨터 사용 시간이 되면, TECO를 로드하고 명령이 담긴 테이프를 읽어 들인다. 그러면 TECO가 기존 소스 테이프를 읽고, 빠르게 수정된 새 테이프를 펀칭해 내는 것이다.
따라서 초기의 TECO는 소스 프로그램, 또는 더 일반적으로는 텍스트 스트림에 대한 변경 사항을 기술하는 언어였다. 이 점이 시간이 지나고 TECO가 계속 발전해 가면서 드러난 진정한 힘이었다.
TECO의 인터랙티브화
그러나 단기적으로는 오프라인 명령 준비 방식이 비현실적이라는 것이 드러났다. 나를 포함해 대부분의 평범한 사람들은 항상 제대로 작동하는 명령 테이프를 준비하는 것이 불가능했다. 다른 프로그램들과 마찬가지로, 그 명령들에도 버그가 있었고, 그 문제는 실제로 컴퓨터 위에서 실행해 보기 전에는 드러나지 않았다. 그래서 나는 초기에 TECO에 새로운 모드를 추가했다. 이 모드는 먼저 명령 테이프를 읽지 않고, 콘솔 타자기에서 직접 명령을 입력할 수 있게 해주는 방식이었다. 말할 필요도 없이, 이것은 완전히 다른 경험이었다. 우리는 한두 개의 명령을 입력해 보고 결과가 올바른지 확인한 다음, 다음 단계로 넘어갈 수 있었다.
비록 상당히 인터랙티브해졌지만, 이 시점의 TECO는 아직 화면 편집기(screen editor)는 아니었다. 우리의 PDP-1에는 CRT 디스플레이 장치가 있었지만, 텍스트를 화면에 표시하는 개념도, 그에 필요한 코드도 존재하지 않았다. 따라서 소스 코드는 여전히 종이 출력물로 보관되었고, 온라인 편집이란 콘솔에서 몇 줄씩 타이핑되어 출력된 종이를 보며 작업하는 것을 의미했다.
페이지 단위 편집의 도입
인터랙티브 편집이 가능해지면서, 여러 가지 추가 개선이 곧 필요해졌다. 소스 테이프를 한 방향으로만 이동할 수 있다는 점이 여전히 불편하다는 것이 금방 드러났다.
특히 쉽게 발생하면서도 치명적인 실수는 검색 명령을 잘못 입력하는 것이었다. 그러면 원하는 텍스트를 찾지 못한 채 복사가 테이프 끝까지 계속되어 버렸다.
이 문제를 해결하기 위해 나는 소스의 일정 부분을 메모리로 읽어 들여, 새 종이 테이프에 확정하기 전에 여러 차례 수정할 수 있도록 하는 것이 합리적이라고 판단했다. 자연스러운 단위는 “타자기로 출력된 한 페이지”였다. 대부분의 소스는 이미 이 크기로 페이지 구분이 되어 있었다. 우리는 Flexowriter와 콘솔 타자기에서 편지지 크기의 연속 용지(fanfold paper)를 사용하고 있었기 때문이다.
이것은 큰 도움이 되었다. 일반적인 검색은 현재 페이지로 제한되었기 때문에 검색이 실패해도 문제가 되지 않았다. 그냥 페이지 맨 위로 돌아가 다시 시도하면 되었다. 게다가 우리는 몇 가지 수정을 하고 결과를 확인한 뒤, 여전히 마음에 들지 않으면 추가 수정을 할 수 있었다.
새로운 명령어의 필요
페이지 단위 편집을 위해서는 새로운 명령어들이 필요했다.
-
편집이 이루어질 위치(“point”)를 추적하는 명령
-
다음 페이지로 이동하거나 테이프 끝으로 이동하는 명령
-
현재 페이지에 제한되지 않는 검색 명령
페이지를 넘는 검색은 여전히 너무 멀리 가버릴 위험이 있었지만, 그것은 특정 페이지로 이동하기 위한 용도로만 드물게 사용되었기 때문에 위험성은 훨씬 낮았다.
왜 전체 파일을 읽지 않았을까?
여기서 의문이 생길 수 있다. 왜 한 번에 한 페이지씩만 읽었을까? 왜 소스 테이프 전체를 읽지 않았을까?
앞서 말했듯이, 우리의 PDP-1은 약 8KB의 총 메모리를 가지고 있었고, 그 안에 TECO 프로그램 전체와 편집할 텍스트를 모두 담아야 했다. 파일 전체를 통째로 메모리에 올리는 것이 실용적이고 일상적인 일이 된 것은 훨씬 많은 시간이 지난 뒤, 메모리 용량이 충분히 커진 다음의 일이었다.
스와핑 드럼과 페이징
이 방향으로의 개선은 RLE의 PDP-1에 스와핑 드럼(swapping drum)이 추가되면서 가능해졌다. 이 장치는 프로그램이나 소스를 영구 저장하기에는 충분히 크지 않았지만, 속도가 빨라서 제한된 주기억장치 문제를 우회하는 데 사용할 수 있었다.
나는 TECO에 일종의 페이징 메커니즘을 구현하여, 주 편집 버퍼가 실제 메모리보다 훨씬 크게 동작할 수 있도록 했다.
몇 년 뒤, 나는 이러한 페이징 아이디어를 다중 사용자 시스템 구현에 다시 활용하게 되었고, 그 발전의 정점이 TENEX와 TOPS-20이었다.
다른 저장 매체의 지원
천공 종이 테이프는 1960년대 후반까지 여러 시스템에서 널리 사용되었지만, TECO는 우리가 사용하는 어떤 기계에서든 새로운 매체가 등장하면 거의 즉시 이를 지원했다.
MIT에 있던 또 다른 PDP-1에는 자기 테이프 드라이브가 있었고, 나는 곧 TECO에 자기 테이프 드라이버를 추가했다. 당시에는 운영체제도, 공통 입출력 라이브러리도 없었기 때문에 각 프로그램마다 장치별 명령과 I/O 루틴을 별도로 추가해야 했다.
자기 테이프는 종이 테이프보다 훨씬 빠르긴 했지만, 프로그램 저장용으로는 실용적이지 않았다.
그보다 훨씬 나은 것은 DECtape(또는 MicroTape)였다. 이것은 블록 단위 주소 지정이 가능한 소형 릴 테이프 시스템으로, 이후 PDP-1에 추가되었고 여러 해 동안 모든 DEC 시스템에서 사용 가능했다.
DECtape는 간단한 파일 시스템을 제공했다. 하나의 릴에 여러 개의 이름이 붙은 파일을 저장할 수 있었고, 파일을 여러 번 다시 쓸 수도 있었다.
이로 인해 TECO는 단순히 직렬 입력 장치로부터 텍스트 스트림을 읽는 것이 아니라, 이름으로 파일을 열 수 있는 기능을 갖추어야 했다.
시분할과 디스크 시대 이후에도
시분할 시스템과 디스크 기반 파일 시스템이 보편화된 이후에도, TECO 편집은 대부분 페이지 단위 방식으로 계속되었다. 보수적인 메모리 사용은 여전히 중요했고, 강력한 기능에도 불구하고 TECO는 매우 경제적으로 실행되는 프로그램이었다.
TECO 언어
초기에는 TECO의 “인간 인터페이스(human interface)” 설계에 대해 깊이 생각하지 않았다. 당시에는 프로그램 도구에 대해 그런 개념 자체가 거의 존재하지 않았다.
그 시절 가장 널리 사용되던 인터랙티브 프로그램은 DDT 디버거였고, 이것은 숫자 인자를 앞에 두고 한 글자 명령어를 사용하는 방식을 채택하고 있었다.
예를 들어, 프로그램의 123번 위치를 확인하려면 다음과 같이 입력했다:
123/
슬래시(/)를 입력하는 즉시 DDT는 동작했고, 해당 위치의 내용을 출력했다. 그래서 화면에는 다음과 같이 나타났다:
123/ lac foo
TECO도 이 형식을 따랐다. 예를 들어 다음과 같은 명령들이 있었다:
-
5d : 다섯 글자 삭제
-
3c : 앞으로 세 글자 이동
-
10l : 앞으로 10줄 이동
-
2k : 두 줄 제거(삭제)
-
iTEXT<term> : “TEXT” 삽입 (초기 i부터 특수 종료 문자까지의 모든 내용을 삽입)
앞서 말했듯이, TECO 명령어의 초기 설계는 오프라인 입력을 전제로 했다. 그러나 인터랙티브 사용이 일반화된 이후에도 이 구조는 잘 작동했다.
(문자 기반 명령 디스패치에 대한 흥미로운 부연 설명은 원문 사이드바에 있다.)
언어의 일관성과 일반화
이 비교적 단순한 출발점에서 나는 점점 기능을 확장해 나갔다. 그중 일부는 언어를 더 일관되고 일반적인 형태로 만드는 것이었다.
예를 들어, 포인터를 뒤로 이동시키는 별도의 명령(초기의 r 명령)은 필요하지 않았다. 문자 앞으로 이동하는 명령에 음수 인자를 주는 것이 훨씬 자연스러웠다.
같은 원리가 줄 단위 명령에도 적용되었다.
-
-3l : 세 줄 뒤로 이동
-
-5k : 이전 다섯 줄 삭제
또한 0(제로)은 현재 줄을 의미했다.
-
0l : 현재 줄의 시작으로 이동
TECO 사용자들의 습관적 패턴
이처럼 단순한 구성들은 빠르게 TECO 사용자들의 습관이 되었다.
예를 들어:
0kk
이 명령은 포인터가 현재 줄의 어느 위치에 있든 상관없이, 현재 줄 전체를 삭제한다.
(TECO에서는 대부분의 명령에 대해 기본 인자를 1로 간주하는 규칙을 사용한다.)
여기까지가 해당 분량의 완전 번역입니다.
다음 부분에서는 TECO가 점점 더 “편집기”를 넘어 “프로그래밍 언어”의 특성을 갖게 되는 구조적 확장(조건문, 반복, 매크로 등)으로 이어집니다.
TECO, 프로그래밍 언어가 되다
1962년 말 무렵, TECO는 이후 수년간 단순 편집기들이 갖게 될 수준의 기능을 이미 갖추고 있었다. 그러나 TECO의 발전은 거기서 멈추지 않았다.
그 이후의 많은 확장 기능들은 단지 “이건 쉽게 구현할 수 있겠다”거나, 누군가가 제안한 아이디어가 “재미있어 보였기” 때문에 추가되었다. 우리의 사고방식은 이랬다. 실용적인 용도나 즉각적인 필요가 떠오르지 않더라도, 멋진 아이디어라면 시도해볼 가치가 있다.
텍스트 버퍼와 루프 — 언어로서의 힘
TECO가 프로그래밍 언어 또는 텍스트 처리 엔진으로서 힘을 갖기 시작한 중요한 추가 기능은 텍스트 버퍼와 **반복 구조(loop)**였다.
그 시점에서 TECO는 간단한 프로그램 수정은 꽤 잘 처리할 수 있었지만, 대규모 구조 변경은 지원하지 못했다. 예를 들어:
-
상당한 양의 텍스트를 한 위치에서 다른 위치로 옮기는 것
-
텍스트의 한 부분을 여러 번 복제하는 것
이를 가능하게 하기 위해 나는 텍스트 변수(text variable) 개념을 도입했다. 즉, 임의의 텍스트 구간을 저장할 수 있는 변수를 만든 것이다.
텍스트 범위를 변수로 옮기는 명령은 x였다. (그때는 이미 사용 가능한 알파벳이 거의 남지 않았기 때문이다.)
앞에 붙는 인자는 k 명령과 같은 방식으로 버퍼 내 텍스트 범위를 지정했고, x 뒤에 오는 한 글자는 변수 이름이었다. 변수 이름은 a–z, 0–9 중 하나였다.
텍스트 변수의 내용을 편집 위치에 복사하는 명령은 g(get)였다. 이 명령은 여러 번 사용하여 텍스트를 반복 복제할 수 있었다.
x에는 특별한 연상적 의미가 없었지만, 금방 자연스럽게 느껴지게 되었다. “무언가를 x 한다”는 표현은 TECO 사용자들 사이에서 “저장한다(store)”라는 말만큼 자연스럽게 사용되었다.
매크로의 등장
우리가 텍스트를 변수에 저장할 수 있게 되자, 나는 텍스트 변수를 TECO 명령 문자열로 실행하는 기능을 구현했다.
앞에 표현식을 붙여 인자를 전달할 수도 있었다.
이로써 TECO는 매크로나 호출 가능한 함수와 유사한 구조를 갖게 되었다.
이는 TECO의 본래 개념—짧은 텍스트 문자열이 다른 텍스트를 수정하는 명령을 표현한다는 아이디어—에서 자연스럽게 발전한 것이었다.
반복 구조(Loop)
같은 시기, 나는 소스 텍스트에 반복적이고 체계적인 변경을 가하고 싶어졌다.
예를 들어:
-
모든 “foo”를 “fie”로 변경하기
(이는 나중에 replace 명령으로 지원되었다)
-
“foo”가 포함된 모든 줄을 찾아 그 끝에 주석을 추가하기
이 요구는 최초의 루프 구조를 탄생시켰다:
( commands boolean ; commands )
루프는 조건이 거짓이 될 때까지 0회 이상 반복 실행되었다.
검색 명령의 한 변형은 텍스트를 찾았을 때만 참(true)을 반환했기 때문에, 검색 후 수정하는 루프를 간단히 작성할 수 있었다.
PDP-1에서는 루프 시작과 끝을 “가운데 점이 있는 괄호”로 표현했다. 이후 ASCII 기반 TECO에서는 꺾쇠괄호(< >)가 사용되었다.
정수 변수
이 무렵 **정수 변수(integer variable)**도 추가되었다. 역시 이름은 a–z, 0–9 중 하나였다.
-
u(use) : 인자를 변수에 저장
-
q(quantity) : 표현식 안에서 해당 변수의 값을 참조
같은 변수 이름이 텍스트 값과 숫자 값을 동시에 가질 수 있었다. 어떤 명령이 호출되느냐에 따라 텍스트인지 숫자인지가 결정되었다.
간단한 산술 표현식도 사용할 수 있었기 때문에, 예를 들어 5번 반복하는 루프는 다음과 같이 작성할 수 있었다:
5ua
( qa; commands qa-1ua )
공백이나 줄바꿈은 문법적으로 의미가 없었다.
이 간단한 예에서 보듯, TECO는 극도로 간결한 언어였다. 꽤 복잡한 루프와 명령 시퀀스를 작성할 수 있었지만, 대부분은 마치 “잡음 같은 문자열(line noise)”처럼 보였다.
TECO는 아마도 “거의 알아볼 수 없는 한 줄짜리 문자열을 건네며 ‘이게 무슨 일을 하는지 맞혀봐’라고 웃으며 묻는 문화”를 처음으로 낳은 언어 중 하나였을 것이다.
그럼에도 불구하고, TECO는 1960년대 후반 Jean Sammet의 프로그래밍 언어 목록에 포함되었다.
TECO의 난해함에 대한 논평
수년 동안 TECO 언어가 얼마나 난해한지에 대한 수많은 논평이 있었다. 대부분은 “읽기보다 쓰기가 더 쉽다”는 전제에 동의할 것이다.
그러나 편집기로서 보았을 때, 그 간결함은 장점이었다.
정기적으로 사용하는 사람들은 자주 쓰는 명령 시퀀스를 빠르게 익혔고, 굳이 의식적으로 생각하지 않아도 되었다.
특히 WYSIWYG 편집기가 보편화된 이후, 일반 사용자는 장황한 줄 단위 편집기만 다룰 수 있다는 주장은 사라졌다. 이 문제는 한동안 DEC 내부에서 격렬한 논쟁의 대상이 되었다. 개발자들과 비즈니스/마케팅 담당자들 사이의 대립이었다.
오늘날 우리가 가장 널리 사용하는 소프트웨어에서 제공되는 수많은 난해한 키 조합들—Control, Alt, Shift 등의 수정 키를 포함한—을 생각해 보면, TECO는 오히려 거의 단순하게 보일 정도다.
TECO, 새로운 기계로 옮겨가다
몇 달이 지나지 않아, TECO는 MIT 내 여러 대의 PDP-1에서 사용되고 있었다. 전자연구소(RLE)에 있던 첫 번째 기계 외에도, 마틴 도이치(Martin Deutsch) 교수가 거품상자(bubble chamber) 사진 분석에 사용하던 PDP-1에서도 TECO가 사용되었다. 학부 마지막 해 즈음, 도이치 교수는 내가 개발한 TECO와 몇 가지 다른 프로그래밍 도구를 더 발전시키기 위해 나를 고용했다.
한편, 마빈 민스키(Marvin Minsky)가 AI 연구실을 운영하던 새로운 테크 스퀘어(Tech Square) 건물에도 PDP-1이 설치되었다. 이곳은 1965년에 MIT 최초의 DEC PDP-6가 설치될 장소이기도 했다. 그리고 이 PDP-6는 TECO가 처음으로 포팅(porting)된 기계가 되었다.
그 포팅 작업을 내가 직접 하지는 않았다. 스튜어트 넬슨(Stewart Nelson), 리처드 그린블랫(Richard Greenblatt), 잭 홀러웨이(Jack Holloway)가 수행했다. 이들은 AI 연구실의 PDP-1을 사용해 오던 사람들이었고, 새로 도입된 PDP-6를 가장 먼저 사용하게 된 사람들 중 하나였다.
AI 그룹은 이미 PDP-1 버전의 TECO에 여러 가지 향상을 추가해 두었고, 그곳에서 TECO는 활발히 사용되고 있었다. 따라서 새 PDP-6로의 포팅은 긴급한 프로젝트였다.
나는 이전에 DEC로부터 새로 개발 중이던 기계용으로 TECO를 포팅하는 아르바이트 제안을 받은 적이 있었다. 그러나 졸업 학년을 낙제하지 않고 마치는 데 집중해야 했기 때문에, 현명하게도 그 제안을 거절했다.
어셈블리 언어와 포팅의 어려움
PDP-1용 TECO는 어셈블리 언어로 작성되어 있었다. 따라서 소스를 약간 수정해서 단순히 재컴파일하는 식의 작업은 불가능했다.
그러나 PDP-6는 훨씬 더 강력하고 범용적인 명령어 집합을 갖고 있었기 때문에, TECO의 상당 부분은 (비록 수작업이긴 했지만) 어셈블리 상태를 유지한 채 명령어 단위로 번역할 수 있었다.
가장 큰 차이 중 하나는 문자 집합의 변화였다.
PDP-1은 FIO-DEC(프리덴 종이 테이프 코드의 DEC 채택 버전)이라는 인코딩을 사용했다.
반면 PDP-6는 Teletype Model 35 또는 33을 사용했으며, 이는 ASCII(대문자만 지원)를 지원했다.
화면 표시의 도입
AI 연구실의 PDP-1 TECO에서 시작되어 PDP-6에서 본격적으로 자리 잡은 또 하나의 중요한 개선은, 편집 지점 주변의 텍스트를 디스플레이에 표시하는 기능이었다.
이것은 아직 오늘날 의미의 화면 기반(on-screen) 편집은 아니었다. 명령은 여전히 콘솔 텔레타이프에서 입력되고 그대로 에코되었지만, 사용자에게 제공되는 피드백은 훨씬 향상되었다.
CRT 기반 단말기가 일반화된 것은 몇 년 뒤의 일이었다. 그 전까지 대부분의 사용자는 여전히 전통적인 방식, 즉 하드카피 장치(종이 출력 장치)에서 TECO를 사용해야 했다.
PDP-6의 확장과 복잡한 명령 체계
그 후 몇 년 동안, PDP-6의 훨씬 더 큰 메모리, 더 강력한 성능, 그리고 프로그래밍의 용이성 덕분에 많은 추가 기능이 구현되었다.
그 버전의 명령어 집합은 지금도 웹 검색을 통해 찾아볼 수 있으며, 내가 아는 한 실사용된 TECO 버전 중 가장 복잡한 형태였다.
이후 여러 기계로 수많은 포팅이 이루어졌지만, 대부분은 훨씬 기본적이었고 PDP-1 버전과 더 유사했다.
DEC가 PDP-10(DecSystem-10)의 초기 릴리스에 포함시킨 TECO조차 더 단순한 버전이었다.
당시 DEC에 있던 밥 클레멘츠(Bob Clements)는 PDP-6 AI TECO의 비교적 초기 버전을 가져와, 대부분의 설치 환경에서 사용할 수 없는 기능들(예: 고가의 CRT 디스플레이)이나 시분할 터미널 사용자에게 적합하지 않은 기능들을 제거했다. 그리고 이것이 DEC가 PDP-10 및 이후 PDP-6 설치에 함께 제공한 버전이 되었다.
이것은 또한 1969년 Bolt Beranek & Newman(BBN)이 PDP-10을 도입했을 때 내 손에 들어온 버전이기도 하다. 나는 그 버전을 이후 약 1986년까지 계속 발전시켜 나갔다.
오픈 소스의 정신
TECO가 처음 개발된 시점부터 PDP-6로 포팅되기까지, 우리는 DEC나 그 밖의 누구든 우리가 작성한 프로그램을 가져가 사용하거나 심지어 판매하는 것에 대해 기꺼이 허용하는 태도를 가지고 있었다.
나 같은 학부생에게는 사람들이 그 프로그램을 사용하고 좋아해 준다는 것 자체가 보상이었다.
게다가 당시에는 소프트웨어를 어떻게, 혹은 과연 저작권으로 보호할 수 있는지에 대해 아무도 제대로 알지 못했다. 이것은 “오픈 소스”라는 용어가 등장하기 훨씬 이전에 이미 실천되고 있던 오픈 소스 모델이었다.
DEC의 기본 소프트웨어가 되다
PDP-6 이후로, TECO는 DEC가 제공하는 모든 시스템의 기본 소프트웨어 세트에 포함되었다. 여기에는 다음과 같은 기계들이 포함되었다:
-
PDP-8
-
PDP-11
-
DecSystem-10
-
DecSystem-20
-
VAX/VMS
또한 TECO는 마빈 민스키의 AI 연구실에서 해커들에 의해 활발히 사용되고 확장되었다. 그들 중에는 리처드 스톨만(Richard Stallman)도 있었다.
스톨만과 화면 기반 편집
1970년대 초중반, 스톨만은 TECO에 몇 가지 중요한 개선을 가했다. 이 개선 덕분에 TECO는 완전히 인터랙티브한 WYSIWYG 스타일의 화면 기반 편집기로 발전할 수 있었다.
그 핵심 기능 중 하나는, 개별 키 입력 하나하나가 즉시 매크로(즉, 실행할 함수)를 호출하도록 만드는 것이었다.
이는 일반적인 문자 키도 포함했다. 예를 들어, 일반 텍스트 입력 모드에서 a를 입력하면, 버퍼에 a를 삽입하고 화면을 갱신하는 함수가 실행되었다.
이 기능으로 인해 많은 사용자들이 키 입력으로 즉시 실행되는 편집 동작을 만들기 시작했다. 그리고 머지않아 가장 유용한 것들을 모아 문서화하고 다른 사람들이 사용할 수 있도록 정리하려는 시도가 이루어졌다.
이것이 바로 최초의 Editor Macros, 즉 Emacs였다.
Emacs와 TECO
TECO는 몇 년 동안 EMACS의 텍스트 엔진으로 계속 사용되었다. 그러나 결국 Lisp과 유사한 텍스트 조작 언어인 Emacs-Lisp로 대체되었다.
소프트카피(화면 기반) 터미널을 위한 여러 버전의 TECO도 만들어졌다. 그중 하나는 내가 TENEX와 TOPS-20용으로 만든 VTECO였다.
또한 개발과 진화가 여러 장소에서 각기 다른 방향으로 진행되면서, TECO 명령 언어의 여러 방언(dialect)들도 등장했다.
DEC 사용자 그룹(DECUS)에는 TECO 특별 관심 그룹(TECO-SIG)도 존재했다.
DEC 제품군이 TECO가 가장 일관되게 제공되고 사용되던 환경이긴 했지만, TECO는 많은 다른 시스템으로도 포팅되었다. 그러나 이들 버전의 계보를 오늘날 정확히 추적하는 것은 어렵거나 거의 불가능하다.
회고 (Reflections)
분명히 TECO는 수년에 걸쳐 수많은 사용자들을 거쳐 왔다. 그중 실제로 TECO로 “프로그램”을 작성하거나 시도한 사람은 비교적 소수였다.
내가 초기에 했던 연습 중 하나는 TECO로 산술 표현식 컴파일러를 작성하는 것이었다. 예를 들어 다음과 같은 표현식을:
x = a + (b * c) * 3 / d
PDP-1 어셈블리 명령어들의 연속으로 변환하여 실제 계산을 수행하도록 만드는 프로그램이었다.
나는 이것을 실용적인 컴파일러로 발전시키려 하지는 않았다. 그것은 주로 TECO 명령어 집합이 얼마나 완전한지를 시험해보는 방법이자, 재미있는 해킹(hack)이었다.
TECO로 작성된 다른 프로그램들
알려진 다른 TECO 프로그램으로는 초기 이메일 인터페이스가 있었다.
이는 ARPA의 래리 로버츠(Larry Roberts)가 만든 TECO 매크로 집합으로, 이메일 받은 편지함에서 메시지를 선택적으로 읽을 수 있게 해주는 기능이었다.
이 정도 수준의 TECO 해킹은 드문 경우였지만, 많은 사용자들이 자신만의 커스터마이징을 만들어냈다. 이는 편리한 명령 시퀀스를 TECO 매크로로 저장해 두었다가 일반적인 편집 세션 중에 빠르게 호출하는 형태였다.
오늘날 일부 편집기에서 제공하는 키 입력 기록 방식과 달리, TECO 매크로는 순수한 텍스트였다. 따라서 다른 텍스트와 마찬가지로 편집하여 디버깅하고 개선할 수 있었다.
TECO가 제공했던 힘
여기에 더해, 언제든지 루프나 조건 검색 같은 프로그래밍 구조를 사용할 수 있었기 때문에, TECO는 강력한 기능을 제공했다.
나를 포함한 많은 과거 TECO 사용자들은 이러한 능력이 현대의 편집기들에는 부족하다고 느낀다.
과거에는 TECO 안에서 즉석에서(on the fly) 하던 작업들을, 이제는 더 번거로운 방식으로 해야 하거나, 그게 견디기 힘들다면 편집기 밖에서 Grep, Sed, Awk, Perl 같은 다른 도구를 사용해 처리해야 한다.
오늘날의 TECO
오늘날에도 가끔이라도 TECO를 실행해 보고 싶은 사람들을 위해, 대부분의 일반적인 시스템에서 사용할 수 있는 버전이 웹상에 존재한다.
특허 침해 혐의 (Alleged Patent Infringement)
그 당시에도 매우 단순해 보였던 이 명령 처리 방식이, 몇 년 후 특허 침해 소송의 대상이 되었다. 이 일은 1980년대 후반에 벌어졌다. 당시 나는 DEC의 VAX/VMS 그룹에서 근무하고 있었다. 어느 날 DEC 법무팀으로부터 전화를 받았다. IBM이 어떤 소규모 회사로부터 소송을 당하고 있었던 것이다. 그 회사는 IBM PC가 자신들의 특허를 침해했다고 주장하고 있었다. 그들은 일부 기본적인 프로그래밍 기법을 자사의 특허 지적 재산(IP)이라고 주장했다. 이에 대응하기 위해 IBM은 선행 기술(prior art)을 찾는 조사를 진행했다. 문제의 쟁점 중 하나는 “문자 기반 명령 디스패치(character-based command dispatching)”였다. 그리고 IBM은 어떤 경로로인지 TECO를 찾아냈다. TECO는 해당 소송에서 주장된 특허보다 훨씬 이전에 구현된 시스템이었다. IBM은 나를 원래 구현자로 특정했고, 내가 DEC에 근무하고 있음을 추적해 DEC 법무 부서에 연락해 협조를 요청했다. 나는 IBM 변호사 몇 명과 상담을 했고, 본격적인 재판이 열리기를 기대하고 있었다. 그러나 결국 그와 관련된 연락은 다시 오지 않았다. 아마도 재판까지 가지 않고 사건이 합의로 마무리된 것이라 추정한다.
이상
IEEE Annals of the History of Computing 에 실린
인용정보는 Murphy, D. (2009). The Beginnings of TECO. IEEE Annals of the History of Computing, 31, 110 - 115.
pdf는 https://opost.com/tenex/anhc-31-4-anec.pdf
저자의 홈페이지는 https://www.opost.com/dlm/
입니다.
댓글 없음:
댓글 쓰기