셀프(프로그래밍 언어)
Self (programming language)![]() | |
패러다임 | 오브젝트 지향(오브젝트 기반) |
---|---|
설계자 | 데이비드 언가, 랜달 스미스 |
개발자 | David Ungar, Randal Smith, 스탠포드 대학교, Sun Microsystems |
처음 등장한 | 전 |
안정된 릴리스 | 만다린 2017.1 / 2017년 5월 , 전( |
타이핑 분야 | 다이내믹, 스트롱 |
면허증. | BSD라이크 라이선스 |
웹 사이트 | www |
주요 구현 | |
자신 | |
영향을 받다 | |
Smalltalk, APL[1] | |
영향받은 | |
NewtonScript, JavaScript, Io, Agora, Squak, Lua, Factor, REBOL |
Self는 프로토타입 개념을 기반으로 하는 객체 지향 프로그래밍 언어입니다.Self는 Smalltalk의 방언으로 시작되었으며 동적으로 타이핑되고 JIT(Just-In-Time Compilation)와 객체에 대한 프로토타입 기반 접근 방식을 사용합니다. 1980년대와 1990년대에 언어 디자인을 위한 실험적인 테스트 시스템으로 처음 사용되었습니다.2006년에는 Self가 완전히 Self로 작성된 Self 가상 머신인 Klein 프로젝트의 일부로 개발되고 있었습니다.최신 버전은 2017년 [2]5월에 출시된 2017.1입니다.
Self 연구에서는 Just-in-Time 컴파일 기법이 몇 가지 개척되어 개선되었습니다.이는 매우 높은 수준의 객체 지향 언어가 최적화된 C의 절반 속도로 수행될 수 있도록 하기 위해서 필요했기 때문입니다.Self 개발의 대부분은 Sun Microsystems에서 이루어졌으며, 그들이 개발한 기술은 나중에 Java의 HotSpot 가상 머신에 도입되었습니다.
한때 Self에서 Smalltalk 버전이 구현되었습니다.JIT를 사용할 수 있었기 때문에,[3] 이것도 매우 좋은 퍼포먼스를 발휘했습니다.
역사
셀프는 1986년 Xerox PARC에서 일하던 David Ungar와 Randall Smith에 의해 주로 디자인되었다.연구소에서 Smalltalk-80이 출시되고 업계에서 진지하게 받아들여지기 시작한 이후, 그들의 목표는 객체 지향 프로그래밍 언어 연구의 최첨단 기술을 발전시키는 것이었다.그들은 스탠포드 대학으로 옮겨서 언어에 대한 연구를 계속했고, 1987년에 처음으로 작동하는 셀프 컴파일러를 만들었다.그 시점에서는 언어뿐만 아니라 Self를 위해 전체 시스템을 도입하는 시도로 초점이 바뀌었습니다.
첫 공개는 1990년이었고, 그 다음 해 팀은 Sun Microsystems로 옮겨서 언어 연구를 계속했습니다.이후 몇 가지 새로운 릴리스가 1995년 4.0 버전에서 거의 휴면 상태가 될 때까지 계속되었습니다.4.3 버전은 2006년에 출시되었으며 Mac OS X 및 Solaris에서 실행되었습니다.2010년의 [4]새로운 릴리스 버전 4.4는 오리지널 팀과 독립 프로그래머로 구성된 그룹에 의해 개발되었으며 다음 버전과 마찬가지로 Mac OS X 및 Linux에서 사용할 수 있습니다.후속 버전 4.5는 2014년 [5]1월에 출시되었고, 3년 후인 2017년 5월에 버전 2017.1이 출시되었습니다.
Self는 또한 그 컨셉을 바탕으로 많은 언어에 영감을 주었다.아마도 가장 주목할 만한 것은 애플 뉴턴용 뉴턴스크립트와 자바스크립트가 모든 현대 브라우저에 사용된 것이다.다른 예로는 Io, Lisaac 및 Agora가 있습니다.1990년에 개발된 IBM Tivoli Framework의 분산 객체 시스템은 Self에서 영감을 얻은 프로토타입 기반 객체 시스템입니다.
프로토타입 기반 프로그래밍 언어
전통적인 클래스 기반 OOO 언어는 뿌리 깊은 이중성을 기반으로 합니다.
예를 들어, 의 오브젝트가Vehicle
class는 회사까지 운전하여 건설 자재를 전달하는 등 다양한 작업을 수행할 수 있는 이름과 능력을 가지고 있습니다. Bob's car
는 클래스의 특정 오브젝트(클래스)입니다.Vehicle
'밥의 차'라는 이름으로요이론상으로는 다음 사람에게 메시지를 보낼 수 있다.Bob's car
건축자재를 전달하라고 하는 것.
이 예는 이 접근법의 문제점 중 하나를 보여줍니다: 우연히 스포츠카인 Bob의 자동차는 (의미 있는 의미에서) 건축 자재를 운반하고 전달할 수 없지만, 이것은 다음과 같은 능력입니다.Vehicle
는 다음과 같이 모델링됩니다.보다 유용한 모델은 서브클래싱을 사용하여 전문화를 작성함으로써 발생합니다.Vehicle
예를 들어,Sports Car
그리고.Flatbed Truck
. 클래스의 객체만Flatbed Truck
건설 자재를 전달할 수 있는 메커니즘을 제공해야 하고, 스포츠카는 그러한 종류의 작업에 적합하지 않은 경우, 단지 빨리 운전하기만 하면 된다.그러나 이 보다 심층적인 모델에서는 설계 시 더 많은 통찰력을 필요로 합니다. 이러한 통찰력은 문제가 발생할 때에만 드러날 수 있습니다.
이 문제는 프로토타입의 동기가 되는 요인 중 하나입니다.오브젝트나 클래스의 집합이 먼 장래에 어떤 품질을 갖게 될지를 확실히 예측할 수 없으면 클래스 계층을 적절히 설계할 수 없습니다.대부분의 경우 프로그램은 결국 추가적인 행동을 필요로 하며, 다른 방식으로 [citation needed]물체를 분류하기 위해 시스템 섹션을 재설계(또는 리팩터링)해야 합니다.Smalltalk와 같은 초기 OO언어에 대한 경험은 이러한 문제가 계속해서 발생했음을 보여주었다.프로그래머의 코드 아래에 있는 기본 클래스가 단순히 "잘못된" 것으로 성장함에 따라 시스템은 어느 정도 성장한 후 매우 경직되는 경향이 있습니다.원반을 쉽게 바꿀 수 있는 방법이 없다면,[citation needed] 심각한 문제가 발생할 수 있다.
Smalltalk와 같은 동적 언어는 클래스 내에서 잘 알려진 메서드를 통해 이러한 종류의 변경을 허용합니다. 클래스를 변경하면 클래스를 기반으로 하는 객체의 동작이 변경됩니다.그러나 이러한 변경은 매우 신중하게 수행해야 합니다.이는 같은 클래스에 기반한 다른 오브젝트가 이 "잘못된" 동작을 예상할 수 있기 때문입니다. "잘못된" 동작은 종종 컨텍스트에 의존합니다.(이것은 취약한 기본 클래스 문제의 한 형태입니다).또한 서브클래스가 슈퍼클래스와 별도로 컴파일될 수 있는 C++와 같은 언어에서는 슈퍼클래스로의 변경은 실제로 사전 컴파일된 서브클래스 메서드를 파괴할 수 있습니다.(이것은 취약한 베이스 클래스 문제의 다른 형태이며 취약한 바이너리 인터페이스 문제의 한 형태이기도 합니다.)
Self 및 기타 프로토타입 기반 언어에서는 클래스와 객체 인스턴스 간의 이중성이 제거됩니다.
Self에서는 어떤 "클래스"에 기반한 객체의 "인스턴스"를 갖는 대신 기존 객체의 복사본을 만들어 변경합니다.그렇게Bob's car
기존 "Vehicle" 객체의 복사본을 만든 다음 빠른 주행 방법을 추가하여 포르쉐 911이라는 사실을 모델링합니다.주로 복사본을 만드는 데 사용되는 기본 개체를 프로토타입이라고 합니다.이 기술은 역동성을 크게 단순화한다고 주장되고 있다.기존 객체(또는 객체 세트)가 부적절한 모델임이 판명되면 프로그래머는 단순히 올바른 동작으로 수정된 객체를 생성하여 대신 사용할 수 있습니다.기존 객체를 사용하는 코드는 변경되지 않습니다.
묘사
셀프 오브젝트는 "슬롯"의 집합입니다.슬롯은 값을 반환하는 액세스 방식이며 슬롯 이름 뒤에 콜론을 배치하면 값이 설정됩니다.예를 들어, "name"이라는 이름의 슬롯의 경우,
마이 퍼슨 이름.
이름 값을 반환하고,
마이 퍼슨 이름:'푸'
세팅합니다.
Self는 Smalltalk와 마찬가지로 흐름 제어 및 기타 업무를 위해 블록을 사용합니다.메서드는 슬롯(인수 및 임시 값에 사용) 외에 코드를 포함하는 개체로, 다른 개체와 마찬가지로 Self 슬롯(예: 숫자)에 배치할 수 있습니다.어느 경우든 구문은 동일합니다.
Self에서는 필드와 메서드를 구분하지 않습니다.모두 슬롯입니다.메시지를 통해 슬롯에 액세스하는 것은 Self에서 구문의 대부분을 구성하기 때문에 많은 메시지가 "self"로 전송되며 "self"는 그대로 둘 수 있습니다(따라서 이름).
기본 구문
슬롯에 액세스하기 위한 구문은 Smalltalk의 구문과 유사합니다.다음 3종류의 메시지를 사용할 수 있습니다.
- 단일한
receiver slot_name
- 바이너리
receiver + argument
- 키워드
receiver keyword: arg1 With: arg2
모든 메시지는 결과를 반환하므로 수신자(존재하는 경우)와 인수 자체가 다른 메시지의 결과일 수 있습니다.마침표만큼 메시지를 따라가면 Self는 반환된 값을 폐기합니다.예를 들어 다음과 같습니다.
안녕, 세상아! 인쇄물.
이것은 hello world 프로그램의 셀프 버전입니다.그'
구문은 리터럴 문자열 개체를 나타냅니다.다른 리터럴에는 숫자, 블록 및 일반 객체가 포함됩니다.
괄호를 사용하여 그룹화를 강제할 수 있습니다.명시적인 그룹화가 없는 경우 단항 메시지는 가장 높은 우선 순위를 가진 것으로 간주되며, 다음으로 바이너리(왼쪽에서 오른쪽으로 그룹화) 및 키워드가 가장 낮은 것으로 간주됩니다.할당에 키워드를 사용하면 식에도 키워드 메시지가 포함되어 있는 괄호가 추가되므로 Self를 피하기 위해 키워드 메시지실렉터의 첫 부분은 소문자로 시작하고 이후 부분은 대문자로 시작해야 합니다.
유효: 기초 맨 아래 사이: 결속 맨 아래 + 높이 그리고: 기초 정상 / 규모. 인자.
는 명확하게 해석할 수 있으며, 다음과 같은 의미를 가집니다.
유효: (기본값 하단) 사이: ((규격 하단) + 높이) 및 ((기본값 상단) / (스케일 계수))
Smalltalk-80 에서는, 같은 표현이 다음과 같이 표시됩니다.
유효한 := 자신 기초 맨 아래 사이: 자신 결속 맨 아래 + 자신 높이 또, 다음과 같이 합니다. 자신 기초 정상 / 자신 규모. 인자.
가정하여base
,ligature
,height
그리고.scale
의 인스턴스 변수가 아니었다.self
사실은 방법이었어요
새 객체 만들기
조금 더 복잡한 예를 들어 보겠습니다.
label Widget 알았다. 라벨: 안녕, 세상아!.
는 복사 메시지와 함께 "labelWidget" 오브젝트의 복사본을 만들고(이번에는 바로가기 없음), "안녕하세요"라는 메시지를 "label"이라는 이름의 슬롯에 넣습니다.이것으로 무엇을 할 수 있을까요?
(데스크탑 active Window) 그리기: (labelWidget 복사 라벨: 'Hello, World!')
이 경우,(desktop activeWindow)
먼저 실행되며 데스크톱오브젝트가 인식하고 있는 윈도 목록에서 활성 창이 반환됩니다.다음으로(내부에서 외부로, 왼쪽에서 오른쪽으로 읽음) 앞에서 살펴본 코드는 labelWidget을 반환합니다.마지막으로 위젯이 활성 창의 그리기 슬롯으로 전송됩니다.
위임
이론적으로 모든 자아 물체는 독립된 실체이다.셀프는 계급도 메타 계급도 없다.특정 오브젝트에 대한 변경은 다른 오브젝트에 영향을 주지 않지만 변경이 이루어진 경우 바람직할 수 있습니다.일반적으로 오브젝트는 로컬슬롯에 대응하는 메시지만 인식할 수 있지만 부모 오브젝트를 나타내는1개 이상의 슬롯을 가지면 오브젝트는 자신이 이해하지 못하는 메시지를 부모 오브젝트에 위임할 수 있습니다.접미사로 아스타리스크를 추가하는 것으로, 임의의 슬롯을 부모 포인터로 할 수 있습니다.이러한 방식으로 Self는 클래스 기반 언어로 상속을 사용하는 업무를 처리합니다.위임을 사용하여 네임스페이스나 어휘 범위 지정 등의 기능을 구현할 수도 있습니다.
예를 들어, 단순한 부기 애플리케이션에서 사용되는 "은행 계좌"라고 하는 개체가 정의되었다고 가정합니다.일반적으로 이 오브젝트는 내부에 있는 메서드(예금 및 인출)와 이에 필요한 데이터 슬롯을 사용하여 생성됩니다.이것은 시제품이며, 완전히 기능하는 은행 계좌이기도 하기 때문에 사용방법에 있어서만 특별합니다.
특성들
"Bob's account"용으로 이 오브젝트의 클론을 만들면 프로토타입과 똑같이 시작하는 새로운 오브젝트가 생성됩니다.이 경우 메서드와 데이터를 포함한 슬롯을 복사했습니다.그러나 보다 일반적인 해결책은 먼저 클래스와 일반적으로 연관되는 항목을 포함하는 특성 개체라고 불리는 보다 단순한 개체를 만드는 것입니다.
이 예에서 "은행 계좌" 객체는 입출금 방법을 가지고 있지 않지만, 부모로서 입출금 방법을 가지고 있는 객체를 가지고 있을 것이다.이렇게 하면 은행 계좌 객체의 많은 복사본을 만들 수 있지만 루트 객체의 슬롯을 변경함으로써 모든 복사본의 동작을 변경할 수 있습니다.
이것은 전통적인 수업과 어떻게 다릅니까?다음 의미를 고려합니다.
myObject(myObject) 부모: some Other Object(다른 오브젝트).
이 발췌는 실행 시 'parent*' 슬롯과 관련된 값을 변경하여 myObject의 '클래스'를 변경합니다(아스타리스크는 슬롯 이름의 일부이지만 대응하는 메시지는 아닙니다).상속 또는 어휘 범위 지정과 달리 위임 개체는 런타임에 수정할 수 있습니다.
슬롯 추가
Self의 오브젝트는 추가 슬롯을 포함하도록 수정할 수 있습니다.이는 그래픽 프로그래밍 환경을 사용하거나 원시 '_AddSlots:'를 사용하여 수행할 수 있습니다.프리미티브는 일반 키워드 메시지와 구문은 같지만 이름은 밑줄 문자로 시작합니다._AddSlots 프리미티브는 초기 구현의 잔여물이므로 피해야 합니다.단, 코드를 짧게 하기 때문에 아래의 예에 나타냅니다.
이전의 예는 자동차와 트럭 사이의 동작을 구별할 수 있도록 차량이라는 단순한 클래스를 리팩터링하는 것이었습니다.Self에서는 다음과 같은 방법으로 이를 달성할 수 있습니다.
_AddSlots: (차량 <- (부모*) = 특성 클론 가능 ).
_AddSlots:' 프리미티브의 수신자는 표시되지 않으므로 "self"입니다.프롬프트에 입력된 식의 경우 "lobby"라고 하는 객체입니다.'_AddSlots:' 인수는 슬롯이 수신기에 복사되는 개체입니다.이 경우 슬롯이 1개뿐인 리터럴오브젝트입니다슬롯의 이름은 '차량'이고 값은 다른 리터럴 개체입니다."<-" 표기법은 첫 번째 슬롯의 값을 변경하는 데 사용할 수 있는 '차량:'이라는 두 번째 슬롯을 의미합니다.
"="는 일정한 슬롯을 나타내므로 해당하는 'parent:'가 없습니다.'차량'의 초기 값인 리터럴 개체에는 단일 슬롯이 포함되어 있어 복제와 관련된 메시지를 이해할 수 있습니다.( ) 또는 단순히 ( )로 표시된 진짜 빈 개체는 메시지를 전혀 수신할 수 없습니다.
vehicle_AddSlots: (이름 <-'자동차')
여기서 수신기는 이전 개체이며, 이제 'parent*' 외에 'name' 및 'name:' 슬롯이 포함됩니다.
_AddSlots: (sportsCar <- 차량 복사). sportsCar _AddSlots: (driveToWork =("일부 코드, 이것은 메서드"))
이전에는 '차량'과 '스포츠카'가 완전히 비슷했지만, 지금은 '스포츠카'가 원래 가지고 있지 않은 방식의 새로운 슬롯을 포함하고 있다.메서드는 상수 슬롯에만 포함할 수 있습니다.
AddSlots: (포르쉐911 <-스포츠카 카피>) 포르쉐911 이름: 'Bobs Porsche'
새로운 물체 '포르쉐911'은 '스포츠카'와 똑같이 시작되었지만 마지막 메시지가 '이름' 슬롯의 값을 변경시켰다.어느 한쪽의 값이 다른 경우에도, 양쪽의 슬롯은 완전하게 같은 것에 주의해 주세요.
환경
Self의 한 가지 특징은 이전 Smalltalk 시스템이 사용하던 것과 동일한 종류의 가상 머신 시스템을 기반으로 한다는 것입니다.즉, 프로그램은 C와 같은 언어로 되어 있는 독립 실행형 엔티티가 아니라 실행하기 위해 전체 메모리 환경이 필요합니다.따라서 애플리케이션을 스냅샷 또는 이미지라고 하는 저장된 메모리 청크로 출하해야 합니다.이 접근법의 단점 중 하나는 이미지가 크고 다루기 어려운 경우가 있다는 것입니다.다만, 런타임 상태의 검사와 변경이 용이하기 때문에, 이미지의 디버깅이 종래의 프로그램의 디버깅보다 간단한 경우가 많습니다(소스 베이스와 이미지 베이스의 개발의 차이는 클래스 베이스와 프로토트의 차이와 유사합니다).ypical 객체 지향 프로그래밍).
또한 환경은 시스템 내 객체의 신속하고 지속적인 변화에 맞춰져 있습니다."클래스" 설계를 리팩터링하는 것은 기존 방식을 새로운 방식으로 끌어내는 것만큼이나 간단합니다.테스트 방법과 같은 간단한 작업은 복사하여 복사로 끌어다 놓은 다음 변경함으로써 처리할 수 있습니다.기존 시스템과 달리 변경된 개체만 새 코드를 가지며 테스트하기 위해 재구축할 필요가 없습니다.이 방법이 효과가 있으면 단순히 상위 항목으로 끌어다 놓기만 하면 됩니다.
성능
셀프 VM은 일부 [6]벤치마크에서 최적화된 C의 약 절반의 성능을 달성했습니다.
이는 Self 연구에서 개척되고 개량된 Just In Time 컴파일 기법에 의해 달성되어 높은 수준의 언어가 이를 잘 수행할 수 있게 되었습니다.
가비지 컬렉션
Self의 가비지 컬렉터는 개체를 기간별로 구분하는 생성 가비지 컬렉션을 사용합니다.메모리 관리 시스템을 이용해 페이지 쓰기를 기록함으로써 쓰기 장벽을 유지할 수 있다.이 기술은 실행 후 일정 시간 동안 전체 가비지 수집이 발생하여 상당한 [vague]시간이 걸릴 수 있지만 뛰어난 성능을 제공합니다.
최적화
런타임 시스템은 선택적으로 통화 구조를 평탄화합니다.이것에 의해, 그 자체로 약간의 스피드 업이 가능하게 됩니다만, 타입 정보나 다른 발신자 타입의 코드의 복수의 버전을 광범위하게 캐싱 할 수 있습니다.이것에 의해, 다수의 메서드 검색을 실시할 필요가 없어져 조건부 브랜치 문이나 하드 코드화된 콜을 삽입할 수 있습니다.대부분의 경우 언어 레벨에서는 범용성이 손실되지 않고, 완전한 가비지 수집 시스템에서 [7]C와 같은 퍼포먼스를 얻을 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Ungar, David; Smith, Randall B. (2007). "Self". Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages (HOPL III). doi:10.1145/1238844.1238853. ISBN 9781595937667. S2CID 220937663.
- ^ "Self "Mandarin" 2017.1". 24 May 2017. Archived from the original on 24 May 2017. Retrieved 24 May 2017.
- ^ Wolczko, Mario (1996). "self includes: Smalltalk". Workshop on Prototype-Based Languages, ECOOP '96, Linz, Austria.
- ^ "Self 4.4 released". 16 July 2010. Archived from the original on 5 December 2017. Retrieved 24 May 2017.
- ^ "Self Mallard (4.5.0) released". 12 January 2014. Archived from the original on 6 December 2017. Retrieved 24 May 2017.
- ^ Agesen, Ole (March 1997). "Design and Implementation of Pep, a Java Just-In-Time Translator". sun.com. Archived from the original on November 24, 2006.
- ^ [1][데드링크]
추가 정보
- Self에 관한 공개 논문
- Chambers, C. (1992), The Design and Implementation of the SELF Compiler, an Optimizing Compiler for Object-Oriented Programming Languages, Stanford University, CiteSeerX 10.1.1.30.1652
- 4개 기사 시리즈 "환경과 프로그래밍 언어 자체"
외부 링크
![]() | 이 문서의 외부 링크 사용은 Wikipedia의 정책 또는 지침을 따르지 않을 수 있습니다.(2013년 8월 (이 및 ) |