Czy istnieją obiektowe języki programowania, które nie są oparte na klasach?

44

Czy są jakieś zorientowane obiektowo języki programowania, które nie są oparte na paradygmacie klas?

błędy
źródło
1
Technicznie rzecz biorąc, C. Chociaż zorientowany jest dość rozciągnięty w sensie języka, co ułatwia. Wiem, że nie jest to odpowiedź, której szukasz, ale jeśli zastanawiasz się, jak C może to zrobić, może dać pewien wgląd w to, co faktycznie robią klasy i jak mogą działać alternatywne podejścia.
kylben
4
@kylben: „Oriented” to niesprawiedliwy odcinek. Możesz obrócić C w zachowanie obiektowe. Nie da się tego tak nastawić.
David Thornley,

Odpowiedzi:

74

O ile mi wiadomo, Self jest oryginalnym językiem, który wynalazł paradygmat „bezklasowy” oparty na prototypach . Istniał już (w fazie eksperymentalnej) w latach 80. XX wieku i popycha eleganckie wykorzystanie prototypowego wzoru Smalltalk do granic możliwości, dzięki czemu klasy są całkowicie eliminowane.

Wpłynął na wszystkie inne znane mi języki OO „bezklasowe”:

  • najbardziej widoczny Javascript,
  • klasyczny język programowania i środowisko Squeak (który jest zbudowany na Smalltalk)
  • wielojęzyczny język skryptowy Lua .
DaveFar
źródło
2
@Adam: bez pisania statycznego, czy WSZYSTKO nie jest tylko cukrem syntaktycznym?
kevin cline,
5
@DeadMG Język OO nie jest tym, który umożliwia wdrażanie pomysłów OO, ale tym, który robi to za Ciebie :)
Piotr Dobrogost,
4
W rzeczywistości zarówno Simula (1960), jak i Smalltalk-71 (jak również Smalltalk-72) również nie miały zajęć, które wyprzedzają Jaźń o prawie trzy dekady. Klasy dodano tylko w Simula-67 i Smalltalk-74 (a Alan Kay uważał je za błąd, a ściślej za zło konieczne).
Jörg W Mittag,
2
@kevincline: Nie jestem pewien, na czym to bazujesz; OO i pisanie statyczne są całkowicie ortogonalne.
Paul Biggar
2
Oprócz Simuli (która przyjęła paradygmat klasowy) w MIT w 1979 r. Wprowadzono smaki, które były prekursorem CLOS, z których oba były wcześniejsze niż jaźń.
Matthew Flynn
32

Języki takie jak JavaScript opartena prototypach , w których zachowanie jest ponownie wykorzystywane przez klonowanie istniejących obiektów. Artykuł w Wikipedii, do którego odsyłam, wskazuje, że Lua, ActionScript i wiele innych języków są zgodne z tym paradygmatem.

Thomas Owens
źródło
2
Każdy wariant ECMAScript wykorzystuje paradygmat prototypu.
zzzzBov,
Cóż, prawie każdy wariant. ActionScript (język Flash) korzysta z klas, chociaż maszyna wirtualna będąca podstawą może implementować je w postaci prototypów.
mjfgates
@mjfgates, Actionscript 2 był kiedyś oparty na ECMAScript i bardzo przypominał Javascript. ActionScript 3 odchodzi od tego, ale nadal ma swoją dynamiczną naturę. Możesz silnie / słabo wpisać dowolną zmienną, ponieważ w zasadzie wszystko jest Obiektem.
J_A_X
13

Najpopularniejszy obiektowy język programowania na świecie nie ma klas, nazywa się Javascript i jest oparty na prototypach: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
źródło
11
„Najpopularniejszy obiektowy język programowania na świecie”? Nie jestem wcale pewien tego twierdzenia.
Thomas Owens
8
@ThomasOwens, dzięki włączeniu do sieci, można łatwo powiedzieć, że każda nowoczesna platforma z obsługą sieci (w tym urządzenia mobilne) ma dołączony interpreter JavaScript. To bardzo silny przypadek, że jest to obecnie najpopularniejszy język oparty na prototypach. (chyba, że ​​uważasz, że możesz zrobić podobny argument dla „SELF”)
riwalk
1
JavaScript jest z pewnością jednym z najczęściej używanych języków programowania na świecie, ale spodziewałbym się, że większość zastosowań będzie po prostu stara imperatywna lub proceduralna, z być może nieco programowaniem zorientowanym na aspekty (obsługa zwrotna? AJAX? Procedury obsługi zdarzeń?) Tutaj i tam nazwanie javascript „najpopularniejszym językiem OOP” nie jest całkiem uzasadnione.
tdammers
9
Powiedziałbym również „wszechobecny”, aby uniknąć dyskusji na temat zalet jego popularności.
Anthony Pegram,
3
@ Stargazer712: Nie lubię być bigotem językowym, ale twierdzi, że „najpopularniejszy obiektowy język programowania na świecie [ed .: Javascript] nie ma klas”. Można go rozłożyć na dwa twierdzenia: „JavaScript jest najpopularniejszym obiektowym językiem programowania” i „Javascript nie ma klas”; oba, zgadzam się z tym.
Lie Ryan,
6

Orientacja obiektowa to ogólny termin na kilka ważnych pojęć, które tylko częściowo zależą od siebie. Na przykład, dziedziczenie może być zadeklarowane indywidualnie dla poszczególnych przypadków między instancjami, a nie między klasami, lub cała klasa może być reprezentowana przez konkretny prototypeobiekt, jak napisał Thomas. Po prostu częściej oddziela się opis struktury od tworzenia instancji. Podobnie późne wiązanie oznacza, że ​​obiekty przy użyciu nominalnie tej samej metody niekoniecznie robią to samo po jej wywołaniu i że decyzja jest podejmowana w czasie wykonywania. Jest to również możliwe dzięki podejściu opartemu na prototypach. A enkapsulacja jest zasadniczo całkowicie niezależna od tego, czy Twoje obiekty są instancjami zadeklarowanych klas, czy nie.

To powiedziawszy, większość języków OO jest zdecydowanie w obozie klasowym. Ale nawet wtedy istnieją idiomy, które zacierają linię: projekt oparty na domenie często prowadzi do systemów, w których tożsamość poszczególnych obiektów jest znacznie ważniejsza niż schemat klasy statycznej, a dekoratorzy pozwalają obiektom tej samej klasy lub interfejsu mieć bardzo inne zachowanie.

Kilian Foth
źródło
6

Fortress to zorientowany obiektowo język oparty na cechach zamiast klas. Różnica polega głównie na składzie implementacji. Zachowanie obiektu (definicje metod) jest nadal określane przez deklaracje w określonym punkcie tekstu programu. W tym sensie jest podobny do systemów opartych na klasach.

Są kalkulacje obiektowe (jak sądzę Cardelli), które są oparte wyłącznie na obiektach. Każda metoda jest członkiem instancji. Tworzysz nowe obiekty, biorąc zawartość istniejącego obiektu i dodając, usuwając lub zastępując niektóre z jego elementów. Różni się nieco od prototypów, ponieważ nowy obiekt nie ma linku do starego obiektu, tylko część jego zawartości.

IIRC można programować w podobny sposób za pomocą Pythona i innych języków zorientowanych na hashtable: możesz dodać funkcję jako element instancji, a następnie wywołać ją jako metodę.

Ryan Culpepper
źródło
5

Ada, od wersji z 1995 roku, Ada jest zorientowana obiektowo, ale w przeciwieństwie do wielu innych języków OO, nie łączy typów i modułów zorientowanych obiektowo w jedną konstrukcję zwaną „klasą”. Zamiast deklarować typ jako „klasę Foo” i umieszczać wszystkie powiązane deklaracje metod w deklaracji klasy, deklarujesz pakiet i deklarujesz typ (jako a record) i inne rzeczy w pakiecie. To nie jest „bezklasowe”, tak jak niektóre inne wspomniane języki, to tylko nieco inny sposób organizowania rzeczy.

Funkcje obiektowe Ada 95 zostały dodane do istniejącej wersji języka z 1983 roku; rozszerzył istniejące konstrukcje rekordów i pakietów, aby wesprzeć dziedziczenie i in.

Keith Thompson
źródło
to właśnie zapamiętałem, musisz także przekazać swój rekord każdej funkcji członka
Nikko,
@Nikko: Tak dzieje się za kulisami w każdym języku zorientowanym obiektowo i dość wyraźnie w Pythonie i CLOS (wspólne lisp).
Marcin
5

Io to kolejny oparty na prototypach język obiektowy. W rzeczywistości czerpie inspirację z kilku języków wspomnianych już w innych odpowiedziach.

Io to dynamiczny język programowania oparty na prototypach. Pomysły w Io są głównie inspirowane Smalltalk (wszystkie wartości są obiektami), Self (oparty na prototypach), NewtonScript (dziedziczenie różnicowe), Act1 (aktorzy i futures dla współbieżności), Lisp (kod jest drzewem kontrolowanym / modyfikowalnym w czasie wykonywania) i Lua (mały, do osadzenia).

Zsolt Török
źródło
4

Erlang. I tak, Erlang jest językiem obiektowym, ponieważ spełnia wszystkie trzy punkty definicji OO.

Jörg W Mittag
źródło