Smalltalk의 역사와 환경
Smalltalk는 Xerox PARC에서 윈도우 인터페이스, 이더넷 등과 함께 탄생했으며, 1970년대 여러 버전을 거쳐 Smalltalk-80이 대중에게 공개되었습니다. 80년대와 90년대에는 ParcPlace의 ObjectWorks/VisualWorks와 같은 상용 제품이 항공 산업 등 여러 분야에서 사용되었으며, 익스트림 프로그래밍의 기반이 된 대규모 급여 프로젝트도 Smalltalk로 진행되었습니다.
1995년, Apple에 모인 Xerox Smalltalk 팀원들은 오픈소스 Smalltalk VM인 Squeak을 출시했습니다. Squeak은 매우 작은 C 커널 위에 환경의 95%를 Smalltalk 자체로 구축했으며, 심지어 C 컴파일러까지 Smalltalk로 작성되어 다양한 시스템에 쉽게 이식될 수 있었습니다.
Smalltalk의 독특한 개발 환경
Smalltalk는 Unix나 C의 영향을 전혀 받지 않은 독자적인 진화 경로를 따랐습니다. 이는 Ruby, Python, JavaScript 등 대부분의 현대 언어와는 대조적입니다. Smalltalk는 자체 운영체제와 같은 환경으로, Workspace와 Browser가 주요 인터페이스입니다.
-
Workspace: REPL과 유사하게 코드를 실행하거나 결과를 출력할 수 있습니다.
-
Browser: 코드 작성의 중심 공간으로, ‘Categories’, ‘Classes’, ‘Protocols’, ‘Messages’의 네 가지 창으로 구성됩니다. 이 브라우저를 통해 시스템의 모든 소스 코드를 열람하고 수정할 수 있으며, 이는 Smalltalk의 강력하면서도 위험한 특징입니다.
Smalltalk는 코드를 텍스트 파일이 아닌 ‘이미지’에 저장하기 때문에, 팀 협업 시에는 ‘변경 세트(change sets)’를 공유하는 방식을 사용했습니다.
Smalltalk의 문법 및 객체 모델
Smalltalk의 문법은 Ruby에 비해 매우 간단합니다. 모든 변수는 객체이며, 모든 표현식은 객체에 메시지를 전달하는 방식입니다. 메시지는 단항, 이항, 키워드 메시지 세 가지 종류가 있으며, 연산자 우선순위 없이 왼쪽에서 오른쪽으로 평가됩니다. 조건문(ifTrue:ifFalse:)이나 반복문도 특별한 문법 대신 메시지 호출과 블록을 통해 구현됩니다.
Smalltalk의 객체 모델은 Ruby 개발자에게 매우 친숙합니다:
-
Object라는 기본 클래스 상속 -
인스턴스 변수는 비공개
-
메서드 호출 시점의 동적 메서드 탐색
-
클래스는
Class클래스의 인스턴스 -
메타클래스 존재
-
method_missing과 유사한doesNotUnderstand메서드
다만, Smalltalk는 다중 상속이나 믹스인을 지원하지 않고 위임을 통해 유사 기능을 구현하며, 메타클래스 구조가 Ruby와 다소 차이가 있습니다.
Smalltalk의 흥망성쇠와 Ruby에 미친 영향
Smalltalk는 즉각적인 테스트, 강력한 디버깅, 이미지 기반 시스템을 통한 개발의 유연성 등 뛰어난 장점을 가졌습니다. 그러나 Unix 및 ‘작은 조각들을 느슨하게 연결’하는 철학이 주류가 되면서, Smalltalk는 외부 시스템 통합, 데이터베이스 연결, Unix 기반 소스 관리 시스템과의 호환성 문제로 인해 점차 쇠퇴했습니다.
Ruby는 Smalltalk로부터 ‘모든 것이 객체’라는 객체 모델, 메시지 호출이 가능한 한 늦게 평가되는 방식 등을 계승했습니다. Ruby는 Smalltalk의 핵심 사상을 C/Perl/Java 프로그래머에게 익숙한 문법으로 재해석하여 적용했습니다. 저자는 Smalltalk 경험이 Ruby에서 작은 클래스와 객체를 적극적으로 활용하는 자신의 코딩 스타일에 큰 영향을 주었다고 회고합니다.