Alan Kay가“객체 지향”이라는 용어의 의미는 무엇입니까?


95

보고 된 바에 따르면, Alan Kay는 "객체 지향"이라는 용어의 발명가입니다. 그리고 그는 종종 오늘날 우리가 OO라고 부르는 것이 그가 의미하는 것이 아니라고 말한 것으로 인용됩니다.

예를 들어 방금 Google에서 이것을 발견했습니다.

나는 '객체 지향'이라는 용어를 만들었고 C ++을 염두에 두지 않았다고 말할 수 있습니다.

-Alan Kay, OOPSLA '97

나는 희미하게 그 일에 대해 매우 통찰력있는 무언가를 듣고 기억 않았다 의미한다. "메시지 전달"줄을 따라 뭔가.

그가 무슨 뜻인지 아십니까? 그가 의미하는 바와 오늘날의 일반적인 OO와 어떻게 다른지 더 자세히 설명해 주시겠습니까? 참조가 있으면 공유하십시오.

감사.


이 주제에 대해 내 블로그 게시물이 흥미로울 수 있습니다. yegor256.com/tag/oop.html
yegor256

Alan Kay 자신이 질문에 답변하는이 블로그 게시물의 댓글 섹션을 확인하십시오. Alan Kay는 자신 이 잘못
되었다는 것에 대해 틀 렸습니다

답변:


82

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


날짜 : 2003 년 7 월 23 일 수요일 09:33:31 -0800받는 사람 : Stefan Ram [개인 정보 보호를 위해 제거됨] 보낸 사람 : Alan Kay [개인 정보 보호를 위해 제거 된 경우] 제목 : Re : "개체 지향"에 대한 설명

안녕 스테판-

지연해서 죄송하지만 휴가 중이었습니다.

오후 6시 27 분 +0200 7/17/03에 Stefan Ram은 다음과 같이 썼습니다.

박사님,

주제에 대한 튜토리얼 페이지에서 "객체 지향 프로그래밍"이라는 용어에 대해 권위있는 단어를 갖고 싶습니다. 내가 "권한있는"것으로 간주하는 유일한 두 가지 소스는 "ISO / IEC 2382-15"에서 "객체 지향"을 정의하는 국제 표준기구 (International Standards Organization)입니다.

내가했다고 확신합니다.

불행히도, 해당 용어에 대한 정의 나 설명이있는 웹 페이지 나 소스를 찾기가 어렵습니다. "상속성, 다형성 및 캡슐화"와 같이 이와 관련하여 말한 내용에 대한 몇 가지 보고서가 있지만 이는 직접적인 소스가 아닙니다. 또한 나중에 "메시지"에 더 중점을두고 있음을 알고 있습니다. 그러나 여전히 "개체 지향"에 대해 알고 싶습니다.

기록, 내 튜토리얼 페이지 및 추가 배포 및 출판에 대해서는 다음을 설명하십시오.

"객체 지향"이라는 용어가 언제 어디서 사용 되었습니까?

11 월 66 일 유타에서 Sketchpad, Simula, ARPAnet, Burroughs B5000의 디자인, 생물학 및 수학 배경에 영향을 받았을 때 나는 프로그래밍을위한 아키텍처를 생각했습니다. 1967 년에 누군가 내가 무엇을하고 있는지 물었을 때 아마도 "개체 지향 프로그래밍"이라고 말했다.

그것의 원래 개념은 다음과 같은 부분을 가졌습니다.

  • 나는 객체가 네트워크의 생물학적 세포 및 / 또는 개별 컴퓨터와 같고 메시지와 만 통신 할 수 있다고 생각했습니다. (메시징은 처음에 시작되었습니다. 유용한).

  • 나는 데이터를 제거하고 싶었다. B5000은 거의 믿을 수없는 HW 아키텍처를 통해 거의이 작업을 수행했습니다. 셀 / 전체 컴퓨터 메타포가 데이터를 제거하고 "<-"는 또 다른 메시지 토큰 일 뿐이라는 것을 깨달았습니다 (이 심볼을 모두 이름으로 생각했기 때문에 이것을 생각하는 데 꽤 오랜 시간이 걸렸습니다. 기능과 절차.

  • 나의 수학 배경은 각 물체가 그것에 관련된 대수학을 가질 수 있다는 것을 깨달았고, 이것들의 패밀리가있을 수 있으며, 그것들은 매우 유용 할 것입니다. "다형성 (polymorphism)"이라는 용어는 훨씬 후에 부과되었으며 (Peter Wegner가 생각합니다) 실제로 함수의 명명법에서 비롯된 것이므로 함수보다 더 많은 것을 원했습니다. 나는 일반적인 대수를 준 대수 형태로 다루기 위해 "일반성"이라는 용어를 만들었습니다.

  • 나는 Simula I 또는 Simula 67이 상속을받는 방식이 마음에 들지 않았습니다 (Nygaard와 Dahl이 엄청난 사상가와 디자이너라고 생각했지만). 그래서 상속을 더 잘 이해할 때까지 상속 기능을 기본 제공 기능으로 사용하지 않기로 결정했습니다.

이 아키텍처에 대한 나의 원래 실험은 van Wijngaarten과 Wirth의 "Algol의 일반화"및 Wirth의 오일러에서 개조 한 모델을 사용하여 수행되었습니다. 둘 다 LISP와 비슷하지만보다 일반적인 읽기 쉬운 구문이 있습니다. 그때 나는 유형 금속 언어에 대한 괴물 LISP 아이디어를 이해하지 못했지만 Irons의 IMP를 포함한 다양한 소스에서 나오는 확장 가능한 언어에 대한 아이디어와 거의 비슷했습니다.

이것의 두 번째 단계는 LISP를 최종적으로 이해 한 다음이 이해를 사용하여 훨씬 더 좋고 작고 강력하며 더 늦은 기반 구조를 만드는 것입니다. Dave Fisher의 논문은 "McCarthy"스타일로 수행되었으며 확장 가능한 제어 구조에 대한 그의 아이디어는 매우 도움이되었습니다. 이 시점에서 또 다른 큰 영향은 Carl Hewitt의 PLANNER였습니다 (Prolog를 얼마나 잘, 얼마나 빨리 예측할 수 있었는지에 따라 인정을받지 못했습니다).

Xerox PARC의 원래 스몰 토크는 위의 내용에서 나왔습니다. 그 이후의 스몰 토크는 역사 장의 끝에서 불평합니다 : 그것들은 시뮬 라쪽으로 밀려 났고 확장 메커니즘을 유용한 곳으로 더 안전한 것으로 대체하지 않았습니다.

"객체 지향 [프로그래밍]"은 무엇을 의미합니까? (자습서와 같은 소개는 필요하지 않으며 가능한 경우 독자에게 친숙한 다른 개념으로 "상속, 다형성 및 캡슐화로 프로그래밍"과 같은 간단한 설명 만 있으면됩니다. 또한 "개체를 설명 할 필요는 없습니다. "Smalltalk의 초기 역사"에서 "개체"에 대한 설명이있는 소스가 이미 있기 때문입니다.)

(나는 형식에 반대하지 않지만 완전히 고통스럽지 않은 형식 시스템을 알지 못하므로 여전히 동적 입력을 좋아합니다.)

나에게 OOP는 메시징, 로컬 보존 및 상태 프로세스 숨기기 및 모든 것의 극단적 인 바인딩을 의미합니다. 스몰 토크와 LISP에서 수행 할 수 있습니다. 이것이 가능할 수있는 다른 시스템이있을 수 있지만 나는 그것들을 모른다.

[또한] 언급 한 것 중 하나는 Simula가 촉매 작용을하는 두 가지 주요 경로가 있다는 것입니다. 초기는 (우연히 우연히) 내가 가져간 bio / net 비 데이터 절차 경로였습니다. 연구 대상으로 조금 후에 온 다른 하나는 추상적 데이터 유형이었고, 이것은 훨씬 더 많은 놀이를 얻었습니다.

우리가 전체 역사를 살펴보면, 우리는 프로토 -OOP 재료가 ADT로 시작했고, 내가 "개체"라고 부르는 것에 약간의 포크가 있었는데, 이것이 스몰 토크 등을 야기 시켰지만 작은 포크 후에는 CS 설립은 ADT를 거의 수행했으며 데이터 절차 패러다임을 고수하기를 원했습니다. 역사적으로, USAF Burroughs 220 파일 시스템 (Smalltalk 기록에서 설명)은 MIT (AED 및 이전)의 Doug Ross의 초기 작업 인 데이터 구조의 내장 프로 시저 포인터 인 Sketchpad ( 완전 다형성-예를 들어 데이터 구조에서 동일한 오프셋은 "표시"를 의미하고 구조가 나타내는 객체 유형 등에 대한 적절한 루틴에 대한 포인터가 있으며, Burroughs B5000, 프로그램 참조 테이블은 "큰 객체"이고 "data"와 "procedures"에 대한 포인터를 포함하지만 데이터를 추적하고 프로 시저 포인터를 찾은 경우 올바른 작업을 수행 할 수 있습니다. 초기 유타 문제로 해결 한 첫 번째 문제는 메서드와 개체 만 사용하여 "데이터가 사라지는"문제였습니다. 60 년대 말 Bob Balzer는 "Dataless Programming"이라는 아주 멋진 논문을 썼고, 그 후 John Reynolds는 똑같이 멋진 논문 인 "Gedanken"(1970 년에 람다 사용)을 썼다. 올바른 방법으로 표현하면 절차에 의해 데이터를 추상화 할 수 있습니다. 그러나 데이터를 따르고 프로 시저 포인터를 찾은 경우 종종 올바른 일을 할 수 있습니다. 초기 유타 문제로 해결 한 첫 번째 문제는 메서드와 개체 만 사용하여 "데이터가 사라지는"문제였습니다. 60 년대 말 Bob Balzer는 "Dataless Programming"이라는 아주 멋진 논문을 썼고, 그 후 John Reynolds는 똑같이 멋진 논문 인 "Gedanken"(1970 년에 람다 사용)을 썼다. 올바른 방법으로 표현하면 절차에 의해 데이터를 추상화 할 수 있습니다. 그러나 데이터를 따르고 프로 시저 포인터를 찾은 경우 종종 올바른 일을 할 수 있습니다. 초기 유타 문제로 해결 한 첫 번째 문제는 메서드와 개체 만 사용하여 "데이터가 사라지는"문제였습니다. 60 년대 말 Bob Balzer는 "Dataless Programming"이라는 아주 멋진 논문을 썼고, 그 후 John Reynolds는 똑같이 멋진 논문 인 "Gedanken"(1970 년에 람다 사용)을 썼다. 올바른 방법으로 표현하면 절차에 의해 데이터를 추상화 할 수 있습니다.

데이터가 아닌 개체를 좋아하는 사람들은 더 적었고, 나 자신, Carl Hewitt, Dave Reed 및 기타 몇 명을 포함했습니다.이 그룹의 대부분은 ARPA 커뮤니티에서 왔으며 기본 계산 단위가 전체 컴퓨터 인 ARPAnet → 인터넷 설계. 그러나 70 년대와 80 년대에 걸쳐 어떤 아이디어가 완고하게 매달려있을 수 있는지를 보여주기 위해 많은 사람들이 객체와 메시지를 생각하는 대신 "원격 프로 시저 호출"을 시도했습니다. Sic 대중 교통 gloria mundi.

건배,

앨런 케이


1
HTTP / 1.1 403 액세스가 거부되었습니다.
Job

1
나는 단지 그것에 접근 할 수 있었기 때문에 일시적인 문제 였을 것이다. 그 연결에 감사합니다, Manoj.
David Conrad

2
@Job Wednesday (3 월 16 일, 분명히 403 오류가 발생한 날)는 도메인 관리자의 월간 서비스 날짜 (userpage.fu-berlin.de)입니다. 그들은 한 달에 한 번 정기적으로 네트워크의 일부를 오프라인 상태로 만듭니다. 어, 그래, 묻지마…
Konrad Rudolph

"데이터를 제거하고 싶었습니다"라는 의미를 명확하게 설명 할 수 있습니까? 데이터는 OO의 필수적인 부분입니다 (즉, 종종 클래스에 캡슐화되거나 클래스로 전달되거나 클래스에서 전달됨). 패러다임이 사용되는 모든 것이 패러다임에 관계없이 컴퓨팅에서 데이터 없이는 할 수 없으므로 데이터를 제거하는 것은 의미가 없습니다. .
Dennis

1
<-이었다 원래 스몰 토크 할당 연산자
DangerMouse

22

Alan Kay가 객체 지향으로 의미 한 모든 것이 Smalltalk 언어로 구현 된 것은 아닙니다 .

또한 http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models :

Alan Kay는 메시지 전달이 OOP의 객체보다 중요하며 객체 자체가 지나치게 강조된다고 주장했습니다. 라이브 분산 객체 프로그래밍 모델은이 관찰을 기반으로합니다. 분산 데이터 흐름의 개념을 사용하여 고급 기능적 사양을 사용하여 메시지 패턴 측면에서 복잡한 분산 시스템의 동작을 특성화합니다.

18
그런 다음 왜 그가 "메시지 지향"이 아니라 "오브젝트 지향"이라고 불렀는지 궁금합니다.
David Thornley

@David Thornley : C ++을 메소드 중심으로 만들 것입니까?
back2dos

60
60 년대로 돌아가서이 용어에 대해 너무나 불쾌했고 "메시지 중심"과 같은 것을 선택 했어야합니다.
Alan Kay

1
그러나 "메시지 지향"이란 무엇입니까? (비동기 호출을 생각할 수는 있지만 실제로는 "정상적인"메소드를 구현하지 않는 언어를 모르는 경우 반환 값에 관한 문제도 있지만 ' ref '/'out '매개 변수 또는 이와 유사한 것)
mlvljr

1
"메시지 지향"은 기본적으로 늦은 바인딩 / 동적 타이핑입니다. 객체에 전달 된 메시지는 런타임에 (해당 객체에 의해) 분석됩니다.
Mark Cidade

6

Alan Kay가 객체 지향으로 의미 한 모든 것이 Smalltalk 언어로 구현 된 것은 아닙니다.

"우리는 PARC에서 모든 아이디어를 다 수행하지는 못했습니다. 원래 스몰 토크에서 나온 많은 Carl Hewitt의 Actors 아이디어는 후속 스몰 토크보다 OOP의 정신에 더 많았습니다. Erlang의 상당 부분은 실제 OOP 언어와 비슷합니다. 현재 스몰 토크, 그리고“OOP 페인트”로 칠해진 C 기반 언어들.

Alan Kay의 의견 :

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/


Alan Kay의 의견에 대한 직접 링크는 다음과 같습니다. computinged.wordpress.com/2010/09/11/…
icc97

전체 의견은 매우 유용하며이 질문에 대한 잠재적 인 답변으로 시작합니다. ""객체 지향 "이라고 생각하는 대규모 시스템의 좋은 예는 인터넷입니다. 수십억 개의 완전히 캡슐화 된 객체 (컴퓨터 자체)와 사용 "명령이 아닌 요청"등의 순수한 메시징 시스템
icc97

5

Alan Kay와 Jim Coplien 등의 작업을 수행하면서 얻은 주요 요점 중 하나는 진정한 "객체"지향 프로그래밍이 컴퓨터와 소프트웨어를 HUMAN / USER 정신 모델이 아닌 모델링하는 것입니다. 프로그래머를위한 도구입니다.

알다시피, OOP의 Alan의 비전은 컴퓨터를 인간 사용자가 원하는대로 만들 수있는 도구로 만드는 것이 었습니다. 컴퓨터의 모든 기능은 직관적 인 대화 형 모델을 통해 최종 사용자에게 직접 노출됩니다. 코드를 통해서가 아니라 런타임 객체와 상호 작용을 직접보고 조각 할 수 있어야합니다.

다음은 개념 증명으로 JavaScript에서 일부 버전을 시도하려는 계획에 대한 게시물입니다. http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

Jim Coplien은 소프트웨어 개발 / 프로그래밍의 관점에서 코드가 어떻게 사용자의 정신적 모델과 유사해야하는지에 대해 이야기합니다. 즉, 코드는 행동을 설명하는 사람이 소리를내는 것과 거의 같은 방식으로 읽습니다. 이것은 클래스와 유형이 아닌 객체의 관점에서 생각함으로써 달성됩니다. 동작은 객체의 IDENTITY 정의의 일부가 아니라 객체가 수행 한 역할의 관점에서 설명됩니다. 오브젝트와 관련하여 상호 작용을 모델링 할 수 있어야하며 이는 상호 작용에서 재생하는 ROLE에 의해 식별됩니다. 웨이터, 고객, 출납원, 소스 계정, 대상 계정 등 인간의 정신 모델이 작동하는 방식입니다. 이들은 유형이 아니라 역할이며, "이 시점에서 어떤 대상이이 역할을 수행하는지에 대한 방법을 정의 할 수 있습니다. ",


DDD는 유사한 개념을 사용합니다. 아마 당신은 이것에 대해 옳습니다. :-)
inf3rno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.