클래스 기반이 아닌 객체 지향 프로그래밍 언어가 있습니까?


44

어떤 있습니까 객체 지향 프로그래밍 언어 클래스 패러다임을 기반으로하지 않습니다?


1
기술적으로 말하면, C. 지향적 이지만 언어 적으로 이해하기는 쉽지 않습니다. 나는 그것이 당신이 찾고있는 일종의 대답은 아니라는 것을 알고 있지만 C가 어떻게 할 수 있는지 살펴보고 싶다면 클래스가 실제로 무엇을하고 대체 접근법이 어떻게 작동하는지에 대한 통찰력을 제공 할 수 있습니다.
kylben

4
@kylben : "오리엔트"는 소위 스트레칭입니다. C를 객체 지향 동작으로 분류 할 수 있습니다. 당신은 그것을 그런 방향으로 향하게 할 수 없습니다.
David Thornley

답변:


74

내가 아는 한, Self프로토 타입을 기반으로 한 "클래스 프리"패러다임을 고안 한 원래 언어입니다 . 1980 년대에 이미 실험 단계에 존재했으며 스몰 토크프로토 타입 패턴 을 우아하게 사용하여 클래스가 완전히 제거되었습니다.

그것은 내가 아는 다른 모든 "class-free"OO 언어에 영향을 미쳤다 :

  • 가장 두드러진 자바 스크립트
  • 클래식 프로그래밍 언어 및 환경 Squeak (Smalltalk 위에 구축)
  • 멀티 패러다임 스크립트 언어 루아 .

2
@Adam : 정적 타이핑이 없다면, 그것은 단지 구문 설탕일까요?
케빈 클라인

5
@DeadMG OO 언어는 OO 아이디어를 구현할 수있는 것이 아니라 당신을 위해하는 것입니다. :)
Piotr Dobrogost

4
실제로 Simula (1960)와 Smalltalk-71 (Smalltalk-72)에는 클래스가 없었으며, 이는 거의 30 년 전까지의 자아보다 앞서 있습니다. 강의는 Simula-67과 Smalltalk-74에만 추가되었습니다 (Alan Kay는이를 실수, 또는 더 정확하게 필요한 악으로 간주했습니다).
Jörg W Mittag

2
@ kevincline : 당신이 그것을 기반으로하는 것이 확실하지 않습니다. OO와 정적 타이핑은 완전히 직교합니다.
Paul Biggar

2
Simula (클래스 패러다임을 취한)와는 별도로, Flavors는 1979 년 MIT에서 소개되었고 CLOS의 선구자였으며,이 두 가지 모두 Self보다 이전의 것입니다.
Matthew Flynn

32

JavaScript와 같은 언어는 프로토 타입을 기반으로하며 기존 객체를 복제하여 동작을 재사용합니다. 내가 링크 한 Wikipedia 기사는 Lua, ActionScript 및 기타 여러 언어가이 패러다임을 따르고 있음을 나타냅니다.


2
모든 ECMAScript 변형은 프로토 타입 패러다임을 사용합니다.
zzzzBov

거의 모든 변형입니다. 기본 VM이 프로토 타입 측면에서 구현할 수 있지만 ActionScript (Flash 언어)는 클래스를 사용합니다.
mjfgates

@mjfgates, Actionscript 2는 ECMAScript 기반이었고 Javascript와 많이 비슷했습니다. 액션 스크립트 3은 그로부터 멀어지고 있지만 여전히 역동적 인 특성을 유지합니다. 본질적으로 모든 것이 Object이므로 변수를 강력하거나 약하게 입력 할 수 있습니다.
J_A_X

13

세계에서 가장 인기있는 객체 지향 프로그래밍 언어에는 클래스가 없으며 Javascript라고하며 프로토 타입 기반입니다. http://en.wikipedia.org/wiki/Prototype-based_programming


11
"세계에서 가장 인기있는 객체 지향 프로그래밍 언어"? 나는 그 주장에 대해 전혀 확신하지 못한다.
Thomas Owens

8
@ThomasOwens는 웹에 포함되어 있기 때문에 모든 최신 웹 지원 플랫폼 (모바일 장치 포함)에 JavaScript 인터프리터가 포함되어 있다고 쉽게 말할 수 있습니다. 현재 존재하는 가장 인기있는 프로토 타입 기반 언어라는 것은 매우 강력한 사례입니다. ( "SELF"에 대해 비슷한 주장을 할 수 있다고 생각하지 않는 한)
riwalk

1
Javascript는 확실히 세계에서 가장 널리 사용되는 프로그래밍 언어 중 하나이지만, 대부분의 사용법은 약간의 측면 지향 프로그래밍 (콜백? AJAX? 이벤트 핸들러?)과 함께 평범한 오래된 명령 또는 절차 적 일 것으로 기대합니다. 거기에서 자바 스크립트를 '가장 인기있는 OOP 언어'라고 부르는 것은 타당하지 않습니다.
tdammers

9
또한 "유비쿼터스"라고 말하면 그 인기의 장점에 대한 논의를 피할 수 있습니다.
Anthony Pegram

3
@ Stargazer712 : 저는 언어를 좋아하지 않지만 "세계에서 가장 인기있는 객체 지향 프로그래밍 언어 [ed : Javascript]에는 클래스가 없다"고 주장합니다. "자바 스크립트는 가장 인기있는 객체 지향 프로그래밍 언어"와 "자바 스크립트에는 클래스가 없습니다"라는 두 가지 주장으로 분해 될 수 있습니다. 둘 다 동의합니다.
Lie Ryan

6

객체 지향은 서로 부분적으로 만 관련되어있는 몇 가지 중요한 개념에 대한 포괄적 인 용어입니다. 예를 들어 상속은 클래스가 아닌 인스턴스간에 사례별로 선언되거나 prototypeThomas가 쓴 것처럼 전체 클래스가 구체적인 객체 로 표현 될 수 있습니다 . 구조 설명을 인스턴스 작성과 분리하는 것이 더 일반적입니다. 마찬가지로, 후기 바인딩은 명목상 동일한 메소드를 가진 객체가 호출 될 때 반드시 동일한 작업을 수행 할 필요는 없으며 런타임에 결정이 이루어짐을 의미합니다. 프로토 타입 기반 접근 방식에서도 마찬가지입니다. 캡슐화는 본질적으로 객체가 선언 된 클래스의 인스턴스인지 여부와는 완전히 독립적입니다.

즉, 대부분의 OO 언어는 클래스 기반 캠프에 단단히 있습니다. 그러나 도메인을 중심으로 한 디자인은 종종 특정 객체의 정체가 정적 클래스 다이어그램보다 훨씬 중요한 시스템으로 이어지고 데코레이터는 동일한 클래스 또는 인터페이스의 객체가 다른 행동.


6

Fortress 는 클래스 대신 특성을 기반으로하는 객체 지향 언어입니다. 차이점은 주로 구현 구성에 있습니다. 객체의 행동 (메소드 정의)은 여전히 ​​프로그램 텍스트의 특정 지점에서의 선언에 의해 결정됩니다. 그런 점에서 클래스 기반 시스템과 비슷합니다.

순수한 객체 기반의 객체 계산법이 있습니다 (Cardelli의 생각). 모든 메소드는 인스턴스 멤버입니다. 기존 객체의 내용을 가져 와서 해당 멤버의 일부를 추가, 제거 또는 교체하여 새 객체를 만듭니다. 새 객체에는 기존 객체에 대한 링크가 없으며 일부 내용 만 있기 때문에 프로토 타입과 약간 다릅니다.

IIRC에서는 Python 및 기타 해시 테이블 지향 언어를 사용하여 비슷한 방식으로 프로그래밍 할 수 있습니다. 함수를 인스턴스 멤버로 추가 한 다음 메소드로 호출 할 수 있습니다.


5

Ada는 1995 년 개정판을 기준으로 객체 지향적이지만 다른 많은 OO 언어와 달리 객체 지향 유형과 모듈을 "클래스"라는 단일 구조로 결합하지 않습니다. 유형을 "class Foo"로 선언하고 모든 관련 메소드 선언을 클래스 선언에 넣는 대신 패키지 를 선언하고 패키지 내부 에 유형 (a record) 및 기타 사항을 선언합니다 . 언급 된 다른 언어 중 일부는 "클래스가없는"것이 아니라 사물을 구성하는 방식이 약간 다릅니다.

Ada 95의 객체 지향 기능은 기존 1983 버전의 언어에 추가되었습니다. 상속 등을 지원하기 위해 기존 레코드 및 패키지 구성을 확장했습니다.


그것은 내가 기억했던 것이기도합니다. 또한 당신은 각 멤버 함수에 레코드를 전달해야합니다
Nikko

@Nikko : 이것이 모든 객체 지향 언어에서 배후에서 일어나고, 파이썬과 CLOS (공통 리스프)에서 상당히 명확하게 일어난 일입니다.
Marcin

5

Io 는 또 다른 프로토 타입 기반 객체 지향 언어입니다. 실제로 다른 답변에서 이미 언급 한 여러 언어에서 영감을 얻습니다.

Io는 동적 프로토 타입 기반 프로그래밍 언어입니다. Io의 아이디어는 주로 Smalltalk (모든 값은 객체), Self (시제품 기반), NewtonScript (차등 상속), Act1 (동시성에 대한 행위자 및 미래), Lisp (코드는 런타임 검사 가능 / 수정 가능한 트리 임) 및 루아 (작고 내장 가능).


4

얼랭. 그렇습니다. Erlang OO 정의의 세 가지 사항을 모두 충족하므로 객체 지향 언어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.