셀프 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
셀프(Self)는 1986년 데이비드 엉거와 랜덜 스미스가 제록스 PARC에서 설계한 프로토타입 기반 객체 지향 프로그래밍 언어이다. 스몰토크의 객체 지향 프로그래밍 연구를 발전시키는 것을 목표로 개발되었으며, 1990년에 첫 공개 릴리스가 이루어졌다. 셀프는 프로토타입 기반 프로그래밍 방식을 사용하여 클래스와 객체 인스턴스 간의 이원성을 제거하고, 기존 객체의 복사본을 수정하여 새로운 객체를 생성하는 방식으로 객체를 정의한다. 이 언어는 뉴턴스크립트와 자바스크립트와 같은 언어에 영향을 미쳤으며, Just-in-time 컴파일 기술을 통해 우수한 성능을 제공한다.
더 읽어볼만한 페이지
- 1987년 개발된 프로그래밍 언어 - 펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다. - 1987년 개발된 프로그래밍 언어 - 스컴
SCUMM은 론 길버트가 루카스아츠 어드벤처 게임 개발을 위해 1987년에 만든 스크립팅 엔진으로, 동사-객체 인터페이스를 특징으로 하며, 여러 루카스아츠 어드벤처 게임과 휴몽거스 엔터테인먼트의 어린이용 게임 개발에 사용되어 다양한 재구현과 도구 개발을 촉진했다. - 프로토타입 기반 프로그래밍 언어 - 루아 (프로그래밍 언어)
루아는 C 언어와의 통합이 용이하고 작고 가벼운 확장 가능한 스크립트 언어로, 테이블 기반의 자료 구조를 통해 다양한 프로그래밍 패러다임을 지원하며 여러 분야에서 활용된다. - 프로토타입 기반 프로그래밍 언어 - LPC (프로그래밍 언어)
LPC는 1989년 Lars Pensjö가 개발한 객체 지향 프로그래밍 언어로, C와 유사한 문법을 가지며 MUD 게임 개발에 주로 사용된다. - 1987년 소프트웨어 - 윈도우 2.0
윈도우 2.0은 1987년 마이크로소프트가 출시한 16비트 GUI 기반 운영 환경으로, 창 겹치기, 바탕 화면 아이콘, 단축키 등의 기능 추가와 VGA 그래픽, EMS 메모리 지원을 통해 사용자 인터페이스와 기능이 향상되었으며, 마이크로소프트 워드, 엑셀 등의 응용 프로그램이 처음 실행된 운영체제이다. - 1987년 소프트웨어 - 마이크로소프트 파워포인트
마이크로소프트 파워포인트는 1987년 포어소트에서 개발되어 마이크로소프트에 인수된 후, 마이크로소프트 오피스 제품군으로 제공되면서 전 세계적으로 널리 사용되는 프레젠테이션 프로그램으로, 슬라이드 쇼 형식을 통해 텍스트, 이미지, 오디오, 비디오 등 다양한 멀티미디어 요소를 활용하여 정보를 시각적으로 전달하는 데 사용된다.
셀프 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
![]() | |
패러다임 | 객체 지향, 프로토타입 기반 |
최초 공개 | 1987년 |
설계자 | 데이비드 웅거, Randall Smith |
개발자 | 데이비드 웅거, Randall Smith, 스탠퍼드 대학교, 썬 마이크로시스템즈 |
최신 버전 | 2024.1 |
최신 버전 날짜 | 2024년 8월 28일 |
자료형 | 동적, 강타입 |
운영 체제 | 크로스 플랫폼: 유닉스 계열, macOS, Windows |
라이선스 | BSD 계열 |
웹사이트 | Self 공식 웹사이트 |
구현체 | Self |
영향을 받은 언어 | 스몰토크, APL |
영향을 준 언어 | NewtonScript, JavaScript, Io, Agora, Squeak, Lua, Factor, Rebol |
2. 역사
셀프는 1986년 데이비드 엉거와 랜들 스미스가 제록스 PARC에서 주로 설계했다. 이들은 스탠퍼드 대학교로 옮겨 언어 연구를 계속했으며, 1987년에 최초의 작동하는 셀프 컴파일러를 구축했다. 1990년에 첫 공개 릴리스가 이루어졌고, 이후 팀은 썬 마이크로시스템즈로 옮겨 연구를 계속했다. 1995년 버전 4.0 릴리스 이후 활동이 둔화되었으나, 2006년 이후 다시 개발이 진행되어 Mac OS X, 솔라리스, 리눅스용 버전이 출시되었다. 셀프는 뉴턴스크립트, 자바스크립트 등 여러 프로그래밍 언어에 영감을 주었다.
2. 1. 초기 역사
1986년, 데이비드 엉거와 랜들 스미스가 제록스 PARC에서 Self를 설계했다. Smalltalk-80이 출시되어 업계에서 진지하게 받아들여지기 시작하면서, 객체 지향 프로그래밍 프로그래밍 언어 연구를 더 발전시키는 것을 목표로 하였다. 이들은 스탠퍼드 대학교로 옮겨 Self 작업을 진행하여 1987년에 첫 번째 컴파일러를 완성했다. 이후 언어뿐만 아니라 Self 시스템 전체를 구축하는 데 주력했다.2. 2. 썬 마이크로시스템즈와 이후
1990년에 셀프가 처음으로 일반에 공개되었다.[4] 이듬해 셀프 개발팀은 썬 마이크로시스템즈로 옮겨 관련 작업을 계속하였다. 이후 몇 차례 릴리스가 이어졌으며, 1995년 버전 4.0 릴리스를 기점으로 오랜 휴지기에 들어갔다. 2006년에는 Mac OS X와 솔라리스용 버전 4.3이 출시되었다. 2010년에는 원래 팀의 일부와 독립 프로그래머들로 구성된 그룹이 Mac OS X와 리눅스용으로 새로운 버전 4.4[4]를 개발했으며, 이후 모든 버전도 마찬가지로 개발되었다. 2014년 1월에는 후속 버전인 4.5가 출시되었고,[5] 3년 뒤인 2017년 5월에는 버전 2017.1이 출시되었다.1990년에 개발된 IBM 티볼리 프레임워크의 분산 객체 시스템은 최하위 수준에서 셀프에서 영감을 받은 프로토타입 기반 객체 시스템이었다.
2. 3. 영향
Morphic 사용자 인터페이스 구축 환경은 원래 랜디 스미스와 존 말로니가 셀프 프로그래밍 언어를 위해 개발했다.[6] Morphic은 Squeak, 자바스크립트, 파이썬, Objective-C를 포함한 다른 주목할만한 프로그래밍 언어로 포팅되었다.셀프는 또한 해당 개념을 기반으로 한 여러 언어에 영감을 주었다. 아마도 가장 주목할 만한 것은 애플 뉴턴용 뉴턴스크립트와 모든 최신 브라우저에서 사용되는 자바스크립트일 것이다. 다른 예로는 Io, Lisaac, Agora가 있다. 1990년에 개발된 IBM 티볼리 프레임워크의 분산 객체 시스템은 최하위 수준에서 셀프에서 영감을 얻은 프로토타입 기반 객체 시스템이었다.
3. 프로토타입 기반 프로그래밍
Self는 클래스 기반 언어와 달리, 클래스와 객체 인스턴스 간의 이원성을 제거하고 프로토타입 객체를 복사하여 새로운 객체를 생성한다. 프로토타입은 객체 생성의 기반이 되는 객체이며, 동적인 객체 수정 및 위임을 통해 유연한 프로그래밍을 지원한다.
Self에서는 "클래스"에 기반한 객체의 "인스턴스"를 만드는 것이 아니라, 기존 객체를 복사하고 변경한다. 예를 들어, `Porsche 911`을 만들기 위해서는 다른 Vehicle 객체를 복사하고, "고속 운전" 메서드를 추가하면 된다. 복사 원본이 되는 객체를 "프로토타입"이라고 부른다.
3. 1. 클래스 기반 언어와의 비교
전통적인 클래스 기반 객체 지향 언어는 클래스와 객체 인스턴스라는 두 가지 개념을 기반으로 한다. 클래스는 객체의 특성과 동작을 정의하고, 객체 인스턴스는 클래스의 특정 구현이다. 예를 들어, `Vehicle` 클래스는 '이름' 속성과 '출근하기', '건설 자재 운반'과 같은 메서드를 가질 수 있다. `Bob's car`는 `Vehicle` 클래스의 인스턴스로, 'Bob's car'라는 이름을 가진다.하지만 이 방식은 취약한 기본 클래스 문제를 야기할 수 있다. 예를 들어, 스포츠카인 `Bob's car`는 건설 자재를 운반할 수 없지만, `Vehicle` 클래스는 이 기능을 포함하도록 모델링될 수 있다. 이를 해결하기 위해 `Sports Car`와 `Flatbed Truck`과 같은 서브클래스를 만들 수 있지만, 프로그램이 복잡해짐에 따라 클래스 계층을 올바르게 설계하기 어려워진다.
스몰토크와 같은 동적 언어는 클래스 변경을 통해 객체의 동작을 변경할 수 있지만, 이는 취약한 기본 클래스 문제의 또 다른 형태를 야기할 수 있다. C++와 같은 언어에서는 슈퍼클래스 변경이 미리 컴파일된 서브클래스 메서드를 손상시킬 수 있으며, 이는 취약한 바이너리 인터페이스 문제로 이어진다.
Self는 이러한 클래스와 객체 인스턴스 간의 이원성을 제거한다. Self에서는 클래스를 기반으로 객체 인스턴스를 생성하는 대신, 기존 객체를 복사하고 수정한다. 예를 들어, `Bob's car`는 `Vehicle` 객체를 복사한 후 '빠르게 운전' 메서드를 추가하여 생성할 수 있다. 복사의 기본이 되는 객체를 ''프로토타입''이라고 한다. 이 방식은 동적성을 단순화한다고 주장된다. 기존 객체가 부적절한 모델임이 밝혀지면 프로그래머는 수정된 객체를 만들어 사용할 수 있으며, 기존 객체를 사용하는 코드는 변경되지 않는다.
3. 2. 프로토타입의 장점
객체와 클래스 집합이 먼 미래에 어떤 특성을 가질지 확실하게 예측할 수 없다면 클래스 계층 구조를 제대로 설계할 수 없다. 스몰토크와 같은 초기 객체 지향 언어에 대한 경험은 이러한 문제가 반복적으로 발생함을 보여주었다. 시스템은 어느 시점까지 커지고 나서 매우 경직되는 경향이 있으며, 프로그래머의 코드 깊숙이 있는 기본 클래스가 단순히 "잘못된" 것으로 변했다. 원래 클래스를 쉽게 변경할 수 있는 방법이 없으면 심각한 문제가 발생할 수 있었다.[1]Self에서는 "클래스"를 기반으로 하는 객체의 "인스턴스"를 갖는 대신, 기존 객체의 복사본을 만들고 변경한다. 따라서 `Bob's car`는 기존 "Vehicle" 객체의 복사본을 만든 다음, ''빠르게 운전'' 메서드를 추가하여 포르쉐 911이라는 사실을 모델링하여 생성된다. 복사본을 만드는 데 주로 사용되는 기본 객체를 ''프로토타입''이라고 한다. 이 기술은 동적성을 크게 단순화한다고 주장된다. 기존 객체(또는 객체 집합)가 부적절한 모델임이 밝혀지면 프로그래머는 올바른 동작을 가진 수정된 객체를 간단히 만들고 대신 사용할 수 있다. 기존 객체를 사용하는 코드는 변경되지 않는다.[1]
4. 언어적 특징
셀프(Self) 객체는 슬롯의 집합으로 구성되며, 슬롯은 값을 반환하거나 설정하는 접근자 메서드 역할을 한다. 필드와 메서드는 구분되지 않으며, 모든 것이 슬롯으로 표현된다. 스몰토크(Smalltalk)와 유사한 문법을 사용하며, 단항, 이항, 키워드 메시지를 통해 슬롯에 접근한다. 'self'로 보내는 메시지가 많아 'self'는 생략할 수 있다(이것이 언어 이름의 유래이다).
4. 1. 기본 문법
셀프(Self) 객체는 "슬롯"의 모음이다. 슬롯은 값을 반환하는 접근자 메서드이며, 슬롯 이름 뒤에 콜론(:)을 붙이면 값을 설정한다. 예를 들어 "name"이라는 슬롯이 있는 경우, `myPerson name`는 name의 값을 반환하고, `myPerson name:'foo'`는 값을 설정한다.셀프는 스몰토크(Smalltalk)와 마찬가지로 흐름 제어 및 기타 작업을 위해 ''블록''을 사용한다. 메서드는 슬롯(인수와 임시 값을 위해 사용) 외에도 코드를 포함하는 객체이며, 숫자와 같이 다른 객체처럼 셀프 슬롯에 배치할 수 있다. 구문은 어느 경우든 동일하게 유지된다.
셀프에는 필드와 메서드 간의 구별이 없다. 모든 것이 슬롯이다. 메시지를 통해 슬롯에 접근하는 것이 셀프 구문의 대부분을 차지하기 때문에, 많은 메시지가 "self"로 전송되며, "self"는 생략할 수 있다(따라서 이름이 "셀프"임).
슬롯에 접근하는 구문은 스몰토크(Smalltalk)와 유사하다. 세 가지 종류의 메시지를 사용할 수 있다.
- 단항 : `''수신자'' 슬롯_이름`
- 이항 : `''수신자'' + ''인수''`
- 키워드 : `''수신자'' 키워드: ''인수1'' With: ''인수2''`
모든 메시지는 결과를 반환하므로 수신자(있는 경우)와 인수는 다른 메시지의 결과일 수 있다. 메시지 뒤에 마침표(.)를 붙이면 셀프(Self)는 반환된 값을 버린다. 예를 들어:
`'Hello, World!' print.`
이것은 "Hello, World!" 프로그램의 셀프 버전이다. ` '` 구문은 문자열 리터럴 객체를 나타낸다. 다른 리터럴로는 숫자, 블록 및 일반 객체가 있다.
괄호를 사용하여 그룹화를 강제할 수 있다. 명시적인 그룹화가 없으면 단항 메시지가 가장 높은 우선 순위를 가지며, 이항 메시지가 그 다음(왼쪽에서 오른쪽으로 그룹화), 키워드가 가장 낮은 우선 순위를 갖는다. 키워드를 할당에 사용하면 표현식에 키워드 메시지도 포함될 때 추가 괄호가 필요하므로, 셀프는 키워드 메시지 선택자의 첫 번째 부분이 소문자로 시작하고 후속 부분이 대문자로 시작하도록 요구하여 이를 피한다.
`valid: base bottom between: ligature bottom + height And: base top / scale factor.`
는 모호하지 않게 구문 분석될 수 있으며, 다음과 동일한 의미를 가진다.
`valid: ((base bottom) between: ((ligature bottom) + height) And: ((base top) / (scale factor))).`
스몰토크-80(Smalltalk-80)에서 동일한 표현식은 다음과 같이 작성된다.
`valid := self base bottom between: self ligature bottom + self height and: self base top / self scale factor.`
4. 2. 객체 생성
새로운 객체는 기존 객체에 `copy` 메시지를 보내 복사하여 생성한다. 예를 들어, `labelWidget` 객체의 복사본을 만들려면 다음과 같이 작성한다.```smalltalk
labelWidget copy
```
복사된 객체는 복사본의 "label" 슬롯에 "Hello, World" 메시지를 저장하는 것과 같이 수정할 수 있다. 이를 코드로 표현하면 다음과 같다.
```smalltalk
labelWidget copy label: 'Hello, World!'.
```
이 코드는 `labelWidget` 객체를 복사한 후, 복사본의 `label` 슬롯에 'Hello, World!' 값을 설정한다.
4. 3. 위임
셀프에서 객체는 자체적으로 이해할 수 없는 메시지를 부모 객체에 위임할 수 있다. 이는 슬롯에 부모 객체를 지정함으로써 이루어지며, 슬롯 이름 뒤에 별표(*)를 붙여 부모 포인터로 표시한다. 이를 통해 상속, 네임스페이스, 렉시컬 스코핑과 같은 기능을 구현할 수 있다.예를 들어, 간단한 회계 애플리케이션에서 사용되는 "은행 계좌" 객체를 생각해 보자. 이 객체는 "입금" 및 "출금"과 같은 메서드를 가질 수 있다. 일반적인 방법은 특성 객체를 만들어 "은행 계좌" 객체가 이를 부모로 갖게 하는 것이다. 이렇게 하면 여러 "은행 계좌" 객체를 만들어도 루트 객체의 슬롯을 변경하여 모든 객체의 동작을 변경할 수 있다.
```smalltalk
myObject parent: someOtherObject.
```
위 코드는 'parent*' 슬롯의 값을 변경하여 런타임에 myObject의 "클래스"를 변경한다. 상속 또는 렉시컬 스코핑과 달리 위임 객체는 런타임에 수정할 수 있다는 점이 특징이다.
4. 4. 슬롯 추가
셀프(Self) 객체는 추가적인 슬롯을 포함하도록 수정할 수 있다. 이는 그래픽 프로그래밍 환경을 사용하거나, 원시 연산자 '_AddSlots:'를 사용하여 수행할 수 있다. 원시 연산자는 일반적인 키워드 메시지와 동일한 구문을 갖지만, 이름이 밑줄 문자로 시작한다. `_AddSlots` 원시 연산자는 초기 구현에서 남은 것이므로 사용을 피해야 한다. 그러나, 코드를 더 짧게 만들 수 있기 때문에 예시에서 사용되었다.5. 환경
셀프는 초기 스몰토크 시스템과 유사한 가상 머신을 기반으로 작동한다. 즉, 프로그램은 독립 실행형 개체가 아니라 C와 같은 언어처럼 실행하려면 전체 메모리 환경이 필요하다. 이를 위해 응용 프로그램을 '스냅샷' 또는 '시스템 이미지'로 알려진 저장된 메모리 덩어리로 배포해야 한다. 이 접근 방식은 이미지가 때때로 크고 다루기 어렵다는 단점이 있지만, 이미지 디버깅은 런타임 상태를 검사하고 수정하기가 더 쉽기 때문에 기존 프로그램 디버깅보다 더 간단한 경우가 많다. (소스 기반 개발과 이미지 기반 개발의 차이는 클래스 기반과 프로토타입 객체 지향 프로그래밍의 차이와 유사하다.)
또한 환경은 시스템 내 객체의 빠르고 지속적인 변경에 맞춰져 있다. "클래스" 설계를 리팩토링하는 것은 기존 조상에서 새 클래스로 메서드를 드래그하는 것만큼 간단하다. 테스트 메서드와 같은 간단한 작업은 복사본을 만들고, 해당 메서드를 복사본으로 드래그한 다음 변경하는 방식으로 처리할 수 있다. 기존 시스템과 달리 변경된 객체만 새 코드를 가지고 있으며, 테스트를 위해 아무것도 다시 빌드할 필요가 없다. 메서드가 작동하면 조상으로 다시 드래그하면 된다. Self 환경은 강력한 디버깅 도구를 제공하는데, 프로그램을 임의의 시점에서 중단하고, 코드나 값을 변경한 다음, 실행을 재개하는 것이 가능하다.[1]
6. 성능
셀프 가상 머신은 Just-in-time 컴파일 기술을 통해 최적화된 C 속도의 약 절반에 해당하는 성능을 달성했다.[7] 이 기술은 셀프 연구에서 개척하고 개선되어 고급 언어가 뛰어난 성능을 발휘하도록 만들었다. 셀프의 VM은 런타임 시 인터프리터로 실행하다가, 자주 전송되는 메시지나 반복 실행되는 코드를 감지(프로파일링)하여 컴파일하는 adaptive compilation 기술을 사용한다. 이 기술은 셀프 처리계에서 처음 구현되었으며, 후에 Java의 HotSpot에서 채용되었다.
6. 1. 가비지 컬렉션
가비지 컬렉션을 위한 셀프의 세대별 가비지 컬렉션은 객체를 나이별로 분리하여 사용한다. 메모리 관리 시스템을 사용하여 페이지 쓰기를 기록함으로써 쓰기 장벽을 유지할 수 있다. 이 기술은 뛰어난 성능을 제공하지만, 어느 정도 시간이 지나면 전체 가비지 컬렉션이 발생하여 상당한 시간이 소요될 수 있다.6. 2. 최적화
런타임 시스템은 선택적으로 호출 구조를 평탄화한다. 이는 자체적으로 약간의 속도 향상을 제공하지만, 형식 정보의 광범위한 캐싱과 서로 다른 호출자 형식을 위한 여러 버전의 코드를 허용한다. 이를 통해 많은 메서드 조회를 수행할 필요가 없어지고 조건 분기문과 하드 코딩된 호출을 삽입할 수 있다. 종종 언어 수준에서 일반성을 잃지 않으면서 C와 유사한 성능을 제공하지만, 완전한 가비지 수집 시스템에서 작동한다.[8]실행 시 환경은 선택적으로 호출 구조를 평탄화하여 성능 향상을 꾀하고 있다. 이를 위해서는 타입 정보나 서로 다른 타입에 대응하는 복수의 실행 코드를 캐시 해 둘 필요가 있지만, 시간이 걸리는 메서드 탐색 횟수를 줄이거나, 메서드 탐색을 조건 분기나 하드 코딩된 호출로 대체할 수 있다. 이로 인해 언어로서의 일반성을 유지하며 가비지 컬렉션을 갖추면서 C언어에 가까운 성능을 달성하고 있다.
참조
[1]
학회
Self
2007
[2]
웹사이트
Self "Mandarin" 2017.1
https://github.com/r[...]
2017-05-24
[3]
학회
self includes: Smalltalk
1996
[4]
웹사이트
Self 4.4 released
https://blog.selflan[...]
2010-07-16
[5]
웹사이트
Self Mallard (4.5.0) released
http://blog.selflang[...]
2014-01-12
[6]
학회
Directness and liveness in the morphic user interface construction environment
http://bibliography.[...]
1995
[7]
논문
Design and Implementation of Pep, a Java Just-In-Time Translator
http://research.sun.[...]
1997-03
[8]
학위논문
The Design and Implementation of the SELF Compiler, an Optimizing Compiler for Object-Oriented Programming Languages
https://www.cs.tufts[...]
Stanford University
1992-03-13
[9]
웹인용
Self "Mandarin" 2017.1
https://blog.selflan[...]
2017-05-24
[10]
저널
self includes: Smalltalk
1996
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com