공통 리스프 객체 시스템
Common Lisp Object SystemCommon Lisp Object System(CLOS)은 ANSI Common Lisp의 일부인 객체 지향 프로그래밍을 위한 기능입니다.CLOS는 강력한 동적 객체 시스템으로, C++나 Java와 같은 정적인 언어에서 볼 수 있는 OOP 기능과는 근본적으로 다릅니다.CLOS는 MIT Flavors나 CommonLoops 등의 초기 Lisp 오브젝트 시스템에서 영감을 얻었지만 어느 쪽보다 일반적입니다.당초 애드온으로 제안되었던 CLOS는 Common Lisp의 ANSI 표준의 일부로서 채택되어 EuLisp나 Emacs [1]Lisp 등의 다른 Lisp 방언에 채택되었습니다.
특징들
CLOS의 기본 구성 요소는 메서드, 클래스, 이러한 클래스의 인스턴스 및 범용 함수입니다.CLOS는 다음과 같은 매크로를 제공합니다.defclass
,defmethod
,그리고.defgeneric
instance는 다음 방법으로 생성됩니다.make-instance
.
클래스에는 복수의 슈퍼클래스, 슬롯 리스트(C++/Java 용어의 멤버 변수) 및 특수한 메타클래스를 포함할 수 있습니다.슬롯은 클래스별로 할당할 수 있습니다(클래스의 모든 인스턴스가 슬롯을 공유합니다).또는 인스턴스별로 할당할 수 있습니다.각 슬롯에는 이름이 있으며 슬롯의 값은 함수를 사용하여 해당 이름으로 액세스할 수 있습니다.slot-value
슬롯의 값을 쓰거나 읽기 위한 특별한 범용 함수를 정의할 수 있습니다.CLOS 클래스의 각 슬롯에는 하나의 이름이 필요합니다.
CLOS는 다중 디스패치 시스템입니다.즉, 메서드는 필요한 인수 중 하나 또는 모두에 특화할 수 있습니다.대부분의 OO언어는 단일 디스패치입니다.즉, 메서드는 첫 번째 인수에만 특화되어 있습니다.또 다른 특이한 기능은 메서드가 클래스에 "속하지 않음"이며 클래스는 일반 함수 또는 메서드에 대한 네임스페이스를 제공하지 않습니다.메서드는 클래스와 별도로 정의되며 클래스 슬롯에 대한 특별한 액세스(예: "this", "self" 또는 "protected")가 없습니다.
CLOS의 메서드는 범용 함수로 분류됩니다.범용 함수는 함수와 같이 호출 가능하며 메서드의 집합을 공유 이름 및 인수 구조와 관련짓는 객체이며, 각각 다른 인수에 특화되어 있습니다.Common Lisp는 구조체 및 내장 데이터 유형(숫자, 문자열, 문자, 기호 등)에 대해 비 CLOS 클래스를 제공하므로 CLOS 디스패치는 이러한 비 CLOS 클래스에서도 작동합니다.CLOS는 개별 객체(eql 스페셜라이저)에 대한 디스패치도 지원합니다.디폴트로는 CLOS는 모든 공통 Lisp 데이터 타입에 대한 디스패치를 지원하지 않습니다(예를 들어 디스패치는 완전히 특수한 어레이 타입이나 에 의해 도입된 타입에 대해서는 기능하지 않습니다).deftype
단, 대부분의 공통 Lisp 구현에서는 범용 함수가 애플리케이션 고유의 전문화 및 디스패치 규칙을 제공할 수 있는 메타 오브젝트 프로토콜을 제공합니다.
CLOS에서의 디스패치는 대부분의 OO 언어와는 다릅니다.
- 인수 목록을 지정하면 적용 가능한 메서드 목록이 결정됩니다.
- 이 목록은 매개 변수 특수자의 특성에 따라 정렬됩니다.
- 그런 다음 이 목록에서 선택한 방법을 일반 함수에 의해 사용되는 방법 조합을 사용하여 효과적인 방법으로 결합합니다.
- 그런 다음 원래 인수를 사용하여 유효한 메서드가 호출됩니다.
이 디스패치 메커니즘은 런타임에 작동합니다.따라서 메서드를 추가하거나 제거하면 실행 시(같은 인수를 사용하여 일반 함수를 호출하는 경우에도) 유효한 메서드가 변경될 수 있습니다.방법 조합을 변경하면 효과적인 방법이 다를 수 있습니다.
예를들면,
; 공통 인수 구조 프로토타입을 선언합니다. (디제너릭 f (x y)) ; (f integer t)의 구현을 정의합니다.여기서 t는 모든 유형과 일치합니다. (디프로덕트 f ((x 정수) y) 1) (f 1 2.0) => 1 ; (f integer real)의 구현을 정의합니다. (디프로덕트 f ((x 정수) (y 진짜)) 2) (f 1 2.0) => 2 ;실행시에 디스패치가 변경되었습니다.
대부분의 동적 언어의 OO 시스템과 마찬가지로 CLOS는 캡슐화를 강제하지 않습니다.임의의 슬롯에 액세스 하려면slot-value
기능 또는 (옵션으로 자동 생성된)접근자 방식입니다.경유로 액세스 하려면slot-value
슬롯의 이름을 알아야 합니다.CL 프로그래머는 언어의 패키지 기능을 사용하여 내보내기 대상 함수 또는 데이터 구조를 선언합니다.
일반("프라이머리") 방법 외에:before
,:after
,그리고.:around
'유효한' 방식입니다.앞의 2개는 프라이머리 메서드 전후에 클래스 계층에 따라 특정 순서로 호출됩니다.안:around
method는 프라이머리 메서드의 실행 여부를 제어할 수 있습니다.또한 프로그래머는 클래스 계층을 따라 가능한 모든 프라이머리 메서드를 호출할지 또는 가장 가까운 일치를 제공하는 메서드만 호출할지 지정할 수 있습니다.
표준 방법-조합은 위에서 설명한 주요 방법, 이전 방법, 이후 방법 및 주변 방법을 제공합니다.다른 방법 유형과의 다른 방법 조합이 있습니다.새로운(단순하고 복잡한) 방법 조합과 방법 유형을 정의할 수 있습니다.
CLOS는 다중 상속을 허용합니다.여러 상속에서 메서드가 실행되는 기본 순서가 올바르지 않은 경우 프로그래머는 메서드 조합의 순서를 지정하여 다이아몬드 상속 문제를 해결할 수 있습니다.
CLOS는 동적입니다.즉, 콘텐츠뿐만 아니라 오브젝트의 구조도 런타임에 변경할 수 있습니다.CLOS는 (해당 클래스의 인스턴스가 이미 존재하는 경우에도) 클래스 정의를 즉시 변경할 수 있을 뿐만 아니라 를 통해 특정 인스턴스의 클래스 멤버십을 변경할 수 있습니다.change-class
교환입니다.CLOS에서는 실행 시 메서드를 추가, 재정의 및 삭제할 수도 있습니다.Circle-Elipse 문제는 CLOS에서 쉽게 해결되며, 대부분의 OOP 설계 패턴은 사라지거나 질적으로 단순해집니다.[2]
CLOS는 프로토타입 언어가 아닙니다.클래스를 정의해야 오브젝트를 해당 클래스의 멤버로 인스턴스화할 수 있습니다.
메타오브젝트
ANSI Common Lisp 표준 이외에 Metaobject Protocol(MOP)이라고 불리는 CLOS에 광범위하게 구현된 확장이 있습니다.MOP는 클래스, 슬롯 설명, 범용 함수 및 메서드 자체를 메타클래스의 인스턴스로 취급하는 CLOS 구현의 기초에 대한 표준 인터페이스를 정의하고 새로운 메타클래스의 정의와 모든 CLOS 동작의 변경을 가능하게 합니다.CLOS MOP의 유연성은 나중에 Gregor Kiczales와 같은 엔지니어가 개발한 측면 지향 프로그래밍을 구성합니다.MOP는 일련의 프로토콜로 객체 시스템 전체의 동작을 정의합니다.이것들은 CLOS의 관점에서 정의됩니다.따라서 제공된 CLOS 기능을 확장 또는 변경하여 새로운 오브젝트 시스템을 작성할 수 있습니다.The Art of the Metaobject Protocol(Metaobject Protocol)이라는 책에서는 CLOS MOP의 사용 및 구현에 대해 설명합니다.
다양한 공통 리스프 구현은 Meta-Object Protocol에 대해 약간 다른 지원을 가지고 있습니다.Closer 프로젝트는[3] 누락된 기능을 제공하는 것을 목적으로 합니다.
오래된 리스프 기반 객체 시스템의 영향
플레이버(및 그 후속 버전인 New Flavors)는 MIT 리스프 머신의 오브젝트 시스템입니다.Lisp Machine 운영 체제의 많은 부분과 이를 위한 많은 애플리케이션은 Flavors 또는 New Flavors를 사용합니다.Flavors는 여러 상속 및 믹스인을 도입했습니다.플레이버는 대부분 구식이지만 Common Lisp용 실장은 존재합니다.플레이버는 메시지 전달 패러다임을 사용하고 있었습니다.New Flavors는 범용 기능을 도입했습니다.
CommonLoops는 (Xerox Interlisp-D에서) LOUPS의 후속 버전입니다.Common Loops는 Common Lisp용으로 구현되었습니다.Portable Common Loops(PCL)라고 불리는 휴대용 구현은 CLOS의 첫 번째 구현입니다.PCL은 널리 이식되어 있으며, 여전히 여러 공통 리스프 구현의 CLOS 구현 기반을 제공합니다.PCL은 대부분 휴대용 Common Lisp로 구현되며, 일부 시스템 의존 부품만 포함되어 있습니다.
다른 프로그래밍 언어에서의 CLOS
CLOS의 파워와 표현력, TinyCLos(Gregor Kiczales가 스킴과 함께 사용하기 위해 작성한 간이 휴대용 CLOS 구현)의 역사적 가용성 때문에 CLOS와 같은 MOP 기반 객체 시스템은 대부분의 리스프 방언 구현에서 사실상의 표준이 되었습니다.또한 다른 언어에도 사용되고 있습니다.OP 설비:
- COS, C 객체[4] 시스템
- 딜런
- Dynace, C에서 (대부분[5]) CLOS 구현
- Emacs Lisp의 EIEIO
- Gauche, CLOS를 사용한 스킴
- GNU Guile의 GOOPS
- ISLISP의 ILOS
- Meroon, 스킴의 객체 시스템
- CLOS를 사용한 스킴인 궁수자리
- ScmObj, Scheme용
- MIT 스킴용 SOS
- STklos, CLOS를 사용한 스킴
- 사기꾼 인 라켓
- 치킨 스킴의 COOPS
- 스킬을 위한[6] VCLOS
- Tiny-CLOS[7]
추가 정보
- Bobrow, Daniel G.; Kahn, Kenneth; Kiczales, Gregor; Masinter, Larry; Stefik, Mark; Zdybel, Frank (June 1986). "CommonLoops: Merging Lisp and Object-Oriented Programming" (PDF). Conference proceedings on Object-oriented Programming Systems Languages and Applications. OOPSLA '86. pp. 17–29. doi:10.1145/28697.28700. ISBN 978-0-89791-204-4. S2CID 62631315. Retrieved 2022-03-17.
- Veitch, Jim (1998). "A History and Description of CLOS". In Salus, Peter H. (ed.). Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages (1st ed.). Macmillan Technical Publishing. pp. 107–158. ISBN 1-57870-011-6.
레퍼런스
- ^ "CLOS는 표준입니다.여러 벤더가 CLOS. CLOS(또는 그 일부)를 제공하고 있습니다.EuLisp나 EmacsLisp 등의 다른 리스프 방언에 오브젝트 오리엔테이션을 추가하기 위해 사용되고 있습니다." Veitch 1998 페이지 110
- ^ Peter Norvig는 "Design Patterns in Dynamic Languages" 슬라이드에서 다양한 교과서에서 가져온 23개의 디자인 패턴 중 16개가 Dylan 또는 Common Lisp에서 C++보다 "보이지 않거나 단순"하다는 연구 결과를 제시합니다.
- ^ 프로젝트 완료:MOP에 가깝다
- ^ Deniau, Laurent (12 March 2010). The C Object System: Using C as a High-Level Object-Oriented Language (PDF). arXiv:1003.2547. CiteSeerX 10.1.1.763.7946. Retrieved 2022-03-17.
- ^ C로의 Dynace 객체 지향 확장
- ^ Newton, Jim; Rhodes, Christophe (28 November 2008). "Custom Specializers in Object-Oriented Lisp". Journal of Universal Computer Science. 14 (20): 3370–3388. CiteSeerX 10.1.1.523.2413. doi:10.3217/jucs-014-20-3370. S2CID 12032836. Retrieved 2022-03-17.
- ^ Gregor Kiczales가 개발한 Tiny CLOS
문학.
- Sonya Keene, Common Lisp의 객체 지향 프로그래밍: A Programmer's Guide to CLOS, 1988, Addison-Wesley.ISBN 0-201-17589-4
- Gregor Kiczales, Jim des Rivieres 및 Daniel G. Bobrow, The Art of the Metaobject Protocol, 1991, MIT Press.ISBN 0-262-61074-4
- Jo A. Lawless와 Molly M. Miller, CLOS 이해: 공통 리스프 오브젝트 시스템, 1991, 디지털 프레스, ISBN 1-55558-064-5
- Andreas Paepcke, 객체 지향 프로그래밍: CLOS Perspective, 1993, MIT Press.ISBN 0-262-16136-2
- 일반적인 리스프 오브젝트 시스템: Richard P. Gabriel과 Linda DeMichiel의 개요는 일반적인 함수를 사용하여 클래스를 정의하는 동기를 잘 소개합니다.
- Nick Levine의 CLOS 기본은 CLOS에서 OOO 개념을 구현하고 이를 활용하는 방법에 대한 단계별 노출을 제공합니다.이 문서는 리스프 또는 스킴에 대한 기본 지식이 있는 모든 사용자를 대상으로 합니다.
- 공통 Lisp HyperSpec, 7장: 객체