니가드와 달: 첫 번째 OOPL
객체지향 프로그래밍(OOP)은 우리 업계에서 가장 중요한 혁신 중 하나로 손꼽힙니다.
이는 조용하고 학구적인 성격의 올레-요한 달(Ole-Johan Dahl)과 다혈질이지만 유쾌한 크리스텐 니가드(Kristen Nygaard)라는 성격이 대조적인 두 인물의 협업을 통해 탄생한 결과물이었습니다.
크리스텐 니가드
1956년, 니가드는 오슬로 대학교에서 수학 석사 학위를 받았으며, 학위 논문 제목은 “Theoretical Aspects of Monte Carlo Methods(몬테카를로 기법의 이론적 탐구)”였습니다.
미국의 컴퓨터 과학자인 앨런 케이(Alan Kay)는 크리스텐 니가드를 가리켜 ‘거의 모든 면에서 보통 사람의 능력을 뛰어넘는 사람’이라고 평가했습니다.
올레-요한 달
1949년 올레는 오슬로 대학교에 입학합니다.
그는 수학을 전공했고, 그곳에서 처음으로 컴퓨터를 접합니다.
아마도 그 당시에는 기계어로 프로그래밍했을 것입니다.
올레는 1952년에 병역 의무의 일환으로 NDRE에서 파트타임 일을 시작했고, 졸업 후에는 정식으로 정규직이 되었습니다.
당시 올레의 NDRE 상관이 바로 크리스텐 니가드입니다.
그렇게 두 사람은 위대한 업적을 함께 이룰 운명이 되었던 것입니다.
SIMULA와 객체지향(OO)
SIMULA 67은 최초의 객체지향 프로그래밍 언어로, C++를 만든 비야네 스트롭스트룹(Bjarne Stroustrup)과 스몰토크(Smalltalk)를 만든 앨런 케이에게 영향을 주었습니다.
니가드는 프로그래밍 전문가가 아니었고 컴파일러를 만드는 일도 그의 전문 분야가 아니었습니다.
그래서 니가드는 자신이 아는 최고의 프로그래머인 달에게 도움을 요청했습니다.
그렇게 두 사람은 함께 협력하여 SIMULA라는 이름의 프로그래밍 언어를 만들기 시작했고, 1962년 5월에 완성합니다.
SIMULA 기획 초기에는 ALGOL 60을 기반으로 작업이 진행되었습니다.
즉, 니가드와 달은 입력으로 이산 이벤트 네트워크를 받아 ALGOL 60 코드로 변환해 주는 일종의 전처리기(preprocessor) 형태로 SIMULA를 만들려고 했던 것입니다.
니가드는 NDRE 경영진과 여러 가지 마찰을 겪고 있었고, NDRE 연구 소장과도 개인적인 갈등이 있었습니다.
결국 그는 1960년 5월 NCC(노르웨이 컴퓨팅 센터)로 이직했고, 그곳에서 민간 작전 연구 부서(civilian operation research department)를 새롭게 구축하기 위한 업무를 시작합니다.
NCC는 니가드와 달의 SIMULA 아이디어에 대해 그다지 긍정적인 반응을 보이지 않았습니다.
- 그런 언어는 쓸모가 없을 것이다.
- 쓸모가 있다면, 이미 누군가가 만들었을 것이다.
- 달과 니가드는 그런 프로젝트를 수행할 능력이 없다.
하지만 역사는 가끔 뜻밖의 행운을 가져다 주기도 합니다.
당시 스페리 랜드(Sperry Rand)는 이제 막 새롭게 출시한 UNIVAC 1107 컴퓨터를 유럽 시장에 알리기 시작했고, 새로운 유럽 고객을 유치하고자 하던 시점이었습니다.
그렇게 1962년 5월, NCC에서 SIMULA 개발 제안을 퇴짜 맞은 니가드는 스페리 랜드의 초청을 받아 미국에서 새로운 컴퓨터를 볼 수 있는 기회를 얻게 되었습니다.
베머는 ALGOL의 열성적인 지지자였으며, 포트란보다 ALGOL을 확산시킬 방법을 찾고 있던 참이었습니다.
니가드가 홍보한 SIMULA는 그 전략에 잘 들어맞는 대안처럼 보였습니다.
그렇게 밥 베머와 스페리 랜드 관계자들은 니가드의 발표에 깊은 인상을 받았고, 그를 1962년 뮌헨에서 열릴 IFIP4 세계대회에 발표자로 초청합니다.
그렇게 해서 SIMULA는 전 세계적으로 신뢰를 얻으며 주목받기 시작했습니다.
한편 스페리 랜드 측은 SIMULA가 경쟁사들보다 자신들에게 우위를 줄 수 있을 것이라고 판단했습니다.
니가드에게 NCC가 SIMULA를 개발하는 조건으로 UNIVAC 1107을 50% 할인된 가격에 제공하겠다는 제안을 한 것이었습니다.
UNIVAC 1107은 16K에서 64K까지 확장 가능한 36비트 코어 메모리를 탑재했으며, 고체 회로를 기반으로 한 컴퓨터(solid-state computer)입니다.
또 워드를 30만 개 저장할 수 있는 드럼 메모리를 갖추고 있으며, 내부 레지스터에는 박막 메모리(thin-film memory)를 사용합니다.
코어 메모리의 사이클 타임은 4마이크로초입니다.
이처럼 당시 뛰어난 성능을 가지고 있던 UNIVAC 1107은 니가드의 SIMULA에 가장 이상적인 기계였습니다.
결국 니가드와 스페리 랜드는 은밀한 공모자가 됩니다.
그들은 NCC가 DCC(덴마크 컴퓨팅 센터)와 이미 체결한 GIER 구매 계약을 깨도록 유도하기로 한 것입니다.
그 공모가 성공하면 스페리 랜드는 유럽에서 UNIVAC 1107을 시연할 수 있게 되고, SIMULA 언어를 통해 몬테카를로 시뮬레이션에 관심 있는 핵 연구소 등 다양한 고객층을 끌어들일 수 있었습니다.
그리고 니가드는 SIMULA 개발에 적합한 고성능 기계를 얻게 되며, 스페리 랜드의 전 세계 고객에게 SIMULA 언어가 보급되어 자신의 이름을 떨칠 수 있습니다.
니가드의 보고서를 받은 NTNF는 결국 GIER 주문을 취소하고 UNIVAC 1107을 도입하기로 결정합니다.
스페리 랜드는 이 계약을 더욱 확실히 성사시키고자 매우 적극적인 납기 기간을 약속했습니다.
심지어 납기를 지키지 못할 경우 위약금까지 낸다는 조항을 넣었습니다.
하지만 스페리 랜드는 자신들이 약속한 납기 기한을 지키지 못했습니다.
1963년 3월까지 인도하기로 했던 UNIVAC 1107은 8월이 되어서야 도착했고, 함께 제공해 주기로 했던 운영체제 소프트웨어도 1964년 6월이 되어서야 겨우 쓸 만한 수준으로 전달되었습니다.
결국 스페리 랜드는 위약금을 지불해야 했습니다.
그러나 그들은 현금으로 위약금을 지불하는 대신 하드웨어를 업그레이드해 주는 방식으로 보상했습니다.
SIMULA I
달은 SIMULA 컴파일러 개발에 몰두하고 있었습니다.
하지만 달의 상황도 순조롭게 진행되지는 않았습니다.
당시 그를 괴롭히던 문제는 스택(stack)과 관련된 것이었습니다.
ALGOL 60은 블록 구조 언어(block-structured language)입니다.
즉, ALGOL 60의 함수는 지역 변수를 가질 수 있으며, 이런 변수들은 스택에 저장됩니다.
달은 ALGOL 60의 블록들을 스택이 아니라 힙(heap)에 할당하는 방식으로 구상하게 되었습니다.
달은 여전히 ALGOL 60의 블록 개념을 유지하고 있었지만, 이제는 그 블록들을 스택이 아닌 가비지 컬렉션이 가능한 힙에 넣는 방식으로 바꾼 것입니다.
달의 방식은 스택과 힙 사이의 절충을 시도한 가비지 컬렉션 방식이었습니다.
달이 구상한 메모리 그룹은 경우에 따라 스택처럼 취급할 수도 있었기 때문에 전통적인 힙처럼 단편화(fragmentation)8 되는 문제도 발생하지 않았습니다.
마지막으로 사용되고 있지 않는 메모리 블록은 참조 카운팅(reference counting)과 가비지 컬렉터(garbage collector)를 통해 회수되었습니다.
메모리 블록 관리를 힙을 통해 수행하면서 객체의 생명 주기를 훨씬 유연하게 관리할 수 있었고, 그 결과 능동적인 객체 개념과 객체 간 상호 작용이라는 객체지향 프로그래밍의 핵심 개념들이 자리 잡을 수 있었습니다.
스테이션과 커스터머는 결국 시뮬레이션 안에서 동시에 작동할 수 있는 다양한 종류의 구성 요소 중 하나일 뿐이라는 점입니다.
즉, 그들은 SIMULA가 단순한 몬테카를로 시뮬레이션 전용 언어를 넘어 범용 프로그래밍 언어로 발전할 수 있다는 가능성을 깨닫게 된 것입니다.
그렇게 SIMULA의 문법은 엄청나게 바뀌었습니다.
예를 들어 커스터머와 스테이션이라는 용어 대신 보다 일반화된 개념인 액티비티(activities)가 사용되었습니다.
1964년 12월 드디어 SIMULA I의 첫 번째 프로토타입이 완성됩니다.
1967년 5월, 달과 니가드는 IFIP 시뮬레이션 워킹 콘퍼런스에서 클래스와 서브클래스 선언에 관한 논문을 발표합니다.
이 논문은 SIMULA 67의 첫 공식 정의를 담고 있으며, 클래스와 서브클래스의 인스턴스를 지칭하는 데 처음으로 객체(object)라는 용어를 사용했습니다.
또 가상 프로시저(virtual procedure: 다형성 프로시저) 개념도 이 논문을 통해 도입되었습니다.
이 논문 발표는 좋은 반응을 얻었으며, 달과 니가드는 몇 주 후 또 다른 콘퍼런스에서 타입(type)과 클래스(class)의 동일성에 대한 내용도 발표합니다.
1968년 2월, 드디어 SIMULA 67의 명세가 최종 확정되었습니다.
하지만 SIMULA 67은 여전히 시뮬레이션 언어였으며, hold나 activate 같은 키워드를 비롯하여 SIMULA I의 여러 흔적을 그대로 유지하고 있었습니다.
이런 요소들은 메모리 관리에 필요한 작업 전환기(task switcher)를 제어하기 위한 것이었지만, 결국 SIMULA가 범용 프로그래밍 언어로 자리 잡지 못하게 된 결정적인 요인이 되고 말았습니다.
SIMULA 67의 첫 상용 버전은 1971년 3월에 출시되어 상당한 성공을 거두었습니다.
IBM 360, Control Data 3000 및 6000, PDP-10 같은 다양한 기종에 구현되었으며, 특히 유럽의 많은 대학교에서 컴퓨터 과학 교육을 위한 언어로 채택되어 사용하게 되었습니다.
니가드와 달: 첫 번째 OOPL
객체지향 프로그래밍(OOP)은 우리 업계에서 가장 중요한 혁신 중 하나로 손꼽힙니다.
이는 조용하고 학구적인 성격의 올레-요한 달(Ole-Johan Dahl)과 다혈질이지만 유쾌한 크리스텐 니가드(Kristen Nygaard)라는 성격이 대조적인 두 인물의 협업을 통해 탄생한 결과물이었습니다.
크리스텐 니가드
1956년, 니가드는 오슬로 대학교에서 수학 석사 학위를 받았으며, 학위 논문 제목은 “Theoretical Aspects of Monte Carlo Methods(몬테카를로 기법의 이론적 탐구)”였습니다.
미국의 컴퓨터 과학자인 앨런 케이(Alan Kay)는 크리스텐 니가드를 가리켜 ‘거의 모든 면에서 보통 사람의 능력을 뛰어넘는 사람’이라고 평가했습니다.
올레-요한 달
1949년 올레는 오슬로 대학교에 입학합니다.
그는 수학을 전공했고, 그곳에서 처음으로 컴퓨터를 접합니다.
아마도 그 당시에는 기계어로 프로그래밍했을 것입니다.
올레는 1952년에 병역 의무의 일환으로 NDRE에서 파트타임 일을 시작했고, 졸업 후에는 정식으로 정규직이 되었습니다.
당시 올레의 NDRE 상관이 바로 크리스텐 니가드입니다.
그렇게 두 사람은 위대한 업적을 함께 이룰 운명이 되었던 것입니다.
SIMULA와 객체지향(OO)
SIMULA 67은 최초의 객체지향 프로그래밍 언어로, C++를 만든 비야네 스트롭스트룹(Bjarne Stroustrup)과 스몰토크(Smalltalk)를 만든 앨런 케이에게 영향을 주었습니다.
니가드는 프로그래밍 전문가가 아니었고 컴파일러를 만드는 일도 그의 전문 분야가 아니었습니다.
그래서 니가드는 자신이 아는 최고의 프로그래머인 달에게 도움을 요청했습니다.
그렇게 두 사람은 함께 협력하여 SIMULA라는 이름의 프로그래밍 언어를 만들기 시작했고, 1962년 5월에 완성합니다.
SIMULA 기획 초기에는 ALGOL 60을 기반으로 작업이 진행되었습니다.
즉, 니가드와 달은 입력으로 이산 이벤트 네트워크를 받아 ALGOL 60 코드로 변환해 주는 일종의 전처리기(preprocessor) 형태로 SIMULA를 만들려고 했던 것입니다.
니가드는 NDRE 경영진과 여러 가지 마찰을 겪고 있었고, NDRE 연구 소장과도 개인적인 갈등이 있었습니다.
결국 그는 1960년 5월 NCC(노르웨이 컴퓨팅 센터)로 이직했고, 그곳에서 민간 작전 연구 부서(civilian operation research department)를 새롭게 구축하기 위한 업무를 시작합니다.
NCC는 니가드와 달의 SIMULA 아이디어에 대해 그다지 긍정적인 반응을 보이지 않았습니다.
하지만 역사는 가끔 뜻밖의 행운을 가져다 주기도 합니다.
당시 스페리 랜드(Sperry Rand)는 이제 막 새롭게 출시한 UNIVAC 1107 컴퓨터를 유럽 시장에 알리기 시작했고, 새로운 유럽 고객을 유치하고자 하던 시점이었습니다.
그렇게 1962년 5월, NCC에서 SIMULA 개발 제안을 퇴짜 맞은 니가드는 스페리 랜드의 초청을 받아 미국에서 새로운 컴퓨터를 볼 수 있는 기회를 얻게 되었습니다.
베머는 ALGOL의 열성적인 지지자였으며, 포트란보다 ALGOL을 확산시킬 방법을 찾고 있던 참이었습니다.
니가드가 홍보한 SIMULA는 그 전략에 잘 들어맞는 대안처럼 보였습니다.
그렇게 밥 베머와 스페리 랜드 관계자들은 니가드의 발표에 깊은 인상을 받았고, 그를 1962년 뮌헨에서 열릴 IFIP4 세계대회에 발표자로 초청합니다.
그렇게 해서 SIMULA는 전 세계적으로 신뢰를 얻으며 주목받기 시작했습니다.
한편 스페리 랜드 측은 SIMULA가 경쟁사들보다 자신들에게 우위를 줄 수 있을 것이라고 판단했습니다.
니가드에게 NCC가 SIMULA를 개발하는 조건으로 UNIVAC 1107을 50% 할인된 가격에 제공하겠다는 제안을 한 것이었습니다.
UNIVAC 1107은 16K에서 64K까지 확장 가능한 36비트 코어 메모리를 탑재했으며, 고체 회로를 기반으로 한 컴퓨터(solid-state computer)입니다.
또 워드를 30만 개 저장할 수 있는 드럼 메모리를 갖추고 있으며, 내부 레지스터에는 박막 메모리(thin-film memory)를 사용합니다.
코어 메모리의 사이클 타임은 4마이크로초입니다.
이처럼 당시 뛰어난 성능을 가지고 있던 UNIVAC 1107은 니가드의 SIMULA에 가장 이상적인 기계였습니다.
결국 니가드와 스페리 랜드는 은밀한 공모자가 됩니다.
그들은 NCC가 DCC(덴마크 컴퓨팅 센터)와 이미 체결한 GIER 구매 계약을 깨도록 유도하기로 한 것입니다.
그 공모가 성공하면 스페리 랜드는 유럽에서 UNIVAC 1107을 시연할 수 있게 되고, SIMULA 언어를 통해 몬테카를로 시뮬레이션에 관심 있는 핵 연구소 등 다양한 고객층을 끌어들일 수 있었습니다.
그리고 니가드는 SIMULA 개발에 적합한 고성능 기계를 얻게 되며, 스페리 랜드의 전 세계 고객에게 SIMULA 언어가 보급되어 자신의 이름을 떨칠 수 있습니다.
니가드의 보고서를 받은 NTNF는 결국 GIER 주문을 취소하고 UNIVAC 1107을 도입하기로 결정합니다.
스페리 랜드는 이 계약을 더욱 확실히 성사시키고자 매우 적극적인 납기 기간을 약속했습니다.
심지어 납기를 지키지 못할 경우 위약금까지 낸다는 조항을 넣었습니다.
하지만 스페리 랜드는 자신들이 약속한 납기 기한을 지키지 못했습니다.
1963년 3월까지 인도하기로 했던 UNIVAC 1107은 8월이 되어서야 도착했고, 함께 제공해 주기로 했던 운영체제 소프트웨어도 1964년 6월이 되어서야 겨우 쓸 만한 수준으로 전달되었습니다.
결국 스페리 랜드는 위약금을 지불해야 했습니다.
그러나 그들은 현금으로 위약금을 지불하는 대신 하드웨어를 업그레이드해 주는 방식으로 보상했습니다.
SIMULA I
달은 SIMULA 컴파일러 개발에 몰두하고 있었습니다.
하지만 달의 상황도 순조롭게 진행되지는 않았습니다.
당시 그를 괴롭히던 문제는 스택(stack)과 관련된 것이었습니다.
ALGOL 60은 블록 구조 언어(block-structured language)입니다.
즉, ALGOL 60의 함수는 지역 변수를 가질 수 있으며, 이런 변수들은 스택에 저장됩니다.
달은 ALGOL 60의 블록들을 스택이 아니라 힙(heap)에 할당하는 방식으로 구상하게 되었습니다.
달은 여전히 ALGOL 60의 블록 개념을 유지하고 있었지만, 이제는 그 블록들을 스택이 아닌 가비지 컬렉션이 가능한 힙에 넣는 방식으로 바꾼 것입니다.
달의 방식은 스택과 힙 사이의 절충을 시도한 가비지 컬렉션 방식이었습니다.
달이 구상한 메모리 그룹은 경우에 따라 스택처럼 취급할 수도 있었기 때문에 전통적인 힙처럼 단편화(fragmentation)8 되는 문제도 발생하지 않았습니다.
마지막으로 사용되고 있지 않는 메모리 블록은 참조 카운팅(reference counting)과 가비지 컬렉터(garbage collector)를 통해 회수되었습니다.
메모리 블록 관리를 힙을 통해 수행하면서 객체의 생명 주기를 훨씬 유연하게 관리할 수 있었고, 그 결과 능동적인 객체 개념과 객체 간 상호 작용이라는 객체지향 프로그래밍의 핵심 개념들이 자리 잡을 수 있었습니다.
스테이션과 커스터머는 결국 시뮬레이션 안에서 동시에 작동할 수 있는 다양한 종류의 구성 요소 중 하나일 뿐이라는 점입니다.
즉, 그들은 SIMULA가 단순한 몬테카를로 시뮬레이션 전용 언어를 넘어 범용 프로그래밍 언어로 발전할 수 있다는 가능성을 깨닫게 된 것입니다.
그렇게 SIMULA의 문법은 엄청나게 바뀌었습니다.
예를 들어 커스터머와 스테이션이라는 용어 대신 보다 일반화된 개념인 액티비티(activities)가 사용되었습니다.
1964년 12월 드디어 SIMULA I의 첫 번째 프로토타입이 완성됩니다.
1967년 5월, 달과 니가드는 IFIP 시뮬레이션 워킹 콘퍼런스에서 클래스와 서브클래스 선언에 관한 논문을 발표합니다.
이 논문은 SIMULA 67의 첫 공식 정의를 담고 있으며, 클래스와 서브클래스의 인스턴스를 지칭하는 데 처음으로 객체(object)라는 용어를 사용했습니다.
또 가상 프로시저(virtual procedure: 다형성 프로시저) 개념도 이 논문을 통해 도입되었습니다.
이 논문 발표는 좋은 반응을 얻었으며, 달과 니가드는 몇 주 후 또 다른 콘퍼런스에서 타입(type)과 클래스(class)의 동일성에 대한 내용도 발표합니다.
1968년 2월, 드디어 SIMULA 67의 명세가 최종 확정되었습니다.
하지만 SIMULA 67은 여전히 시뮬레이션 언어였으며, hold나 activate 같은 키워드를 비롯하여 SIMULA I의 여러 흔적을 그대로 유지하고 있었습니다.
이런 요소들은 메모리 관리에 필요한 작업 전환기(task switcher)를 제어하기 위한 것이었지만, 결국 SIMULA가 범용 프로그래밍 언어로 자리 잡지 못하게 된 결정적인 요인이 되고 말았습니다.
SIMULA 67의 첫 상용 버전은 1971년 3월에 출시되어 상당한 성공을 거두었습니다.
IBM 360, Control Data 3000 및 6000, PDP-10 같은 다양한 기종에 구현되었으며, 특히 유럽의 많은 대학교에서 컴퓨터 과학 교육을 위한 언어로 채택되어 사용하게 되었습니다.