요약

  • 에이델 골드버그와 데이비드 로브슨의 1983년 블루 북은 스몰토크-80 가상 이미지(Virtual Image)와 각 기계별 가상 머신(Virtual Machine) 사이의 좁은 인터페이스, 즉 객체 메모리, 바이트코드, 실행 컨텍스트, 메시지 디스패치, 프리미티브 연산을 기술했습니다.
  • 골드버그는 명세가 실제 구현에 대한 책임을 지도록 만들었습니다. 애플, DEC, 휴렛팩커드, 텍트로닉스가 포트를 구축하고, 제록스 PARC와 불일치 사항을 주고받으며, 참조 트레이스를 통해 같은 이미지가 기대대로 동작하는지 판정했습니다.
  • 그 성과는 정의된 경계에서의 이식성을 입증했습니다. 그러나 서로 다른 호스트가 동등한 처리량, 지연, 폰트 메트릭, 창, 입력 장치, 파일 동작, 대화형 품질을 지녔음을 입증하지는 않았습니다.

반드시 부팅되어야 했던 명세

소프트웨어 표준은 원본을 쓴 사람들에게 모두가 여전히 의존하는 상태에서 완성된 것처럼 보일 수 있습니다. 스몰토크-80은 그 문제에 가장 까다로운 형태로 직면했습니다. 그것은 문법이나 컴파일러에 그치지 않았습니다. 클래스, 도구, 디버거, 그래픽, 인터페이스가 하나의 지속적인 이미지 안에서 객체로 함께 존재하는 살아 있는 프로그래밍 환경이었습니다. 이를 다른 컴퓨터로 옮긴다는 것은 유효한 소스 텍스트를 받아들이는 것만이 아니라 하나의 세계를 보존하는 일이었습니다.

에이델 골드버그와 데이비드 로브슨이 《Smalltalk-80: The Language and Its Implementation》에서 기록한 해법은 분할이었습니다. 가상 이미지에는 시스템을 구성하는 객체들이 들어 있었습니다. 그 아래에는 기계별 가상 머신이 인터프리터, 객체 메모리, 프리미티브를 제공하여 이미지를 저장 장치, 산술 연산, 디스플레이, 포인팅 장치 및 다른 호스트 기능과 연결했습니다. 소스 메서드는 컴팩트한 8비트 바이트코드로 컴파일되었습니다. 인터프리터가 그 바이트코드를 실행하는 동안 컨텍스트가 활성 계산을 표현했고, 객체 메모리가 정체성과 필드의 일관성을 유지했습니다.

이것이 이식성의 거래였습니다. 더 작은 기계 대면 커널을 올바르게 구현한 뒤 공유 이미지를 적재하는 것입니다. 블루 북이 가치를 지닌 이유는 산문이 소프트웨어를 대체했기 때문이 아니라, 다른 팀이 빠진 하위 계층을 다시 만들 수 있을 만큼 충분한 관찰 가능한 기계 장치를 정의했기 때문입니다.

골드버그의 독특한 기여는 “충분하다”의 정의를 내부적으로 두지 않기로 한 것이었습니다. 그 책은 다른 하드웨어에서 그것을 작동시켜야만 하는 사람들이 검토하도록 만들어졌습니다.

외부 팀은 도구의 일부였다

골드버그는 2010년 컴퓨터 역사 박물관 구술 역사에서 먼저 출판 허가를 확보한 과정을 말했습니다. 상사 버트 서덜랜드의 지원을 받은 그녀는 이어서 텍트로닉스, 휴렛팩커드, DEC, 애플을 참여시켰습니다. 참여 조건은 하드웨어 팀과 협업하는 사내 소프트웨어 팀이었습니다. 문제는 엔지니어가 언어를 좋아하는가가 아니라, 기계의 특성이 스몰토크의 성능을 돕는가 막는가였습니다.

《Smalltalk-80: Bits of History, Words of Advice》에 수집된 출시 기록은 이 방법을 이례적으로 구체적으로 보여줍니다. 여섯 회사가 초대받았고, 넷이 구현 단계에 들어갔습니다. 넷 회사는 발견한 버그와 설계 조언을 제록스와 서로 교환하기로 합의했습니다. 그들은 계속 갱신되는 이미지 테이프, 객체 포인터·객체 공간·컨텍스트·컴파일된 메서드·클래스에 관한 지침, 그리고 서면 명세가 실행 중인 현실과 어긋날 때 사용할 전화 접근 권한을 받았습니다.

이 배열은 각 포트를 문서의 시험대로 만들었습니다. PARC에서 그럴듯해 보이는 문단도 DEC, HP, 텍트로닉스, 애플의 엔지니어가 대응하는 VM을 구축하려 하면 실패할 수 있었습니다. 알토나 도라도에 조용히 의존하던 동작은 문서화되지 않은 가정으로 드러날 수 있었습니다. 하드웨어 차이는 계약에 되물어지는 질문이 되었습니다.

참여 기업들은 의례적인 승인자가 아니었습니다. 명세는 과정에서 바뀌었습니다. 프리미티브 할당이 옮겨졌고, 이미지는 커졌습니다. 첫 구현자 회의에서는 참조 카운팅, 가비지 컬렉션, 메서드 캐시를 놓고 논쟁이 벌어졌습니다. 골드버그는 이전 책 시도의 산문 대부분이 폐기되고 다시 쓰였으며, 디버그를 거친 형식적 VM 명세가 보존할 만한 부분이었다고 기록했습니다.

트레이스는 동작에 대한 주장이었다

이식성에는 “화면이 익숙해 보인다”보다 정밀한 시험이 필요했습니다. 제록스는 여러 수준의 상세도로 실행 트레이스를 배포했습니다. 하나는 메모리 참조, 할당, 바이트코드, 메시지 전송, 반환, 프리미티브 호출을 노출했습니다. 다른 것들은 더 긴 실행을 더 낮은 상세도로 다루었습니다. 구현자는 새 VM의 동작을 기대되는 시퀀스와 비교할 수 있었습니다.

블루 북의 인터페이스는 계층화되어 있었기 때문에 이것이 중요했습니다. 그 객체 메모리 프로토콜은 포인터, 워드, 바이트 접근을 구분했습니다. 인터프리터가 클래스와 메서드를 찾고, 컨텍스트를 만들고, 스택을 유지하고, 실패한 탐색을 처리하고,doesNotUnderstand:를 호출하는 방법을 정의했습니다. 바이트코드는 푸시, 저장, 전송, 반환, 점프로 묶였고, 256개의 오피코드가 부족한 곳에는 확장이 있었습니다. 산술, 컬렉션과 스트림, 저장 관리, 제어, 입출력, 시스템 함수를 위한 프리미티브 계열이 지정되었습니다.

그래픽은 경계를 특히 선명하게 만들었습니다. BitBlt와 텍스트 및 표시 합성의 상당 부분을 포함하는 상위 수준의 그래픽 동작은 이미지 객체 안에 살았습니다. 그러나 어느 시점에는 커서, 키보드, 비트맵 디스플레이, 파일 연산이 물리적 기계와 만납니다. 프리미티브 동작은 그 접합부를 넘습니다. 포트는 이미지가 무엇을 요청하는지에는 합의하면서, 그것을 제공하기 위해 다른 디스플레이 컨트롤러, 메모리 방식, 기계 명령 시퀀스를 사용할 수 있었습니다.

출시 기준은 따라서 조작적이면서도 한정되어 있었습니다. VM이 가상 이미지를 “읽고 채택”하고 기대되는 동작을 재현하면 제조사는 성공했습니다. 네 번째 이미지 릴리스 무렵에는 성공한 구현자들이 VM을 수정하지 않고도 새 이미지를 적재할 수 있었습니다. 인터페이스가 안정화되었다는 강력한 증거였습니다.

그러나 기계들이 동일해졌다는 증거는 아니었습니다.

호환성은 경험이 동일해지기 전에 멈췄다

골드버그의 출시 장은 이미지 채택과, 명시적으로 더 주관적인 두 번째 척도, 즉 각 제조사 하드웨어에서의 실제 성능을 구분합니다. 이 구분은 잃기 쉽습니다. 공유 이미지가 시스템을 놀랍도록 닮게 보이게 할 수 있기 때문입니다. 같은 클래스와 브라우저가 열리고, 같은 메서드가 컴파일되고, 같은 바이트코드 트레이스가 끝날 수 있습니다. 그러나 대화형 결과는 여전히 공유 경계의 아래와 주변에 있는 모든 것에 달려 있습니다.

객체 탐색은 서로 다르게 캐시될 수 있습니다. 메모리는 참조 카운팅, 추적, 혼합 방식으로 회수될 수 있습니다. 프리미티브는 마이크로코드로, 어셈블리로 손으로 작성되거나, 더 느린 호스트 루틴으로 구현될 수 있습니다. 스케줄링과 입력 폴링은 지연을 바꿉니다. 화면 기하학, 비트맵 배치, 커서 하드웨어, 폰트 저장, 파일 서비스는 이미지가 무엇을 표시하고 어떻게 반응하는지 제약합니다. 두 개의 올바른 VM은 객체 수준의 의미를 보존하면서 서로 다른 지연, 다시 그리기 속도, 장치 동작을 낼 수 있습니다.

문자조차 이 타협을 드러냈습니다. 골드버그는 회사 간 협력이 모든 참여자가 자신의 폰트를 통제하지 못했기 때문에 표준 ASCII를 강제했다고 회상했습니다. 이식성은 시스템에 합류할 수 있는 기계의 집합을 넓혔지만, 하나의 표현 표면을 호스트들이 안정적으로 공유할 수 있는 범위로 좁혔습니다.

블루 북 자체가 당시와 근미래의 하드웨어가 스몰토크의 대화형 목표에 바라는 모든 성능을 공급할 수 없다고 경고했습니다. VM 계약은 전송, 반환, 객체 접근이 무엇을 의미하는지 말할 수 있었습니다. 그러나 약한 프로세서를 도라도처럼 느끼게 하거나, 디스플레이를 키우거나, 마우스를 표준화하거나, 가비지 컬렉션 일시 정지를 모두 없앨 수는 없었습니다.

이것이 오래가는 공학 교훈입니다. 호환성 증거는 그것이 수집된 계층에서 읽어야 합니다. 이미지나 바이트코드 시험을 통과하는 것은 이미지/VM 합의에 대한 증거이지, 타이밍, 타이포그래피, 창, 주변 장치, 전체 사용자 경험에 대한 증거가 아닙니다.

출판은 세 부분으로 이루어진 릴리스였다

공개된 스몰토크-80 릴리스는 블루 북보다 의도적으로 컸습니다. 1981년 8월 《BYTE》 특별호는 이해하기 쉬운 초기 소개를 제공했습니다. 골드버그와 로브슨의 1983년 저술은 언어를 가상 머신 명세와 결합했습니다. 별도의 1984년 책 《Smalltalk-80: The Interactive Programming Environment》은 프로그래머가 실제로 시스템 안에서 어떻게 작업했는지를 기술했습니다. 구현자들이 배운 것을 보고한 권은 글렌 크래스너가 편집했습니다.

골드버그와 로브슨은 언어 책을 함께 정리했습니다. 구술 역사에서 골드버그는 그녀와 댄 잉걸스가 논쟁적인 시스템 질문을 팀에 가져와 최종 결정을 내리고, 로브슨은 반대 의견의 옴부즈맨 역할을 하는 결정 과정을 말했습니다. 잉걸스는 나중에 참조 인터프리터 작업의 대부분을 로브슨이 했다고 회상했습니다. 출판은 그리하여 저술이면서 동시에 거버넌스였습니다. 산문, 실행 가능한 모델, 팀 결정이 수렴해야 했습니다.

책에 걸친 분할은 또한 단일 산출물이 스몰토크를 담을 수 없다는 것을 인정한 것이었습니다. 언어 의미론, VM 기계 장치, 대화형 환경, 구현 경험은 연결되어 있지만 서로 교환할 수 없었습니다. 블루 북은 이식 가능한 핵심을 지정했습니다. 환경 책은 사용자 대면 시스템을, 그 품질이 여전히 구체적 호스트에 의존하는 상태로 기술했습니다. 경험 권은 형식적 인터페이스가 의도적으로 열어둔 선택들을 기록했습니다.

그 경계선은 단일 발명가가 아니라 팀을 통과한다

골드버그 중심의 어떤 서술도 그녀를 스몰토크의 유일한 원천으로 만드는 데 저항해야 합니다. 블루 북 자체가 시뮬라와 앨런 케이의 비전을 언급합니다. 케이의 역사적 서술은 시뮬라의 객체와 스케치패드의 대화형 그래픽이 그의 사고를 형성한 방식을 다룹니다. 케이는 메시지 중심 개인용 컴퓨팅 방향을 제시했습니다. 댄 잉걸스는 인터프리터와 가상 머신 설계를 만들고 거듭 발전시켰습니다.

그들을 둘러싼 PARC 팀이 환경을 실체로 만들었습니다. 다이애나 메리는 텍스트 표시를 다루었고 나중에 텍스트와 그림을 섞는 갤리 에디터를 시연했습니다. 테드 켈러는 초기 비트맵 선 그리기와 나중에 메모리 시스템 작업에 기여했습니다. 래리 테슬러는 노테이커와 프로그래밍 환경에서 일했습니다. 데이비드 로브슨은 시스템 결정을 엄밀한 책과 참조 인터프리터로 전환하는 데 도움을 주었습니다. 밥 플리걸은 골드버그와 함께 책의 삽화 작업을 했습니다. 다른 많은 이들이 브라우저, 에디터, 그래픽, 컴파일러, 저장 시스템, 릴리스 도구를 만들었습니다.

그 계보 안에 놓여도 골드버그의 성과는 결코 작아지지 않습니다. 그녀는 연구 대상을 외부 구현 커뮤니티와 연결하고, 출판 허가를 협상했으며, 하드웨어 증거가 문서를 바꿀 수 있는 검토를 설계하고, 명세를 공동 저술하고, 릴리스를 완성된 공개 형태로 이끌었습니다. 외부 포트 팀들은 내부 팀이 볼 수 없는 것을 찾아냄으로써 그 고리를 완성했습니다.

계약은 서로 다른 기계 장치를 허용함으로써 살아남았다

이후의 역사는 이 경계가 왜 중요했는지 분명히 해줍니다. 잉걸스는 어떤 스몰토크 시스템은 라이선스된 이미지에서 내려왔고, 어떤 것은 문서에서 새로 작성되었다고 기록합니다. 애플에서 그는 APDA 스몰토크를 다른 입력·표시 조건에 맞추면서, 개념적 연속성은 유지된 채 더 빠른 프로세서와 더 큰 화면이 경험을 바꾸었다는 것을 발견했습니다.

스퀵은 더 결정적인 사례를 제공합니다. 1990년대 잉걸스와 동료들은 공개된 참조 인터프리터와 제약 없는 APDA 이미지를 사용해 새 구현을 부트스트랩했습니다. 팀은 그 뒤 이전의 객체 테이블 방식을 직접 포인터로 대체하고, 세대별 가비지 컬렉션을 채택했으며, 제한된 스몰토크 부분 집합에서 C를 생성했습니다. 테드 켈러와 잉걸스가 메모리 시스템을 다시 만들었고, 존 말로니가 번역기를 작성했으며, 스콧 월리스가 파일 접근을 다시 설계했습니다. 그 결과는 원래의 호스트 기계 장치를 보존하지 않으면서도 스몰토크 계열임을 알아볼 수 있었습니다.

이것이 생산적인 이식 가능 계약이 하는 일입니다. 모든 역사적 메커니즘이 아니라 유용한 접합부를 보호합니다. 새 구현자에게 접합부 아래를 바꿀 만한 확신과, 그 변경이 접합부 위를 깨뜨렸는지 판정할 만한 증거를 제공합니다.

컴퓨터 역사 박물관의 스몰토크 주니어는 이제 실행 가능한 보존 시스템들 사이에서 이 다양성을 보여줍니다. 주니어(zoo)는 적절한 은유입니다. 공유된 조상이 동일한 유기체를 의미하지는 않습니다. 블루 북은 어떤 동작이 국경을 넘어야 하는지, 그리고 똑같이 중요하게, 어떤 구현 선택이 현지에 남을 수 있는지를 말해 줌으로써 이 가족의 이동을 도왔습니다.

출처