맨위로가기

스몰토크

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

스몰토크는 1970년대 제록스 PARC에서 앨런 케이, 댄 잉걸스, 아델 골드버그 등에 의해 개발된 객체 지향 프로그래밍 언어이다. GUI를 최초로 제공하고 마우스와 같은 기술 개발에 기여했으며, 루비, 자바 등 다양한 언어에 영향을 미쳤다. 스몰토크는 순수 객체 지향 언어로서 메시지 전달 방식을 사용하며, 동적 타이핑, 이미지 기반, 리플렉션, 통합 개발 환경(IDE) 등의 특징을 가진다. 1980년대 스몰토크-80 버전이 공개된 이후 다양한 구현체(스퀵, 파로, 비주얼웍스 등)가 개발되었으며, 한국에서도 1990년대 초 객체 지향 프로그래밍 언어로 소개되었으나 현재는 사용 빈도가 높지 않다. 스몰토크는 객체 지향 디자인 패턴과 MVC 패턴 개발에 선구적인 역할을 했으며, 현재는 다양한 스몰토크 관련 단체 및 연구소가 활동하고 있다.

```

더 읽어볼만한 페이지

  • 스몰토크 프로그래밍 언어 계열 - 스크래치 (프로그래밍 언어)
    스크래치는 MIT 미디어 연구소에서 개발한 어린이 및 입문자를 위한 시각적 프로그래밍 언어이며, 블록 기반 방식을 통해 애니메이션, 게임, 스토리 등을 만들 수 있도록 설계되었고, 코드 공유 및 재사용을 장려하며 다양한 교육 환경에서 활용된다.
  • 스몰토크 프로그래밍 언어 계열 - 스퀵
    앨런 케이와 댄 잉갈스 등이 개발한 스몰토크 기반 프로그래밍 환경인 스퀵은 다이나북 프로젝트의 이상 구현, 자유로운 이식성, 고기능 멀티미디어 처리를 목표로 개발되었으며, 다양한 사용자 인터페이스 프레임워크와 교육용 환경 eToys를 제공하고 MIT 및 아파치 라이선스로 자유롭게 사용 가능하다.
  • 1972년 개발된 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 1972년 개발된 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
    프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다.
  • 명령형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
  • 명령형 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
스몰토크 - [IT 관련 정보]에 관한 문서
개요
스몰토크 로고
스몰토크 로고
패러다임객체 지향
설계자아델 골드버그, 댄 잉걸스, 앨런 케이
개발자피터 도이치, 아델 골드버그, 댄 잉걸스, 테드 케일러, 앨런 케이, 다이애나 메리, 스콧 월리스, 제록스 파크
발표 연도1972년 (1969년부터 개발 시작)
최신 버전Smalltalk-80 version 2
최신 버전 발표일1980년
타이핑객체, 하지만 일부 구현에서는 강한 또는 동적
스코프어휘적 (정적)
프로그래밍 언어스몰토크
플랫폼제록스 알토 (74181)
구현체앰버
돌핀
젬스톤/S
GNU
파로
스몰토크/X
스퀵
Cuis
VA 스몰토크
비주얼웍스
영향을 받은 언어리스프
시뮬라
오일러
IMP
플래너
로고
스케치패드
ARPAnet
Burroughs B5000
영향을 준 언어애플스크립트
Common Lisp Object System
Dart
Dylan
Erlang
Etoys
Go
Groovy
Io
Ioke
Java
Lasso
Logtalk
Newspeak
NewtonScript
Object REXX
Objective-C
PHP 5
Python
Raku
Ruby
Scala
Scratch
Self
Swift
운영 체제크로스 플랫폼 (멀티 플랫폼)
웹사이트숨김
기타 정보
참조Stack Overflow Developer Survey 2017
Stack Overflow Developer Survey 2018

2. 역사

1970년대 제록스 파크(PARC)에서 앨런 케이, 댄 잉갤스, 테드 캘러, 아델 골드버그가 스몰토크를 개발했다.[7] 스몰토크는 마우스와 함께 최초로 GUI를 제공한 언어로, 매킨토시의 GUI와 루비, 오브젝티브-C, Self, 자바, 파이썬 등 여러 프로그래밍 언어에 영향을 주었다.[7]

스몰토크는 시뮬라를 기반으로 한 객체 지향 프로그래밍 언어 중 하나로,[18] Flavors,[19] CLOS, Objective-C, 자바, 파이썬, 루비[20] 등 많은 언어에 영향을 미쳤다. 또한 애자일 소프트웨어 개발, 신속한 애플리케이션 개발(RAD), 소프트웨어 디자인 패턴 개발에도 기여했다.[21]

1980년대 후반~1990년대 중반, ParcPlace Systems와 Digitalk가 스몰토크 환경을 판매했으나, 주류로 자리잡는 데는 실패했다. 1995년 두 회사는 합병하여 ObjectShare가 되었고, 1999년 Seagull Software에 인수되었다. Cincom은 VisualWorks를 인수하여 현재까지 스몰토크 환경을 판매하고 있다.[16]

Cincom, GemTalk, Instantiations 등이 스몰토크 환경을 판매 중이며, IBM은 자바 지원을 위해 VisualAge Smalltalk를 종료했다.[17] 스퀵은 One Laptop per Child (OLPC) 프로젝트 등에 사용되었고, GNU Smalltalk는 자유 소프트웨어 구현체이며, Pharo는 스퀵에서 분기되었다.

2016년 현재, Seaside와 AIDA/Web 웹 프레임워크 사용이 증가하고 있다.

스몰토크는 "-ect" 접미사와 운율을 맞추는 collect:, select:, inject:into: 등의 컬렉션 필터 연산자를 사용하는데, 이는 아를로 거스리의 "앨리스 레스토랑 학살" 구절에서 영감을 얻었다.[26]

2. 1. 개발 배경

1970년대 제록스 팔로알토 연구소(PARC)에서 앨런 케이 주도로 스몰토크가 개발되었다. 앨런 케이는 시뮬라, 리스프, 로고 등에서 영감을 받아 초기 스몰토크 버전을 설계했다.[8] 아델 골드버그는 문서화에, 댄 잉걸스는 초기 버전 구현에 기여했다.

최초 버전인 스몰토크-71은 메시지 전달 아이디어를 기반으로 한 프로그래밍 언어가 시뮬라에서 영감을 받아 "코드 한 페이지"에 구현될 수 있다는 내기에 앨런 케이가 며칠 만에 만들었다.[8] 이후 연구 작업에 사용된 스몰토크-72는 액터 모델 개발에 영향을 미쳤다.

성능 향상을 위해 실행 시맨틱스의 일부를 고정한 스몰토크-76은 클래스 라이브러리 코드 브라우저/편집기를 포함한 개발 환경을 갖추고 있었다. 스몰토크-80은 메타클래스를 추가하여 "모든 것이 객체" 패러다임을 유지했다.

스몰토크-80은 PARC 외부에서 사용할 수 있게 된 최초의 언어 변형이었다. 1981년에 Tektronix, 휴렛 팩커드, 애플 컴퓨터, DEC와 공유되었고,[9][10] 같은 해 8월호 Byte Magazine은 스몰토크-80에 할애되었고 그 아이디어를 많은 청중에게 전달했다. 스몰토크-80은 향후 모든 상업용 스몰토크 버전의 기반이 되었다.[11] 제록스는 1983년에 스몰토크-80 버전 2를 출시했다.[13]

스몰토크는 GUI, 마우스, WYSIWYG 등 현대 컴퓨팅 환경의 기반 기술 개발에 핵심적인 역할을 했다.

명칭비고
Smalltalk영어-71최초로 Smalltalk라는 이름을 사용한 언어이지만, 문법 등 일부 사양만 정해졌을 뿐 구현은 이루어지지 않았다.
Smalltalk영어-72메시징 기구에 의해 최초로 동작한 Smalltalk. 초기 GUI는 터틀 그래픽스로 표현된 윈도우나 메뉴 등 원시적인 구성이었으며, 언어 사양적으로도 현재의 Smalltalk와 다른 점이 많다.
Smalltalk영어-74Smalltalk-72에 비해, 처리계의 고속화, GUI 정비, 객체 지향 가상 메모리 (OOZE)를 도입한 버전.
Smalltalk영어-76현재의 메시지 식과 비슷한 문법(특히 키워드 메시지 식)을 도입한 Smalltalk. 메타클래스, 제1급 객체로서의 블록 등은 아직 없다.
Smalltalk영어-78Smalltalk-76을, 가반식의 시제품 「NoteTaker」에서 동작하도록 8086용으로 BitBlt 등을 재구축하여, 작게 정리한 버전.
Smalltalk영어-80현재 알려진 사양이 된 Smalltalk.
ObjectWorks영어Smalltalk영어-80을 일반에 보급하기 위해 개발·판매된 Smalltalk.
VisualWorks영어ObjectWorks를 이어받아 개발된 Smalltalk. Smalltalk 직계의 자손으로 현대에 이르는 Smalltalk 중 본가라고 할 수 있는 존재이다.
Apple Smalltalk영어Smalltalk영어-80 v1 (출시 전 버전)을 기반으로, XEROX사에 허가 및 지도를 받아 애플이 개발한 Smalltalk. 같은 시기에 DEC, 테크트로닉스, 휴렛 팩커드에서도 유사한 시도가 이루어졌다.
Squeak영어애플로 이적한 앨런 케이, 댄 인갈스 등에 의해 Apple Smalltalk영어을 기반으로 개발되었다. Smalltalk영어의 설계자에 의해 개발되었으며, 말하자면 분가라고 할 수 있는 존재이다.
Pharo영어Squeak에서 파생된 구현. 대담하고 실험적인 기능 추가 시도가 많지만, 2017년 현재 적극적이고 활발하게 개발이 진행되고 있는 Smalltalk 처리계 중 하나이다.


2. 2. 변천 과정

제록스 파크(PARC)에서 1970년대에 걸쳐 3세대(Smalltalk-72, 76, 80)를 거쳐 개발되었다. 초기에는 다이나북의 운영 체제 역할을 했지만, 앨런 케이의 연구 개발 그룹 이탈 등으로 인해 통합 프로그래밍 환경 "Smalltalk-80"으로 1983년에 출시되었다. 현재는 신콤[51]에서 VisualWorks|비주얼 워크스영어라는 이름으로 판매되고 있다.

※ 이 절은 [52][53]을 기반으로 작성되었습니다.

명칭비고
Smalltalk-71영어최초로 Smalltalk라는 이름을 사용한 언어이지만, 구현되지는 않았다.
Smalltalk-72영어메시징을 통해 최초로 동작한 Smalltalk. 초기 GUI는 원시적이었고, 현재의 Smalltalk와 다른 점이 많았다.
Smalltalk-74영어Smalltalk-72에 비해 처리 속도 향상, GUI 정비, 객체 지향 가상 메모리 (OOZE)를 도입했다.
Smalltalk-76영어현재와 비슷한 메시지 식(특히 키워드 메시지 식)을 도입했다. 메타클래스, 제1급 객체로서의 블록 등은 아직 없었다.
Smalltalk-78영어Smalltalk-76을 8086용으로 재구축하여 NoteTaker에서 동작하도록 한 버전이다.
Smalltalk-80영어현재 알려진 사양이 된 Smalltalk이다.
ObjectWorks영어Smalltalk-80을 일반에 보급하기 위해 개발, 판매되었다.
VisualWorks영어ObjectWorks를 이어받아 개발된 Smalltalk. 현대에 이르는 Smalltalk 중 본가라고 할 수 있다.
Apple Smalltalk영어Smalltalk-80 v1 (출시 전 버전)을 기반으로 애플이 개발한 Smalltalk. DEC, 테크트로닉스, 휴렛 팩커드에서도 유사한 시도가 있었다.
Squeak영어애플로 이적한 앨런 케이, 댄 잉걸스 등이 Apple Smalltalk영어을 기반으로 개발했다. Smalltalk 설계자에 의해 개발된 분가라고 할 수 있다.
Pharo영어Squeak에서 파생된 구현. 실험적인 기능 추가가 많지만, 2017년 현재 활발하게 개발되고 있는 Smalltalk 처리계 중 하나이다.


2. 3. 한국에서의 역사

1990년대 초, PC 통신과 잡지를 통해 스몰토크가 객체 지향 프로그래밍 언어로 소개되면서 주목받았다.[35][36] 한국소프트웨어산업협회(KOSA) 주도로 스몰토크 교육 과정이 개설되고, 기술 서적이 출간되는 등 확산 노력이 있었다. 하지만, 자바 등 다른 객체 지향 언어의 부상으로 인해 스몰토크의 사용 빈도는 높지 않다.

3. 특징

스몰토크는 다음과 같은 특징을 가지고 있다.


  • GUI 환경, 컴파일러, 파서, 가비지 컬렉터가 스몰토크 코드로 되어 있다.
  • 모든 소스 코드가 노출되어 있으며, 편집이 가능하다.
  • 순수 객체지향 언어이다. C++자바와는 달리 원시 자료형이 없고, 정수, 부동소수, 문자열, 블록을 포함한 모든 것이 객체이며 클래스가 있다.
  • 명령어 블록(무명 함수)을 제공한다.
  • 클래스가 객체이다. 대부분의 프로그래밍 언어에서는 클래스는 정적 영역에 정의되고, 객체는 런타임, 즉 동적 영역에 보관된다. 하지만 스몰토크의 객체들은 모든 상태가 스몰토크 가상기계 속에서 “이미지”라 불리는 구조로 표현·저장된다.
  • 이미지 기반이다. 소스코드는 소스파일에 보관되는 것이 아니라 이미지(메모리의 직렬화)로서 스냅샷 파일 속의 객체로서 보관된다.


스몰토크는 언어적 특징으로 인하여 독특한 개발 문화를 가지고 있는데, 그것은 현재의 개발 문화로도 전파되었다.

스몰토크에는 많은 종류가 있다.[7] ''스몰토크''라는 단어는 1980년에 처음으로 공개된 버전이자 호환되는 VM인 스몰토크-80 언어를 나타내는 데 종종 사용된다. 스몰토크 VM을 실행하는 최초의 하드웨어 환경은 제록스 알토 컴퓨터였다.

스몰토크는 앨런 케이가 제록스 팔로 알토 연구소(PARC)에서 주도한 연구 결과였다. 앨런 케이는 초기 스몰토크 버전 대부분을 설계했고, 아델 골드버그는 문서 대부분을 작성했으며, 댄 잉걸스는 초기 버전 대부분을 구현했다. 최초 버전인 스몰토크-71은 메시지 전달 아이디어를 기반으로 한 프로그래밍 언어가 시뮬라에서 영감을 받아 "코드 한 페이지"에 구현될 수 있다는 내기에 앨런 케이가 며칠 만에 만들었다.[8] 이후 연구 작업에 사용된 변형은 현재 스몰토크-72로 불리며 액터 모델 개발에 영향을 미쳤다. 스몰토크-72의 구문 및 실행 모델은 현대 스몰토크 변형과 매우 달랐다.

실행 시맨틱스의 일부 측면을 고정하여 성능을 향상한 후(실행의 시뮬라와 같은 클래스 상속 모델을 채택) 스몰토크-76이 만들어졌다. 이 시스템에는 클래스 라이브러리 코드 브라우저/편집기를 포함하여 현재 친숙한 도구 대부분을 갖춘 개발 환경이 있었다. 스몰토크-80은 "모든 것이 객체" (변수 제외) 패러다임을 유지하기 위해 메타클래스를 추가하여 개별 클래스, 심지어 정수 및 부울 값과 같은 기본 요소와 속성 및 동작을 연결했다 (예를 들어, 인스턴스를 생성하는 다른 방법을 지원하기 위해).

스몰토크-80은 PARC 외부에서 사용할 수 있게 된 최초의 언어 변형이었다. 1981년에 Tektronix, 휴렛 팩커드, 애플 컴퓨터, DEC와 자사 플랫폼에서 검토 및 디버깅을 위해 공유했다.[9][10] 1981년 8월호 Byte Magazine은 스몰토크-80에 할애되었고 그 아이디어를 많은 청중에게 전달했다. 스몰토크-80에 관한 여러 권의 책도 출판되었다. 스몰토크-80은 향후 모든 상업용 스몰토크 버전의 기반이 되었다.[11] 스몰토크-80 버전 1의 최종 릴리스는 1981년 11월이었다.[12] 제록스는 버전 1을 애플, DEC, HP 및 Tektronix에만 배포했지만, 이 회사들은 구축한 모든 시스템을 통해 제한 없이 재배포할 수 있었다. 이는 스몰토크의 광범위한 보급을 장려했다.[13] 그 후 1983년에 제록스는 스몰토크-80 버전 2를 출시했다. 이 버전은 제한적인 라이선스 하에 있지만 일반적으로 대중에게 공개되었다. 버전 1과 2는 철자 교정기와 같은 몇 가지 추가 기능이 있었지만 상당히 유사했다. 각 릴리스는 가상 이미지(객체 정의가 있는 플랫폼 독립적 파일)와 가상 머신 사양으로 구성되었다.[13]

ANSI 스몰토크는 1998년부터 표준 언어 참조로 사용되었다.[14] 현재 인기 있는 두 가지 스몰토크 구현 변형은 원래 스몰토크-80 이미지의 후손이다. 스퀵은 애플 스몰토크를 통해 스몰토크-80 버전 1에서 파생된 오픈 소스 구현이다. 비주얼웍스는 스몰토크-80 2.5와 ObjectWorks (모두 스몰토크를 시장에 출시하기 위해 설립된 제록스 PARC 스핀오프 회사인 ParcPlace Systems의 제품)를 통해 스몰토크-80 버전 2에서 파생되었다. 세대 간의 흥미로운 연결 고리로, 2001년에 바실리 비코프는 비주얼웍스 내에서 스몰토크-80을 실행하는 가상 머신인 호브스를 구현했다.[15] (댄 잉걸스는 나중에 스퀵으로 호브스를 포팅했다.)

1980년대 후반부터 1990년대 중반까지, 스몰토크 환경(지원, 교육 및 추가 기능 포함)은 캘리포니아에 기반을 둔 ParcPlace Systems와 Digitalk라는 두 경쟁 조직에서 판매했다. ParcPlace Systems는 Unix/Sun 마이크로시스템 시장에 집중하는 경향이 있었고, Digitalk는 Microsoft Windows 또는 IBM의 OS/2를 실행하는 Intel 기반 PC에 집중했다. 두 회사 모두 스몰토크의 상당한 메모리 요구 사항, 제한된 런타임 성능, SQL 기반 관계형 데이터베이스 서버에 대한 초기 지원 부족으로 인해 스몰토크를 주류로 만드는 데 어려움을 겪었다. ParcPlace Smalltalk의 높은 가격으로 인해 시장 침투가 중소 및 대규모 상업 조직으로 제한된 반면, Digitalk 제품은 처음에는 더 낮은 가격으로 더 많은 청중에게 도달하려고 했다. IBM은 처음에 Digitalk 제품을 지원했지만 1995년에 VisualAge/Smalltalk라는 스몰토크 제품으로 시장에 진입했다. Easel은 이 시점에 Windows 및 OS/2에서 Enfin을 도입했다. Enfin은 IBM이 IBM Smalltalk(나중에 VisualAge)를 개발하기 전에 IT 상점에 도입했기 때문에 유럽에서 훨씬 더 인기를 얻었다. Enfin은 나중에 Cincom Systems에 인수되었으며 현재 ObjectStudio라는 이름으로 판매되고 있으며, Cincom Smalltalk 제품군에 속한다.

1995년에 ParcPlace와 Digitalk는 ParcPlace-Digitalk로 합병된 다음 1997년에 ObjectShare로 브랜드가 변경되어 캘리포니아 어바인에 위치하게 되었다. ObjectShare (NASDAQ: OBJS)는 1999년까지 공개적으로 거래되었고, 상장 폐지 및 해산되었다. 합병된 회사는 자바에 대한 시장 포지셔닝에 대한 효과적인 대응책을 찾지 못했고, 1997년까지 소유주들은 사업 매각을 모색했다. 1999년에 Seagull Software는 ObjectShare Java 개발 연구소 (원래 Smalltalk/V 및 Visual Smalltalk 개발 팀 포함)를 인수했으며, VisualSmalltalk을 여전히 소유하고 있지만, 스몰토크 제품에 대한 전 세계 배포 권한은 ObjectShare에 남아 있었고, 이후 Cincom에 판매했다.[16] VisualWorks는 Cincom에 판매되었으며 현재 Cincom Smalltalk의 일부이다. Cincom은 1999년 이후 매년 여러 새로운 버전의 VisualWorks 및 ObjectStudio를 출시하면서 스몰토크를 강력하게 지원해 왔다.

Cincom, GemTalk 및 Instantiations는 스몰토크 환경을 계속 판매하고 있다. IBM은 1990년대 후반에 자바를 지원하기로 결정하고 VisualAge Smalltalk를 종료했으며, Instantiations, Inc.에서 지원하고 있다.[17] Instantiations는 제품 이름을 VA Smalltalk (VAST Platform)로 변경하고 매년 새로운 버전을 계속 출시하고 있다. 오픈 스퀵 구현은 많은 원래 스몰토크 커뮤니티를 포함한 활발한 개발자 커뮤니티를 보유하고 있으며, One Laptop per Child (OLPC) 프로젝트에서 Etoys 환경, 협업 응용 프로그램 개발을 위한 툴킷 Croquet Project, Open Cobalt 가상 세계 응용 프로그램을 제공하는 데 사용되었다. GNU Smalltalk는 GNU 프로젝트에서 스몰토크-80의 파생물을 자유 소프트웨어로 구현한 것이다. Pharo Smalltalk는 연구 및 상업 환경에서의 사용을 위해 지향된 스퀵의 분기이다.

2016년 현재, 모든 스몰토크 환경에서 확산된 중요한 개발은 복잡한 웹 응용 프로그램 구축을 단순화하기 위해 Seaside와 AIDA/Web이라는 두 가지 웹 프레임워크의 사용이 증가하고 있다는 것이다. Seaside는 Cincom, Gemstone 및 Instantiations가 이를 통합하고 확장하면서 상당한 시장의 관심을 받았다.

다음은 스몰토크-80 메서드에서 리터럴 값으로 작성할 수 있는 가장 일반적인 객체를 보여주는 예시이다.

숫자. 다음 목록은 몇 가지 가능성을 보여준다.

```smalltalk

42

  • 42

123.45

1.2345e2

2r10010010

16rA000

```

마지막 두 항목은 각각 이진수와 16진수이다. 'r' 앞의 숫자는 밑수 또는 기수이다. 밑수는 2의 거듭제곱일 필요는 없다. 예를 들어, 36rSMALLTALK는 80738163270632 십진수와 같은 유효한 숫자이다.

문자는 달러 기호로 시작하여 작성된다.

```smalltalk

$A

```

문자열은 작은따옴표로 묶인 문자 시퀀스이다.

```smalltalk

'Hello, world!'

```

문자열에 따옴표를 포함하려면 두 번째 따옴표를 사용하여 이스케이프한다.

```smalltalk

'I said, ''Hello, world!'' to them.'

```

큰따옴표는 문자열을 구분하는 작은따옴표가 있으므로 이스케이프할 필요가 없다.

```smalltalk

'I said, "Hello, world!" to them.'

```

두 개의 동일한 문자열 (문자열은 모든 문자가 동일하면 동일함)은 메모리의 다른 위치에 있는 다른 객체일 수 있다. 문자열 외에도 스몰토크에는 Symbol이라는 문자 시퀀스 객체 클래스가 있다. 심볼은 고유함을 보장한다. 즉, 다른 객체인 동일한 심볼은 두 개 이상 있을 수 없다. 그렇기 때문에 심볼은 비교하기가 매우 저렴하며 메시지 선택자 (아래 참조)와 같은 언어 아티팩트에 자주 사용된다.

심볼은 # 다음에 문자열 리터럴을 사용하여 작성된다. 예를 들어:

```smalltalk

#'foo'

```

시퀀스에 공백이나 구두점 문자가 포함되지 않은 경우, 다음과 같이 작성할 수도 있다.

```smalltalk

#foo

```

배열:

```smalltalk

#(1 2 3 4)

```

4개의 정수 배열을 정의한다.

```smalltalk

#((1 2 3 4) [1 2 3 4] 'four' 4.0 #four)

```

첫 번째 요소가 리터럴 배열이고, 두 번째 요소가 바이트 배열이고, 세 번째 요소가 문자열 'four' 등인 7개의 요소 배열을 정의한다.

많은 구현은 ByteArrays에 대해 다음과 같은 리터럴 구문을 지원한다.

```smalltalk

#[1 2 3 4]

```

4개의 정수의 ByteArray를 정의한다.

그리고 마지막으로, 블록 (익명 함수 리터럴)

```smalltalk

[... Some smalltalk code...]

```

다음은 두 개의 인수를 받아 "보다 작음"을 이해할 수 있는 모든 객체 (예: 숫자 및 문자열)를 비교한다.

```smalltalk

[:a :b| a < b]

```

블록은 텍스트에서 자세히 설명한다.

많은 스몰토크 방언은 다른 객체에 대한 추가 구문을 구현하지만, 위의 구문은 모든 언어에서 지원하는 필수적인 구문이다.

다음은 클래스 정의의 예시이다:[38]

```smalltalk

Object subclass: #MessagePublisher

instanceVariableNames: ''

classVariableNames: ''

poolDictionaries: ''

category: 'Smalltalk Examples'

```

대부분의 경우, 이러한 정의는 개발 환경에 의해 채워진다. 이것은 `Object` 클래스에게 `MessagePublisher`라는 이름의 서브클래스를 생성하라는 메시지임을 주목해야 한다. 즉, 클래스는 스몰토크에서 다른 객체와 마찬가지로 메시지를 받을 수 있으며 실행 시간에 동적으로 생성될 수 있는 일급 객체이다.

객체가 메시지를 수신하면, 메시지 이름과 일치하는 메서드가 호출된다. 다음 코드는 publish 메서드를 정의하며, 이 객체가 'publish' 메시지를 수신했을 때 어떤 일이 일어날지 정의한다.

```smalltalk

publish

Transcript show: 'Hello World!'

```

다음 메서드는 여러 인수를 받고 값을 반환하는 것을 보여준다.

```smalltalk

quadMultiply: i1 and: i2

"이 메서드는 주어진 숫자들을 서로 곱하고 그 결과를 4로 곱합니다."

| mul |

mul := i1 * i2.

^mul * 4

```

메서드의 이름은 `#quadMultiply:and:`이다. 반환 값은 `^` 연산자를 사용하여 지정한다.

객체는 메시지에 대한 응답으로 런타임에 어떤 메서드를 실행할지 동적으로 결정한다. 많은 언어에서는 컴파일 시간에 정적으로 결정될 수 있다 (때로는 항상).

스몰토크는 통합 개발 환경을 기반으로 한 최초의 시스템 중 하나이다. 코드 개발 및 그래픽, 음악과 같은 기타 활동을 지원하는 다양한 도구가 있다. 스몰토크는 윈도우, 아이콘, 메뉴, 포인터 (WIMP)의 현대적인 데스크톱 패러다임이 만들어진 최초의 시스템이었다. 포인터는 이미 발명되었지만, 스몰토크는 겹쳐진 윈도우와 팝업 메뉴를 구현한 최초의 시스템이었다. 여러 프로그래밍 도구가 있지만, 다음 다섯 가지 주요 도구를 설명한다. 도구의 이미지는 2024년 스퀵(Squeak) 시스템에서 가져왔다.

  • 브라우저: 주요 코드 보기 및 작성 도구
  • 워크스페이스: 표현식을 평가할 수 있는 텍스트 편집기
  • 트랜스크립트: 텍스트를 위한 출력 창으로, 많은 방언에서 워크스페이스이기도 하다.
  • 인스펙터
  • 알림/디버거: 처리되지 않은 예외에 대한 응답으로 열리는 창이며, 전체 디버거로 변환될 수 있다.


가장 널리 사용되는 프로그래밍 시스템은 정적 프로그램 코드(클래스 정의, 함수 또는 프로시저 형태)를 동적 또는 런타임 프로그램 상태(객체 또는 기타 형태의 프로그램 데이터)와 분리한다. 프로그램이 시작될 때 프로그램 코드를 로드하며, 이전 프로그램 상태는 구성 파일 또는 기타 데이터 소스에서 명시적으로 다시 생성되어야 한다. 프로그램(및 프로그래머)이 명시적으로 저장하지 않은 모든 설정은 재시작할 때마다 다시 설정해야 한다. 기존 프로그램은 파일을 저장하고 종료한 다음 다시 로드할 때마다 많은 유용한 문서 정보를 잃는다. 이로 인해 실행 취소 기록이나 커서 위치와 같은 세부 정보가 손실된다. 이미지 기반 시스템은 컴퓨터가 꺼지거나 OS가 업데이트되었다는 이유만으로 모든 것을 잃도록 강요하지 않는다.

그러나 많은 스몰토크 시스템은 프로그램 데이터(객체)와 코드(클래스)를 구별하지 않는다. 사실, 클래스는 객체이다. 따라서 대부분의 스몰토크 시스템은 전체 프로그램 상태(클래스 및 비 클래스 객체 모두 포함)를 이미지 파일에 저장한다. 그러면 이미지를 스몰토크 가상 머신에서 로드하여 스몰토크와 유사한 시스템을 이전 상태로 복원할 수 있다.[39] 이는 앨런 케이가 만들고 석사 논문에서 설명한 FLEX에서 영감을 받았다.[40]

스몰토크 이미지는 (재시작 가능한) 코어 덤프와 유사하며 오류 발생 시 프로그램 상태에 대한 전체 액세스를 통해 지연되거나 원격으로 디버깅하는 것과 같은 코어 덤프와 동일한 기능을 제공할 수 있다.[41]

Lisp와 같이 응용 프로그램 코드를 데이터 형태로 모델링하는 다른 언어에서도 이미지 기반 지속성을 자주 사용한다 (예: EMACS 참조). 이 지속성 방식은 모든 개발 정보(예: 프로그램의 구문 분석 트리)가 저장되어 디버깅을 용이하게 하므로 빠른 개발에 강력하다.

그러나 진정한 지속성 메커니즘으로서 심각한 단점도 있다. 우선, 개발자는 구현 세부 정보를 숨기고 런타임 환경에서 사용할 수 없도록 하고 싶어하는 경우가 많다. 합법성 및 유지 관리상의 이유로, 런타임에 누구나 프로그램을 수정할 수 있도록 허용하면 런타임 환경에서 소스 코드를 노출하지 않는 컴파일된 시스템에서는 불가능한 복잡성과 잠재적 오류가 불가피하게 발생한다. 또한 지속성 메커니즘은 사용하기 쉽지만 대부분의 다중 사용자 시스템에 필요한 진정한 지속성 기능을 갖추고 있지 않다. 가장 분명한 것은 여러 사용자가 동시에 동일한 데이터베이스에 액세스하여 트랜잭션을 수행하는 기능이다.

스몰토크-80의 모든 것은, 가능성을 피하도록 맞춤화되지 않는 한, 실행 중인 프로그램 내에서 수정할 수 있다. 이는 예를 들어, IDE를 시스템을 재시작하지 않고 실행 중인 상태에서 변경할 수 있음을 의미한다. 일부 구현에서는 언어의 구문이나 가비지 컬렉션 구현도 즉석에서 변경할 수 있다. 심지어 `true become: false` 구문도 스몰토크에서 유효하다. 단, 시연 목적 외에는 실행하지 않는 것이 좋다 ( 가상 머신, 이미지 기반 지속성, 백업 참조).

※ 이 절은 [52][53]을 기반으로 작성되었습니다.

명칭비고
Smalltalk영어-71최초로 Smalltalk라는 이름을 사용한 언어이지만, 문법 등 일부 사양만 정해졌을 뿐 구현은 이루어지지 않았다.
Smalltalk영어-72메시징 기구에 의해 최초로 동작한 Smalltalk. 초기 GUI는 터틀 그래픽스로 표현된 윈도우나 메뉴 등 원시적인 구성이었으며, 언어 사양적으로도 클래스가 함수이거나, 메서드 정의가 리더 매크로(또는 간이 파서 기술)와 같은 등, 현재의 Smalltalk와 다른 점이 많다.
Smalltalk영어-74Smalltalk-72에 비해, 처리계의 고속화, GUI 정비, 객체 지향 가상 메모리 (OOZE)를 도입한 버전.
Smalltalk영어-76현재의 메시지 식과 비슷한 문법(특히 키워드 메시지 식)을 도입한 Smalltalk. 메타클래스, 제1급 객체로서의 블록 등은 아직 없다.
Smalltalk영어-78Smalltalk-76을, 가반식의 시제품 「NoteTaker」에서 동작하도록 8086용으로 BitBlt 등을 재구축하여, 작게 정리한 버전.
Smalltalk영어-80현재 알려진 사양이 된 Smalltalk.
ObjectWorks영어Smalltalk영어-80을 일반에 보급하기 위해 개발·판매된 Smalltalk.
VisualWorks영어ObjectWorks를 이어받아 개발된 Smalltalk. Smalltalk 직계의 자손으로 현대에 이르는 Smalltalk 중 본가라고 할 수 있는 존재이다.
Apple Smalltalk영어Smalltalk영어-80 v1 (출시 전 버전)을 기반으로, XEROX사에 허가 및 지도를 받아 애플(Apple)이 개발한 Smalltalk. 같은 시기에 DEC, 테크트로닉스, 휴렛 팩커드에서도 유사한 시도가 이루어졌다.
Squeak영어애플로 이적한 앨런 케이, 댄 인갈스 등에 의해 Apple Smalltalk영어을 기반으로 개발되었다. Smalltalk영어의 설계자에 의해 개발되었으며, 말하자면 분가라고 할 수 있는 존재이다.
Pharo영어Squeak에서 파생된 구현. 대담하고 실험적인 기능 추가 시도가 많지만, 2017년 현재 적극적이고 활발하게 개발이 진행되고 있는 Smalltalk 처리계 중 하나이다.


4. 문법

스몰토크의 변수는 인스턴스 변수와 임시 변수가 대표적이다. 구현에 따라 비주얼워크스의 클래스 공유 변수 및 네임스페이스 공유 변수, 스퀵의 클래스 변수, 풀 변수, 전역 변수 등 다양한 종류가 존재한다.

임시 변수는 메서드 내에서 선언되며, 메서드 상단에 세로 막대(`|`)로 묶어 선언한다.

```smalltalk

| index |

```

위 코드는 `index`라는 임시 변수를 선언하며, 초기 값은 `nil`이다.

```smalltalk

| index vowels |

```

위와 같이 여러 변수를 함께 선언할 수 있다. 변수는 기본적으로 `nil`로 초기화되지만, 예외적으로 문자열 인덱스 변수는 널 문자, 바이트 배열은 0으로 초기화된다.

`:=` 연산자로 값을 할당한다.

```smalltalk

vowels := 'aeiou'

```

위 코드는 `'aeiou'` 문자열을 `vowels`에 할당한다. 초기 스몰토크는 할당 연산자로 왼쪽 화살표(←)를 썼으나, 현대에는 밑줄(_)이나 콜론-등호(:=)를 사용한다.

스몰토크에서 메시지는 핵심 구성 요소이며, 제어 구조조차 메시지 전송으로 구현된다. 동적 디스패치와 단일 디스패치를 사용한다.

메시지에는 단항, 이항, 키워드 메시지가 있다.

종류설명예시
단항 메시지인자 없이 메시지를 보낸다.`42 factorial`
이항 메시지주로 연산에 사용되며, 수신자와 인자가 하나이다.`3 + 4`
키워드 메시지하나 이상의 키워드와 인자를 사용하며, 키워드 뒤에 콜론(:)이 온다.`2 raisedTo: 4`, `hello indexOf: $o startingAt: 6`



메시지 우선순위는 단항, 이항, 키워드 순이며, 괄호로 변경 가능하다. 이항 메시지는 동일 우선순위를 갖고 왼쪽에서 오른쪽으로 평가된다.

예시:


  • `3 factorial + 4 factorial between: 10 and: 100`
  • `3 factorial` → 6
  • `4 factorial` → 24
  • `6 + 24` → 30
  • `30 between: 10 and: 100` → true
  • `(3 factorial + 4) factorial between: 10 and: 100`
  • `3 factorial + 4` → 10
  • `10 factorial` → 3628800
  • `3628800 between: 10 and: 100` → false


동일 수신자에 여러 메시지는 세미콜론(`;`)으로 캐스케이딩(cascading)할 수 있다.

```smalltalk

Window new

label: 'Hello';

open

```

스몰토크는 별도 제어문이 없으며, 객체에 메시지를 보내 조건부 실행과 반복을 구현한다.

조건부 실행은 `ifTrue:ifFalse:` 메시지를 Boolean 객체에 보낸다.

```smalltalk

result := a > b

ifTrue:[ 'greater' ]

ifFalse:[ 'less or equal' ]

```

`True`는 `ifTrue:ifFalse:`를 받으면 `trueAlternativeBlock`을, `False`는 `falseAlternativeBlock`을 실행한다.[37]

반복은 `#do:`, `#select:` 등 열거 메시지로 구현한다. `#select:`는 컬렉션 각 요소에 블록을 실행, 참을 반환하는 요소만 모아 새 컬렉션을 반환한다.

```smalltalk

| aString vowels |

aString := 'This is a string'.

vowels := aString select: [:aCharacter | aCharacter isVowel].

```

위 코드는 `'This is a string'`에서 모음만 골라 `vowels`에 저장한다.

```smalltalk

| rectangles aPoint collisions |

rectangles := OrderedCollection

with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)

with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).

aPoint := Point x: 20 y: 20.

collisions := rectangles select: [:aRect | aRect containsPoint: aPoint].

```

위 코드는 사각형 중 `aPoint`를 포함하는 사각형을 `collisions`에 저장한다.

이처럼 스몰토크는 객체에 메시지를 보내는 방식으로 유연한 프로그램 제어를 제공한다.

4. 1. 주석

주어진 원본 소스에는 주석에 대한 내용이 없으므로, 섹션 내용을 작성할 수 없습니다. (변경 없음)

4. 2. 상수 표현

스몰토크에서 상수 표현은 다음과 같이 나타낼 수 있다.

종류설명예시
정수`3`, `16r3` (16진수)
소수`3.4`
부동 소수점 수`3.4e5`
문자`$a`
문자열`abc`
심볼`#` 기호를 붙여 표현한다.`#abc`, `#*abc`
배열여러 종류의 자료형을 함께 담을 수 있다.`#( This #is $a 10 )`
바이트 배열`#[ 0 255 16r0 16r255 ]`
블록클로저를 형성할 수 있는 일급 객체이다.x + 1 ]`


4. 3. 변수

스몰토크에서 일반적으로 사용되는 변수에는 인스턴스 변수와 임시 변수 두 가지 종류가 있다. 다른 변수와 관련 용어는 특정 구현에 따라 다르다. 예를 들어, 비주얼워크스에는 클래스 공유 변수와 네임스페이스 공유 변수가 있는 반면, 스퀵 및 많은 다른 구현에는 클래스 변수, 풀 변수 및 전역 변수가 있다.

임시 변수는 메서드 내부에서 선언되는 변수이다. 메서드 맨 위에서 세로 막대로 묶인 이름으로 선언되며, 이름은 공백으로 구분된다. 예를 들면 다음과 같다.

```smalltalk

| index |

```

위 코드는 `index`라는 임시 변수를 선언하며, 이 변수는 처음에 `nil` 값을 포함한다.

여러 변수를 하나의 막대 세트 내에서 선언할 수 있다.

```smalltalk

| index vowels |

```

위 코드는 `index`와 `vowels`라는 두 개의 변수를 선언한다. 모든 변수는 초기화된다. 변수는 문자열의 인덱스 변수가 널 문자로 초기화되거나, 0으로 초기화되는 바이트 배열을 제외하고 `nil`로 초기화된다.

4. 4. 메시지 식

스몰토크에서 메시지는 가장 기본적인 언어 구성 요소이며, 심지어 제어 구조조차 메시지 전송으로 구현된다. 스몰토크는 기본적으로 동적 디스패치 및 단일 디스패치 전략을 사용한다.

메시지에는 세 가지 종류가 있다.

종류설명예시
단항 메시지수신자에게 인자 없이 메시지를 보낸다.`42 factorial` (42에 factorial 메시지를 보냄)
이항 메시지주로 수학 및 논리 연산에 사용되며, 수신자와 하나의 인자를 가진다.`3 + 4` (3에 + 메시지와 인자 4를 보냄)
키워드 메시지하나 이상의 키워드와 인자를 사용하여 메시지를 보낸다. 각 키워드 뒤에는 콜론(`:`)이 오고, 그 뒤에 인자가 온다.`2 raisedTo: 4` (2에 raisedTo: 메시지와 인자 4를 보냄), `hello world indexOf: $o startingAt: 6` (hello worldindexOf:startingAt: 메시지와 인자 $o, 6을 보냄)



메시지 우선순위는 다음과 같다.

1. 단항 메시지

2. 이항 메시지

3. 키워드 메시지

괄호를 사용하여 우선순위를 변경할 수 있다. 이항 메시지는 모두 동일한 우선순위를 가지며, 왼쪽에서 오른쪽으로 평가된다.

예시:


  • `3 factorial + 4 factorial between: 10 and: 100`
  • `3 factorial` 계산 (6)
  • `4 factorial` 계산 (24)
  • `6 + 24` 계산 (30)
  • `30 between: 10 and: 100` 계산 (true)
  • `(3 factorial + 4) factorial between: 10 and: 100`
  • `3 factorial + 4` 계산 (10)
  • `10 factorial` 계산 (3628800)
  • `3628800 between: 10 and: 100` 계산 (false)


동일한 수신자에게 여러 메시지를 보낼 때는 세미콜론(`;`)을 사용하여 캐스케이딩(cascading)할 수 있다.

```smalltalk

Window new

label: 'Hello';

open

4. 5. 제어문

스몰토크는 특별한 제어문 구문이 없으며, 객체에 메시지를 보내는 방식으로 조건부 실행과 반복을 구현한다.

조건부 실행은 `ifTrue:ifFalse:` 메시지를 사용하여 구현한다. 이 메시지는 Boolean 객체에 보내지며, 참(`True`) 또는 거짓(`False`) 여부에 따라 다른 코드 블록을 실행한다.

```smalltalk

result := a > b

ifTrue:[ 'greater' ]

ifFalse:[ 'less or equal' ]

```

`a > b`의 결과가 참이면 `'greater'` 문자열이, 거짓이면 `'less or equal'` 문자열이 `result`에 할당된다.

`True` 클래스는 `ifTrue:ifFalse:` 메시지를 받았을 때 `trueAlternativeBlock`을 실행하고, `False` 클래스는 `falseAlternativeBlock`을 실행하도록 구현되어 있다.[37]

반복문은 `#do:`, `#select:`, `#collect:`, `#detect:ifNone:` 등과 같은 열거 메시지를 사용하여 구현한다. 예를 들어, `#select:` 메시지는 컬렉션의 각 요소에 대해 주어진 블록을 실행하고, 블록이 참을 반환하는 요소들만 모아서 새로운 컬렉션을 반환한다.

```smalltalk

| aString vowels |

aString := 'This is a string'.

vowels := aString select: [:aCharacter | aCharacter isVowel].

```

위 코드는 `'This is a string'`에서 모음만을 골라내어 `vowels` 변수에 저장한다. `select:` 메시지는 `String` 객체에 보내지며, 각 문자에 대해 `[:aCharacter | aCharacter isVowel]` 블록을 실행한다. 이 블록은 문자가 모음이면 참을 반환하고, `#select:`는 참을 반환하는 문자들만 모아 새로운 문자열을 만든다.

```smalltalk

| rectangles aPoint collisions |

rectangles := OrderedCollection

with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)

with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).

aPoint := Point x: 20 y: 20.

collisions := rectangles select: [:aRect | aRect containsPoint: aPoint].

```

위의 코드는 사각형 중에서 `aPoint`를 포함하는 사각형을 `collisions`에 저장한다.

이처럼 스몰토크는 제어 구조를 위한 특별한 구문 대신, 객체에 메시지를 보내는 방식을 통해 유연하고 다양한 방식으로 프로그램을 제어할 수 있도록 한다.

4. 6. 클래스 등록

대부분의 경우, 클래스 정의는 개발 환경에 의해 채워진다. 다음은 클래스 정의의 한 예시이다:[38]

```smalltalk

Object subclass: #MessagePublisher

instanceVariableNames: ''

classVariableNames: ''

poolDictionaries: ''

category: 'Smalltalk Examples'

```

이는 `Object` 클래스에게 `MessagePublisher`라는 이름의 서브클래스를 생성하라는 메시지이다. 즉, 클래스는 스몰토크에서 다른 객체와 마찬가지로 메시지를 받을 수 있으며 실행 시간에 동적으로 생성될 수 있는 일급 객체이다.

4. 7. 메서드 등록

일반적으로 클래스 브라우저(시스템 브라우저)를 통해 GUI 환경에서 메서드를 등록한다.[1] 스몰토크 환경은 일종의 과 유사하며, 환경 내에서 마우스로 선택한 문자열을 스몰토크 소스 코드로 실행할 수 있다.[1] 예를 들어, 객체의 구조를 조사하려면 해당 객체에 `#browse` 또는 `#inspect` 셀렉터를 사용한 메시지 표현식을 작성하고 실행하면 된다.[1]

5. 통합 개발 환경 (IDE)

스몰토크는 통합 개발 환경을 기반으로 한 최초의 시스템 중 하나였다. 코드 개발 및 그래픽, 음악과 같은 기타 활동을 지원하는 다양한 도구가 있었다. 스몰토크는 윈도우, 아이콘, 메뉴, 포인터 (WIMP)의 현대적인 데스크톱 패러다임이 만들어진 최초의 시스템이었다.

GUI를 사용하지 않는 특수한 경우를 제외하고, 대부분의 스몰토크 환경에서는 다음과 같은 GUI 도구를 제공한다.


  • 클래스 브라우저(System Browser)
  • 트랜스크립트
  • 워크스페이스
  • 디버거/노티파이어
  • 인스펙터


스몰토크 개발은 이러한 도구를 사용하여 개발하는 것을 전제로 한다.

6. 구현

신콤(Cincom)의 VisualWorks영어는 Smalltalk-80 v2의 직계 후손이다.[46] 스퀵(Squeak)은 제록스 PARC의 Smalltalk-80 v1에서 파생된 오픈 소스 스몰토크이다.[46] 파로(Pharo)는 스퀵에서 파생된 오픈 소스 크로스 플랫폼 언어이다.[46] GNU 스몰토크(GNU Smalltalk)는 헤드리스(GUI 미지원) 스몰토크 구현체이다.[46] 돌핀 스몰토크(Dolphin Smalltalk)는 Object Arts에서 개발되었다.[46] Smalltalk/X는 제록스 PARC 스몰토크-80의 후손이다.[46] 비주얼에이지 스몰토크는 IBM에서 개발되었다.[46] 앰버 스몰토크(Amber Smalltalk)는 자바스크립트로 트랜스파일되는 스몰토크이다.[46] 퀴스 스몰토크(Cuis Smalltalk)는 스퀵에서 파생되었다.[46] 스트롱토크(Strongtalk)는 선택적으로 강력한 타입 지정을 제공한다.[47]

7. 영향 및 평가

스몰토크는 제록스 팔로 알토 연구소(PARC)에서 앨런 케이를 중심으로 개발된 객체 지향 프로그래밍 언어이다. 앨런 케이는 초기 버전 대부분을 설계했고, 아델 골드버그는 문서화, 댄 잉걸스는 구현을 담당했다.[8] 초기 버전인 스몰토크-71은 시뮬라의 영향을 받아 "코드 한 페이지"로 구현 가능하다는 내기에서 앨런 케이가 며칠 만에 만들었다고 한다.[8]

스몰토크는 액터 모델 개발에 영향을 미쳤으며, 스몰토크-76은 성능 향상을 위해 시뮬라와 같은 클래스 상속 모델을 채택했다. 이후 스몰토크-80은 메타클래스를 추가하여 "모든 것이 객체"라는 패러다임을 유지했다.

1981년, 스몰토크-80은 PARC 외부에서 사용할 수 있게 되었고, Tektronix, 휴렛 팩커드, 애플 컴퓨터, DEC 등에서 검토 및 디버깅을 위해 공유되었다.[9] 같은 해 8월, Byte Magazine은 스몰토크-80을 특집으로 다루면서 더 많은 사람들에게 알려지게 되었다.[11]

1998년, ANSI 스몰토크가 표준 언어 참조로 지정되었다.[14] 현재 널리 사용되는 스몰토크 구현은 스퀵과 비주얼웍스이다. 스퀵오픈 소스이며, 비주얼웍스는 상용 소프트웨어이다.

1980년대 후반부터 1990년대 중반까지 ParcPlace Systems와 Digitalk 두 회사가 스몰토크 환경을 판매했다. 두 회사 모두 스몰토크의 높은 메모리 요구 사항, 제한적인 런타임 성능, SQL 기반 관계형 데이터베이스 지원 부족 등으로 어려움을 겪었다. 1995년, 두 회사는 합병했지만, 1999년에 해산되었다.

현재 Cincom, GemTalk, Instantiations 등에서 스몰토크 환경을 판매하고 있다. GNU Smalltalk는 자유 소프트웨어로 구현된 스몰토크-80의 파생물이다.

스몰토크는 시뮬라를 기반으로 한 객체 지향 프로그래밍 언어 중 하나이며,[18] Objective-C, 자바, 파이썬, 루비 등 많은 언어에 영향을 미쳤다.[20] 또한, 애자일 소프트웨어 개발, 신속한 애플리케이션 개발(RAD), 소프트웨어 디자인 패턴 등에도 영향을 주었다.[21]

스몰토크는 현대 컴퓨팅 세계를 정의한 국방 고등 연구 계획국(ARPA)의 연구 프로그램에서 등장했다. 하이퍼텍스트, 그래픽 사용자 인터페이스(GUI), 멀티미디어, 마우스, 원격 현장감 등도 ARPA 연구원들에 의해 개발되었다.[22][23]

스몰토크 환경은 모델-뷰-컨트롤러(MVC) 패턴을 비롯한 객체 지향 소프트웨어 디자인 패턴을 개발한 최초의 환경 중 하나였다.[24] 또한, 그래픽 사용자 인터페이스(GUI), ''보는 대로 얻는 것'' (WYSIWYG) 사용자 인터페이스, 글꼴 편집기, 데스크톱 메타포어, 통합 개발 환경 등에도 영향을 미쳤다.[25]

스몰토크는 높은 메모리 요구량과 제한적인 런타임 성능 등의 단점도 있지만, 현대 개발 문화에 큰 영향을 미쳤다.

7. 1. 영향

스몰토크는 제록스 파크(PARC)에서 개발되어, 오브젝티브-C, 자바, 파이썬, 루비, 스칼라 등 후대의 많은 프로그래밍 언어에 큰 영향을 주었다.[18] 특히 객체 지향 프로그래밍 개념을 널리 확산시키는 데 중요한 역할을 했다.[21]

스몰토크는 그래픽 사용자 인터페이스(GUI), 마우스 사용, WYSIWYG 등 현대 컴퓨팅 환경의 기반이 되는 여러 기술을 개발하는 데에도 기여했다. 또한, 애자일 소프트웨어 개발 방법론, 신속한 애플리케이션 개발(RAD), 소프트웨어 디자인 패턴, 모델-뷰-컨트롤러(MVC) 패턴 등에도 영향을 주었다.[21]

''Smalltalk-80: The Language and its Implementation'' , 일명 "블루 북", Smalltalk 언어에 관한 최초의 책


스몰토크 환경은 객체 지향 소프트웨어 디자인 패턴을 개발한 최초의 환경 중 하나였다. 특히, 사용자 인터페이스 디자인에 사용되는 모델-뷰-컨트롤러(MVC) 패턴은 동일한 기본 데이터에 대해 여러 개의 일관된 뷰를 제공하여, 소프트웨어 개발 및 시뮬레이션, 게임 등 다양한 분야에 응용되었다.[24]

스몰토크는 그래픽 사용자 인터페이스(GUI)의 역사와 ''보는 대로 얻는 것'' (WYSIWYG) 사용자 인터페이스, 글꼴 편집기 및 UI 디자인을 위한 데스크톱 메타포어에 영향을 미쳤다. 스몰토크 환경과 함께 제공된 강력한 내장 디버깅 및 객체 검사 도구는 통합 개발 환경의 표준을 세웠다.[25]

제록스의 팔로알토 연구소(PARC)에서 1970년대에 약 10년에 걸쳐 3세대(Smalltalk-72, 76, 80)를 거쳐 정비되었다. 풍부하고 정비된 클래스 라이브러리는 특히 객체 지향 프로그래밍의 모범으로 여겨지며, 디자인 패턴의 보고라고 칭찬받을 정도로 세련되었다. 또한, 후대의 많은 객체 지향 프로그래밍 언어에 직간접적으로 막대한 영향을 미쳤다.

7. 2. 평가

클래스 Rectangle 인스턴스에 대한 Squeak 검사기


#demonstrate:programmingIn: MessageNotUnderstood 오류에 대한 Squeak 알리개


디버거에서 라이브 프로그래밍을 보여주는 Squeak 디버거


제록스 팔로 알토 연구소(PARC)에서 앨런 케이가 주도한 연구 결과로 탄생한 스몰토크는 객체 지향 프로그래밍 언어이다. 앨런 케이는 초기 스몰토크 버전 대부분을 설계했고, 아델 골드버그는 문서 작성, 댄 잉걸스는 초기 버전 구현을 담당했다. 최초 버전인 스몰토크-71은 시뮬라에서 영감을 받아 "코드 한 페이지"에 구현될 수 있다는 내기에서 앨런 케이가 며칠 만에 만들었다.[8]

스몰토크는 리팩토링, 유닛 테스트(xUnit), 익스트림 프로그래밍(XP), 디자인 패턴과 같은 현대 개발 문화에 큰 영향을 미쳤다.

스몰토크는 다음과 같은 장점과 단점을 가지고 있다.
장점

  • C++, 자바와 달리 원시 자료형 없이 모든 것이 객체인 순수 객체지향 언어이다.
  • GUI 환경, 컴파일러, 파서, 가비지 컬렉터가 스몰토크 코드로 되어 있어 모든 소스 코드가 노출되어 있고 편집 가능하다.
  • 무명 함수인 명령어 블록을 제공한다.
  • 클래스가 객체이며, 모든 상태가 "이미지"라는 구조로 표현, 저장된다.
  • 이미지 기반으로 소스코드가 소스파일이 아닌 이미지(메모리의 직렬화)로서 스냅샷 파일 속 객체로 보관된다.

단점

  • 스몰토크는 메모리 요구량이 크고, 런타임 성능이 제한적이며, SQL 기반 관계형 데이터베이스 서버에 대한 초기 지원이 부족했다.

8. 관련 단체 및 연구소


  • 유럽 스몰토크 사용자 그룹 (ESUG)
  • 뷰포인트 연구소 (VPRI)
  • 하소 플라토 연구소 (HPI)[1]

9. 결론

스몰토크는 객체 지향 프로그래밍의 선구자로서 현대 소프트웨어 개발에 큰 영향을 미쳤다. 앨런 케이가 제록스 팔로 알토 연구소(PARC)에서 주도한 연구 결과물인 스몰토크는 메시지 전달 개념과 "모든 것이 객체"라는 패러다임을 통해 프로그래밍 언어 설계에 혁신을 가져왔다.[8]

초기 버전인 스몰토크-71, 스몰토크-72를 거쳐 성능 향상을 위해 시뮬라의 클래스 상속 모델을 채택한 스몰토크-76이 개발되었다. 이후 메타클래스를 도입하여 객체 지향 개념을 더욱 확장한 스몰토크-80이 1981년에 공개되었고, 이는 상용 스몰토크 버전들의 기반이 되었다.[11][12]

1980년대 후반부터 1990년대 중반까지 ParcPlace Systems와 Digitalk 등의 회사들이 스몰토크 환경을 판매하며 경쟁했지만, 자바의 등장과 시장 변화로 인해 어려움을 겪었다. ParcPlace와 Digitalk는 합병 후 ObjectShare로 이름을 바꾸었으나 결국 해산되었다.[16]

현재는 Cincom, GemTalk, Instantiations 등의 회사들이 스몰토크 환경을 판매하고 있으며, 오픈 소스 구현체인 스퀵과 Pharo Smalltalk를 통해 그 명맥을 이어가고 있다. 특히, GNU Smalltalk는 GNU 프로젝트에서 스몰토크-80의 파생물을 자유 소프트웨어로 구현한 것이다. 또한, 웹 애플리케이션 개발 프레임워크인 Seaside와 AIDA/Web의 사용이 증가하면서 스몰토크는 새로운 활용 가능성을 보여주고 있다.

비록 현재 널리 사용되지는 않지만, 스몰토크의 철학과 기술은 여전히 중요한 가치를 지니며, 소프트웨어 개발 역사에 큰 발자취를 남겼다고 평가할 수 있다.

참조

[1] 웹사이트 Alto I Schematics http://bitsavers.org[...] 2016-07-21
[2] 웹사이트 History of Computers and Computing, Birth of the modern computer, Personal computer, Xerox Alto http://history-compu[...] 2016-04-19
[3] 웹사이트 E-Mail of 2003-07-23 http://www.purl.org/[...] 2003-07-23
[4] 웹사이트 ANSI Smalltalk Standard http://www.smalltalk[...] Smalltalk.org 2004
[5] 웹사이트 Stack Overflow Developer Survey 2017 https://insights.sta[...]
[6] 웹사이트 Stack Overflow Developer Survey 2018 https://insights.sta[...]
[7] 웹사이트 Versions http://www.smalltalk[...] Smalltalk.org
[8] 웹사이트 The Early History of Smalltalk http://gagne.homedns[...]
[9] 웹사이트 Tektronix invitation for First international Conference of Smalltalk-80 Implementors https://wirfs-brock.[...] 1981-08-27
[10] 웹사이트 Attendee list for First international Conference of Smalltalk-80 Implementors https://wirfs-brock.[...] 1981-09-24
[11] 뉴스 Introducing the Smalltalk Zoo https://computerhist[...] 2020-12-17
[12] 웹사이트 VI Release Notes https://wirfs-brock.[...] 1981-11-20
[13] 논문 The evolution of Smalltalk: from Smalltalk-72 through Squeak 2020
[14] 웹사이트 ANSI Smalltalk Standard http://www.smalltalk[...] Smalltalk.org
[15] 웹사이트 Hobbes http://wiki.cs.uiuc.[...]
[16] 웹사이트 History http://www.seagullso[...] Seagull Software
[17] 웹사이트 VisualAge Smalltalk Transition FAQ http://www.instantia[...]
[18] 문서
[19] 웹사이트 Flavors A non-hierarchical approach to object-oriented programming http://www.softwarep[...]
[20] 웹사이트 About Ruby https://www.ruby-lan[...]
[21] 웹사이트 Where Did Refactoring Come From? http://sourcemaking.[...]
[22] 웹사이트 DARPA – ARPA http://www.livingint[...]
[23] 웹사이트 Engelbart's Role in Early Computer Networking http://www.dougengel[...]
[24] 간행물 A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80 1988-08
[25] 웹사이트 Our Influence http://www.cincomsma[...]
[26] 웹사이트 Injected, Inspected, Detected, Infected, Neglected and Selected https://news.squeak.[...] 2024-04-15
[27] 웹사이트 Prototypes vs Classes (e-mail on Squeak list) http://lists.squeakf[...] 1998-10-10
[28] 문서
[29] 서적 Smalltalk-80 The Language Addison Wesley
[30] 논문 Metaclasses and Reflection in Smalltalk 1997-09-18
[31] 웹사이트 Seaside – A Multiple Control Flow Web Application Framework http://scg.unibe.ch/[...] Software Composition Group Institut fur Informatik und angewandte Mathematik Universitaat Bern, Switzerland
[32] 서적 Conference proceedings on Object-oriented programming systems, languages and applications 1989-10-01
[33] 간행물 Procedural Reflection in Programming Languages http://publications.[...] 1982-01-01
[34] 간행물 Efficient proxies in Smalltalk ACM 2011-08-23
[35] 간행물 Squeak: Une syntaxe minimaliste / Squeak: A minimalist syntax! https://rmod-files.l[...] 2001
[36] 웹사이트 Object-Oriented Design with Smalltalk — a Pure Object Language and its Environment https://scg.unibe.ch[...] 2024-01-15
[37] 서적 Smalltalk-80 The Language Addison Wesley
[38] 서적 Smalltalk-80 The Language Addison Wesley
[39] 웹사이트 Image-Based Persistence http://book.seaside.[...] 2013-12-17
[40] 간행물 FLEX – A flexible extendable language http://www.mprove.de[...]
[41] 웹사이트 Memory Image http://martinfowler.[...] 2013-12-17
[42] Citation opensmalltalk-vm https://github.com/O[...] Git hub 2020-11-03
[43] report Two Decades of Smalltalk VM Development: Live VM development through Simulation Tools; Virtual Machines and Language Implementations VMIL 2018, Boston, United States https://hal.archives[...] hal.archives-ouvertes.fr 2018
[44] 간행물 Back to the Future: the story of Squeak, a practical Smalltalk written in itself ACM Digital Library
[45] 웹사이트 Slang http://wiki.squeak.o[...] 2020-11-08
[46] 웹사이트 Two Decades of Smalltalk VM Development: Live VM development through Simulation Tools https://hal.archives[...] 2018-10-08
[47] 웹사이트 Strongtalk: A High-Performance Open Source Smalltalk With An Optional Type System http://www.strongtal[...] 2021-11-25
[48] 문서 http://web.cecs.pdx.[...]
[49] 서적 思考のための道具 異端の天才たちはコンピュータに何を求めたか? パーソナルメディア株式会社 1988-08-10
[50] 뉴스 https://www.infoq.co[...]
[51] 문서 Cincom
[52] 문서 http://smalltalk.cin[...]
[53] 문서 http://www.smalltalk[...]
[54] 문서 http://stephane.duca[...]
[55] 문서 http://worrydream.co[...]
[56] 문서 Reviving Smalltalk-78 http://freudenbergs.[...]
[57] 문서 http://www.cincomsma[...]
[58] 문서 http://smalltalk.cin[...]
[59] 문서 http://smalltalk.cin[...]
[60] 문서 http://www.pharo-pro[...]
[61] 문서 http://strongtalk.or[...]
[62] 문서 http://pleiad.cl/res[...]
[63] 문서 http://amber-lang.ne[...]
[64] 문서 http://www.object-ar[...]
[65] 문서 http://www.object-ar[...]
[66] 문서 https://sites.google[...]
[67] 문서 http://missionsoft.c[...]
[68] 문서 http://www.refactory[...]
[69] 웹사이트 Does IBM offer support for VisualAge Smalltalk? http://www.instantia[...] 2018-10-16
[70] 문서 http://www.objectcon[...]
[71] 문서 あるいは単に「セレクター」。
[72] URL https://www.gnu.org/[...]
[73] 웹사이트 Pharo source documentation http://magaloma.seas[...] 2018-09-03
[74] URL https://www.gnu.org/[...]
[75] 문서 ImplementationLimits7x.pdf(VisualWorks付録)
[76] URL https://www.gnu.org/[...]
[77] URL https://www.gnu.org/[...]
[78] 문서 他の言語でいうメソッドの多重定義はできない。
[79] 문서 accessor
[80] 서적 ケント・ベックの Smalltalk ベストプラクティス・パターン―シンプル・デザインへの宝石集



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com