맨위로가기

프로토타입 기반 프로그래밍

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

1. 개요

프로토타입 기반 프로그래밍은 객체를 복제하거나 처음부터 생성하는 방식으로 새로운 객체를 만들어가는 프로그래밍 스타일이다. 스몰토크의 클래스 기반 설계를 개선하려는 시도에서 시작되었으며, 객체에서 클래스 개념을 없애고 인스턴스만으로 일원화하려는 아이디어가 핵심이다. 객체 생성 방식으로는 기존 객체를 복사하는 복제 방식과, 처음부터 속성과 메서드를 정의하는 무(無)에서의 생성 방식이 있다. 프로토타입 기반은 위임과 연쇄 방식을 통해 코드 재사용성을 높이며, 자바스크립트가 대표적인 사용 언어이다. 클래스 기반 프로그래밍에 비해 정적 타입 시스템 부재, 효율성 문제, 개발자들의 익숙하지 않음 등의 비판을 받기도 한다.

2. 역사

프로토타입 기반 프로그래밍은 클래스 기반 프로그래밍의 복잡성을 줄이고자 하는 시도에서 비롯되었다. "프로토타입"은 "처음 만들어진 것"을 의미하며, 구체적인 사물을 복사하고 수정하여 다른 객체를 만드는 방식을 따른다.

더글러스 크락포드는 자바스크립트의 프로토타입 상속에 대해 "객체가 객체로부터 상속받는다. 이보다 더 객체 지향적인 것이 있을까요?"라고 설명하며, 프로토타입 기반 프로그래밍의 핵심을 강조했다.[1] 프로토타입 기반 프로그래밍 옹호자들은 프로그래머가 먼저 객체의 동작에 집중하고, 나중에 이를 클래스와 유사한 원형 객체로 분류하도록 장려한다고 주장한다.[4]

대부분의 프로토타입 기반 시스템은 인터프리터 언어와 동적 타입 언어를 기반으로 한다. 정적 타입 언어 기반 시스템도 가능하지만, ''프로토타입 기반 프로그래밍''에서 논의된 Omega 언어[2] 조차도 완전한 정적 타입은 아니었다.

프로토타입 기반은 스몰토크의 클래스 기반 설계를 간소화하려는 시도에서 고안되었다.

2. 1. 스몰토크의 영향

초기 객체지향 언어스몰토크는 클래스, 인스턴스, 메타클래스 등의 개념을 도입했지만, 이 구조가 복잡하다는 비판을 받았다.[11] 앨런 케이가 제시한 스몰토크 설계의 여섯 가지 항목은 다음과 같다.[11]

번호내용
1모든 것은 객체이다.
2객체는 메시지를 주고받으며 통신한다.
3객체는 자체 메모리를 갖는다.
4모든 객체는 클래스의 인스턴스이며, 클래스 또한 객체이다.
5클래스는 해당 인스턴스들이 공유하는 동작을 유지한다.
6프로그램 목록을 평가하기 위해 제어가 첫 번째 객체로 전달되고 나머지는 메시지로 처리된다.



이 중 4번 항목은 수학적 귀납적인 문장으로, 인스턴스의 원형인 클래스 또한 메타클래스의 인스턴스이며, 그 메타클래스 또한 다른 메타클래스의 인스턴스로 해석된다. 스몰토크에서는 메타클래스와 클래스 사이에 중간 매체가 있어서, 인스턴스화 흐름은 'M → C class → C → i'와 같았다. (M: 메타클래스, C: 클래스, i: 인스턴스, C class: 중간 매체)

3번 항목에서는 클래스와 인스턴스 모두 메모리(데이터)를 갖지만, 5번 항목에서는 동작(메서드)은 클래스만이 갖는다고 되어 있어 혼란을 야기했다. 이론적인 면에서는 아름다웠지만, 실천적인 면에서는 매우 복잡했던 클래스 기반 설계의 문제점은 철학적인 인스턴스화 체인과 클래스 및 인스턴스에 대한 동작의 모호함에서 비롯되었다.

이러한 문제점을 개선하기 위해 객체에서 클래스와 인스턴스 개념을 없애자는 아이디어가 나왔고, 이것이 프로토타입 기반 프로그래밍의 원점이 되었다. 이 아이디어는 언어적인 관점에서 클래스를 없애고 인스턴스로 일원화하는 것으로 해석할 수 있으므로, 인스턴스 기반(Instance-based)이라고도 불렸다. 클래스의 인스턴스화를 인스턴스의 복제(클론)로 대체함으로써 스몰토크 클래스 설계가 개선되었고, Self는 이 아이디어를 따라 제작된 스몰토크 방언이었다.[11]

2. 2. Self 언어의 등장

스몰토크의 설계는 이론적으로는 아름다웠지만, 실제 구현에서는 클래스와 인스턴스의 관계, 동작 방식 등이 복잡하여 개발자들에게 어려움을 안겨주었다.[11] 이러한 문제점을 개선하기 위해, 클래스와 인스턴스의 구분을 없애고 객체만을 사용하는 방안이 제시되었다. 이 방안은 언어적인 관점에서 클래스를 제거하고 인스턴스로 통합하는 것으로 해석할 수 있어, '인스턴스 기반'(Instance-based)이라고도 불렸다.[11]

이러한 아이디어를 바탕으로 Self라는 스몰토크 방언이 개발되었다. Self는 클래스의 인스턴스화 대신 인스턴스의 복제(clone)를 통해 객체를 생성하는 방식을 채택했다.[11] Self는 인스턴스 기반, 또는 프로토타입 기반 프로그래밍의 개념을 처음으로 제시한 언어로 평가받는다.

2. 3. 자바스크립트와 프로토타입

더글러스 크락포드는 자바스크립트의 프로토타입 기반 상속을 "객체가 객체로부터 상속받는" 진정한 객체지향이라고 설명했다.[1] 최근 자바스크립트(ECMAScript)에는 클래스 기반 구문이 도입되었으나, 내부적으로는 여전히 프로토타입 기반의 특징을 유지하고 있다. 타입스크립트는 클래스와 프로토타입 기반의 절충을 보여주는 예시이다.

3. 개념 및 특징

프로토타입 기반 프로그래밍은 객체를 생성하고, 이 객체의 복제(cloning) 또는 '무(無)에서의 생성'(ex nihilo)을 통해 새로운 객체를 만들어 나가는 방식이다.

프로토타입 기반 체계에서는 이미 있던 프로토타입을 복제하지 않고 아무것도 없는 상태에서 새로운 객체를 생성할 수 있다. 새 객체의 특성과 행동을 이미 있던 객체를 참조하지 않고도 지정할 수 있다는 장점이 있다. 많은 프로토타입 기반 언어에는 ''`Object`'' 프로토타입이 있는데, 이는 모든 객체의 마스터 프로토타입으로 사용되며 공통적으로 필요한 메서드를 포함한다.

프로토타입 기반 프로그래밍 옹호자들은 프로그래머가 객체의 동작에 먼저 집중하고, 나중에 이러한 객체를 클래스와 유사하게 사용되는 원형 객체로 분류하도록 장려한다고 주장한다.[4]

거의 모든 프로토타입 기반 시스템은 인터프리터 언어와 동적 타입 언어를 기반으로 한다. 정적 타입 언어를 기반으로 하는 시스템도 기술적으로 가능하지만, ''프로토타입 기반 프로그래밍''에서 논의된 Omega 언어[2]가 그러한 예시이지만, Omega의 웹사이트에 따르면 Omega조차도 전적으로 정적인 것은 아니다.

프로토타입 기반 언어에는 명시적인 클래스가 없다. 객체는 프로토타입 속성을 통해 다른 객체로부터 직접 상속된다. Self 및 JavaScript에서는 `prototype`이라고 하며, Io에서는 `proto`라고 한다.

3. 1. 객체 생성

프로토타입 기반 체계에서 새 객체를 만드는 방법에는 두 가지가 있다. 하나는 기존 객체를 복제(cloning)하는 것이고, 다른 하나는 무에서의 생성(''ex nihilo'')이다.

  • 복제(Cloning): 기존 객체(프로토타입)를 복사하여 새로운 객체를 만든다. 복제된 객체는 원본 객체의 속성과 메서드를 모두 가지며, 필요에 따라 수정할 수 있다.[15] 포스나 케보와 같은 일부 프로그래밍 언어는 복제된 객체의 변경 사항이 자동으로 하위 객체로 전파되지 않는 방식을 사용한다.
  • 무에서의 생성(Ex nihilo): 아무것도 없는 상태에서 새로운 객체를 만든다. 이 방식에서는 객체의 속성과 메서드를 처음부터 정의해야 한다. 많은 프로토타입 기반 언어에는 기본 객체 프로토타입인 ''Object'' 프로토타입이 있으며, 모든 객체의 마스터 프로토타입으로 사용된다. 이 방식을 사용하면 새 객체의 이름이 최상위 ''Object'' 객체와 네임스페이스 충돌을 일으키지 않는다. 모질라 자바스크립트에서는 객체의 `__proto__` 프로퍼티를 `null`로 지정하여 이를 구현할 수 있다.


더글러스 크락포드는 자바스크립트의 프로토타입 상속에 대해 다음과 같이 설명한다.[1]

자바스크립트에서의 객체 생성 예시는 다음과 같다.

```javascript

// JavaScript에서 진정한 프로토타입 상속 스타일의 예시.

// 리터럴 객체 표기 {}를 사용하여 객체를 생성합니다.

const foo = { name: "foo", one: 1, two: 2 };

// 또 다른 객체입니다.

const bar = { two: "two", three: 3 };

// Object.setPrototypeOf()는 ECMAScript 2015에 도입된 메서드입니다.

// 편의를 위해 다음 줄이 사용된 엔진에 관계없이 작동한다고 가정해 보겠습니다.

Object.setPrototypeOf(bar, foo); // foo는 이제 bar의 프로토타입입니다.

// 이제부터 bar에서 foo의 속성에 접근하려고 하면

// 성공합니다.

bar.one; // 1로 확인됩니다.

// 자식 객체의 속성도 접근할 수 있습니다.

bar.three; // 3으로 확인됩니다.

// 고유 속성은 프로토타입 속성을 가립니다.

bar.two; // "two"로 확인됩니다.

bar.name; // 영향을 받지 않고 "foo"로 확인됩니다.

foo.name; // "foo"로 확인됩니다.

```

```javascript

const foo = { one: 1, two: 2 };

// bar.prototype = foo

const bar = Object.create(foo);

bar.three = 3;

bar.one; // 1

bar.two; // 2

bar.three; // 3

3. 2. 위임(Delegation)과 연쇄(Concatenation)

실행 시간에 '위임'하는 프로토타입 기반 언어들은 동적 디스패치를 통해 올바른 메서드를 찾거나, 객체에서 프로토타입으로 위임 포인터를 따라가며 자료를 찾는다. 객체 간 동작 공유는 위임 포인터만 있으면 가능하다. 클래스 기반 객체지향 언어와 달리, 프로토타입과 파생 객체는 메모리나 구조적 유사성을 가질 필요가 없으며, 자식 객체는 클래스 구조를 변경하지 않고도 수정될 수 있다. 메서드도 추가되거나 변경될 수 있다. 대부분의 프로토타입 기반 언어는 자료와 메서드를 모두 슬롯으로 관리한다.[16]

순수 프로토타입은 '연쇄적' 프로토타입이라고도 하며, 케보가 그 예시다. 원본 프로토타입에서 복제된 객체로 포인터는 보이지 않는다. 프로토타입 객체는 복사되지만, 다른 이름이나 참조값을 갖는다. 이는 미토시스와 비슷하며, 메서드와 속성은 중복된다.[16]

이 방식은 객체 작성자가 부모 객체의 자식 객체들 간 부수효과를 신경 쓰지 않고 복제할 수 있다는 장점이 있다. 또한, 디스패치 중 메서드 미리보기 계산 비용이 위임보다 줄어든다. 위임은 적합한 메서드나 슬롯을 찾지 못하면 전체 위임 사슬을 찾아야 하기 때문이다.[16]

하지만 연쇄 방식은 프로토타입의 변화가 복제품에 즉시, 자동적으로 적용되지 않는다는 단점이 있다. 케보는 '가족 닮음'이라는 추가적인 기본형을 제공하여 유사한 객체들을 모아 변화를 적용한다.[16]

또 다른 단점은, 세련되지 않은 구현에서는 원형과 복제품이 같은 부분에서 복제품들이 위임 형태보다 메모리를 더 많이 낭비한다는 것이다. 그러나 공유 구현 및 자료를 배후에 두는 방식으로 프로그래밍에 대한 연쇄적 행동이 가능하다.[16]

3. 3. 슬롯(Slot)

프로토타입 기반 언어에서 데이터와 메서드는 모두 "슬롯" 또는 "멤버"라고 불린다. 이는 클래스 기반 시스템에서처럼 관련 프로토타입의 구조를 재정렬하지 않고도 자식 객체가 계속 수정될 수 있게 한다.

프로토타입 기반 객체는 보통 슬롯의 가변 길이 배열로 구현된다. 슬롯은 "심볼 + 콘텐츠" 쌍으로 된 데이터다. 심볼은 프로퍼티 이름이나 메소드 이름을, 콘텐츠는 프로퍼티 값이나 코드 블록 참조를 나타낸다. 프로퍼티 슬롯은 프로토타입 참조나 this 참조(self 참조)의 컨테이너가 될 수 있다. Self에서는 메소드 슬롯이 메시지 형태로 보내지는 선택자의 수신자가 된다.

4. 클래스 기반과의 비교

클래스 기반 언어에서 객체는 '클래스'와 '인스턴스' 두 가지 형태로 나타난다. 클래스는 객체의 구조와 동작 방식(메소드의 모임)을 정의하고, 인스턴스는 이 클래스를 바탕으로 만들어진 실제 사용 가능한 객체이다. 클래스는 모든 인스턴스에 동일한 구조를 제공하며, 인스턴스는 객체의 자료(상태)를 가진다. 즉, 구조/동작 방식과 상태가 분리된다.[1]

프로토타입 기반 프로그래밍은 클래스 기반 언어와 달리 개발자가 객체의 동작 방식에 먼저 집중하고, 객체 분류는 나중에 처리하도록 유도한다. 많은 프로토타입 기반 시스템은 실행시간에 프로토타입 변경을 허용하지만, 스몰토크와 같은 일부 클래스 기반 시스템만이 프로그램 실행 중 클래스 변경을 허용한다.[4]

프로토타입 기반 프로그래밍은 학습 과정에서 프로토타입이나 이그젬플러를 강조하는 인지 심리학과 관련이 있다.

대부분의 프로토타입 기반 시스템은 인터프리터 방식의 동적 타입 프로그래밍 언어이지만, 오메가와 같이 정적 타입 시스템도 가능하다.[14]

"프로토타입"은 "처음 만들어진 것"을 의미하며, 구체적인 사물을 복사하고 수정하여 다른 객체를 만드는 방식이다. 예를 들어, 킬로그램 국제 원기를 복사하여 새로운 킬로그램 객체를 만들 수 있다. 반면 "클래스"는 객체가 속하는 추상적인 개념이다.[1]

더글러스 크락포드는 자바스크립트의 프로토타입 상속을 다음과 같이 설명한다.[1]

프로토타입 기반 프로그래밍 옹호자들은 프로그래머가 객체의 동작에 집중하고, 나중에 원형 객체로 분류하도록 장려한다고 주장한다.[4] 공통 리스프, 딜런, 오브젝티브-C, 펄, 파이썬, 루비, 스몰토크 등은 프로그램 실행 중 클래스 변경을 허용한다.

대부분 프로토타입 기반 시스템은 인터프리터 언어와 동적 타입 언어를 기반으로 한다. 정적 타입 언어 기반 시스템도 가능하며, Omega 언어가 그 예시이다.[2] Omega는 "컴파일러가 가능한 경우 정적 바인딩을 사용하도록 선택할 수 있으며, 프로그램의 효율성을 향상시킬 수 있다."고 한다.

프로토타입 기반 언어는 명시적인 클래스가 없으며, 객체는 프로토타입 속성(prototype (Self, JavaScript), proto (Io))을 통해 다른 객체로부터 직접 상속받는다. 새로운 객체는 ''ex nihilo''(무로부터) 객체 생성 또는 기존 객체의 ''복제''를 통해 생성된다. ''ex nihilo'' 객체 생성은 객체 리터럴을 통해 지원된다.[3]

클래스 기반 언어에서 새 인스턴스는 클래스의 생성자 함수를 통해 생성된다. 생성자 함수는 메모리를 예약하고 참조를 반환하며, 선택적 인자를 받아 속성에 저장한다.

''ex nihilo'' 객체 생성을 지원하는 시스템은 특수 구문을 통해 새 객체의 속성과 동작을 지정한다. 많은 프로토타입 언어에는 루트 객체(''Object'')가 존재하며, `toString()` 함수와 같이 일반적으로 필요한 메서드를 포함한다. ''ex nihilo'' 객체 생성은 새 객체의 슬롯(속성 및 메서드) 이름이 최상위 ''Object'' 객체와 네임스페이스 충돌을 일으키지 않도록 한다. (예: JavaScript에서 Object.create(null))

''복제''는 기존 객체(프로토타입)의 동작을 복사하여 새 객체를 생성한다. 새 객체는 원본의 모든 특징을 가지며, 수정 가능하다. 일부 시스템에서 자식 객체는 프로토타입에 대한 명시적 링크(위임 또는 유사성)를 유지하여 프로토타입 변경 사항을 반영한다. Kevo와 같은 시스템은 ''연쇄적'' 모델을 따라 복제된 객체의 변경 사항이 자동으로 하위 객체로 전파되지 않는다.[4]

스몰토크의 클래스 기반 설계를 개선하기 위해 프로토타입 기반이 고안되었다. 앨런 케이가 제시한 스몰토크 설계 6가지 항목 중 클래스 기반과 관련된 부분은 다음과 같다.[11]

(4)는 수학적 귀납적 문장으로, 클래스는 메타클래스의 인스턴스이며, 메타클래스 또한 다른 메타클래스의 인스턴스이다. 원조 클래스 기반은 이론적으로는 아름다웠지만, 실천적으로는 복잡하여 개발진에게 평판이 좋지 않았다.

개선책으로 객체에서 클래스와 인스턴스 개념을 없애는 안이 프로토타입 기반의 원점이 되었다. 이 안은 인스턴스 기반(Instance-based)이라고도 불렸다. 클래스의 인스턴스화를 인스턴스의 클론으로 대체하여 Self가 제작되었다.

C++/파이썬의 정적/동적 클래스 기반 설계에서는 클래스와 인스턴스를 타입과 값의 역할로 고정하고 인스턴스화의 상호 재귀를 없앴다. 메타클래스는 클래스 구성 조작의 리플렉션 기능이 되었다.

현재 C++/파이썬에서 비롯된 클래스 기반 설계가 많이 채용되었고, Self에서 비롯된 프로토타입 기반은 소수파가 되었다. 자바스크립트, ECMAScript에서는 클래스 기반 구문이 도입되었으며, 타입스크립트는 클래스 기반과 프로토타입 기반의 절충이 되었다. 프로토타입 기반은 다소 범용성이 부족하여 객체 지향의 주류가 되지 못했다.

Douglas Crockford영어는 JavaScript의 프로토타입 기반을 다음과 같이 설명한다.[12]

프로토타입 기반은 프로그래머가 객체의 동작(메소드)에만 집중하게 한다.[13] 의문을 뒤로 미루는 것은 동적 타입 지정의 덕 타이핑을 의미한다. 프로토타입 기반은 정적 타입 지정 구현을 배제하지 않지만, 동적 타입 지정이 선호된다.

프로토타입 기반 객체는 일반적으로 슬롯의 가변 길이 배열로 구현된다. 슬롯은 "심볼 + 콘텐츠" 쌍 데이터이다. 심볼은 프로퍼티 이름이나 메소드 이름을 나타내며, 콘텐츠는 프로퍼티 값이나 코드 블록 참조를 나타낸다. 프로퍼티 슬롯은 프로토타입 참조나 this 참조(self 참조)의 컨테이너가 되기도 한다. Self에서는 메소드 슬롯이 메시지식으로 보내지는 선택자의 수신자가 된다.

객체 구축은 클론 방식 또는 엑스니힐로 방식으로 수행된다. 클론은 기존 객체를 복제하고, 복제 후 프로퍼티/메소드를 자유롭게 추가/제거할 수 있다. 엑스니힐로는 프로퍼티/메소드가 없는 빈 객체를 생성/복제하고, 생성 후 프로퍼티/메소드를 자유롭게 추가할 수 있다. 구조체와 유사한 형식으로 프로퍼티/메소드를 초기 설정하여 생성하는 방식도 엑스니힐로에 분류된다. 클래스 개념이 없으므로 템플릿 처리적인 객체 구축은 불가능하지만, 클래스 기반 구문이 도입된 언어에서는 대체적으로 가능하며, 이는 엑스니힐로 방식으로 해석된다.

클론으로 구축된 객체의 프로토타입-슬롯에는 클론 원본 객체 참조가 자동 대입된다. 프로토타입-슬롯은 재대입이 가능하므로, 엑스니힐로로 구축된 빈 객체에도 프로토타입 객체 참조를 자유롭게 추가할 수 있다. 프로토타입은 암묵적인 위임 대상이 되며, 객체가 액세스 요청된 프로퍼티/메소드를 가지고 있지 않은 경우, 해당 프로토타입에서 자동 검색된다. 이것은 상속이 된다.

프로토타입 기반의 다형성은 클래스가 없으므로 메소드 오버라이드에 의한 가상 함수는 성립하지 않지만, 객체의 Structural type system영어 해석에 의한 메소드의 서브타이핑이 이를 담당한다. 동적 타입 지정에 의한 동적 바인딩도 사용된다.

프로토타입 기반에서는 캡슐화가 경시되는 경우가 많다.

5. 비판

프로토타입 기반 프로그래밍은 클래스 기반 프로그래밍에 비해 다음과 같은 비판을 받기도 한다.

클래스 기반 객체 모델을 지지하는 사람들은 프로그래밍 언어의 정적 타입 시스템을 지지하는 사람들이 동적 타입 시스템에 대하여 우려하는 것과 비슷한 점, 즉 프로그램의 정확성, 안전성, 예측성, 효율성이 떨어진다고 우려한다.[1]

자바스크립트와 같은 프로토타입 기반 언어가 널리 사용되고는 있지만, 소프트웨어 개발자들 사이에서는 익숙하지 않다는 점도 비판받는 이유 중 하나이다.[1]

5. 1. 정적 타입 시스템의 부재

프로토타입 기반 시스템은 주로 동적 타입 시스템을 사용하기 때문에, 프로그램의 정확성, 안전성, 예측성이 떨어진다는 비판을 받는다.[1] 이와 반대로 클래스 기반 언어의 정적 타입 시스템은 컴파일 시점에 오류를 발견하고 코드 최적화를 용이하게 한다는 장점이 있다.

효율성 측면에서 클래스 선언은 대부분의 컴파일러가 더 효율적인 메서드와 인스턴스 변수 미리보기를 가능하게 하여 최적화를 쉽게 한다.[1] 셀프 (프로그래밍 언어)의 경우, 클래스 기반에 비해 프로토타입 기반 체계는 수행 속도를 빠르게 하는 컴파일과 인터프리터 기술을 개발하는 데 많은 시간이 걸렸다.[1]

자바스크립트와 같은 프로토타입 기반 언어가 널리 사용되고 있지만, 소프트웨어 개발자들 사이에서 익숙하지 않다는 점도 비판의 대상이다.[1]

5. 2. 효율성 문제

클래스 기반 언어와 비교했을 때 프로토타입 기반 언어는 실행 속도가 느릴 수 있다는 지적이 있다. Self 언어는 프로토타입 기반 언어의 성능 향상을 위해 많은 노력을 기울였지만, 여전히 클래스 기반 언어에 비해 최적화가 어렵다는 문제가 있다. 예를 들어, 리삭 컴파일러는 C만큼 빠른 코드를 생성하지만, 테스트 결과 리삭 버전이 C 버전보다 1.9% 느리게 실행되었다.[1]

5. 3. 개발자들의 익숙하지 않음

소프트웨어 개발자 커뮤니티는 자바스크립트의 인기와 시장 침투에도 불구하고 프로토타입 기반 언어에 익숙하지 않다는 비판이 있다.[8] 그러나 월드 와이드 웹(웹)이 성숙함에 따라 자바스크립트를 복잡하게 사용하게 되면서 프로토타입 기반 시스템에 대한 지식이 증가하고 있다. ECMA스크립트 6은 자바스크립트의 기존 프로토타입 기반 상속에 대한 구문적 설탕으로 클래스를 도입하여 객체를 생성하고 상속을 관리하는 대안적인 방법을 제공한다.[9]

6. 프로토타입 기반 언어 목록

다음은 주요 프로토타입 기반 언어 목록이다.

이름설명
ABCLABCL/1, ABCL/R, ABCL/R2, ABCL/c+
Agora
Cecil
Cel
ECMAScriptActionScript(액션스크립트)[17], DMDScript, E4X, JavaScript(자바스크립트)[18], JScript(J스크립트)
Falcon
[http://www.ozonehouse.com/mark/codeworks.html Glyphic Script]
Hula
Io
Ioke
Kevo
Lisaac(Lisaac)
Logtalk
Lua
MOO
NewtonScript(뉴튼스크립트)
Obliq(오블리크)
Object Lisp[19]
OpenLaszlo(오픈라즐로)
Perl[http://search.cpan.org/dist/Class-Prototyped/lib/Class/Prototyped.pm Class::Prototyped] 모듈 사용
R[http://cran.r-project.org/web/packages/proto/index.html proto] 패키지 사용
REBOL(리볼)
Self
Slate
SmartFrog
Squeak(스퀵)뷰어 프레임워크를 사용하여 모픽 컴포넌트 사용
TADS
Tclsnit 확장 사용
액터 기반 동시성 언어 (ABCL)ABCL/1, ABCL/R, ABCL/R2, ABCL/c+
아고라
오토핫키
Cecil 및 Diesel (크레이그 챔버스)
콜드C(ColdC)
COLA
공통 리스프
[http://www.cyan-lang.org/ 시안] (Cyan)
ECMAScript액션스크립트 1.0, 어도비 플래시 및 어도비 플렉스에서 사용, ECMAScript for XML (E4X), 자바스크립트, JScript, 타입스크립트
Io
Ioke
Jsonnet
Logtalk
LPC
Lua
M2000
메이플
MOO
네코
뉴턴스크립트
Nix
오브젝트 리스프
오블릭
오메가
OpenLaszlo
펄, Class::Prototyped 모듈 포함
파이썬([https://github.com/airportyh/prototype.py prototype.py] 사용)
R, proto 패키지 포함
REBOL
레드
루비
Self
세프
슬레이트
스마트프로그
스냅!
Etoys
TADS
snit 확장을 사용하는 Tcl
우마진[10]


참조

[1] 웹사이트 Prototypal Inheritance in JavaScript http://crockford.com[...] 2021-06-22
[2] 서적 Omega: Statically Typed Prototypes
[3] 서적 Classifying Prototype-based Programming Languages
[4] 서적 Classes vs. Prototypes: Some Philosophical and Historical Observations
[5] 웹사이트 Simplifying JavaScript with Concatenation-Based Prototype Inheritance http://lively.cs.tut[...] Tampere University of Technology 2015-03-11
[6] 웹사이트 Object‐Oriented Programming https://github.com/c[...] 2023-09-04
[7] 간행물 Kevo, a prototype-based object-oriented programming language based on concatenation and module operations University of Victoria
[8] 뉴스 Prototypal Object-Oriented Programming using JavaScript https://alistapart.c[...] 2018-10-21
[9] 웹사이트 Classes https://developer.mo[...] Mozilla Developer Network 2016-02-09
[10] 문서 Proprietary scripting language. http://www.davidbrebner.com/?p=4 has some basic examples of use.
[11] 웹사이트 The Early History Of Smalltalk http://worrydream.co[...] 2019-01
[12] 웹사이트 Prototypal Inheritance in JavaScript http://crockford.com[...] 2021-06-22
[13] 간행물 Thinking with prototypes https://doi.org/10.1[...] ACM Press 1998
[14] 서적 Prototype-Based Programming: Concepts, Languages and Applications Springer-Verlag
[15] 서적 A Theory of Objects Springer-Verlag
[16] 문서 Antero Taivalsaari. Kevo, a prototype-based object-oriented programming lnaguage based on concatenation and module operations. Technical Report Report LACIR 92-02, University of Victoria, 1992
[17] 문서 Adobe Flash와 Adobe Flex에서 사용됨
[18] 문서 최초의 이름은 '모카'(Mocha), 그 다음엔 '라이브스크립트'(LiveScript)였다가 '자바스크립트'가 되었다.
[19] 문서 by Gary Drescher of Lisp Machines, Inc., 1985



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

문의하기 : help@durumis.com