Esistono linguaggi di programmazione orientati agli oggetti che non sono basati sulla classe?


44

Esistono linguaggi di programmazione orientati agli oggetti che non si basano sul paradigma di classe?


1
Tecnicamente parlando, C. Anche se orientato è piuttosto allungato nel senso del linguaggio che lo rende facile. So che non è il tipo di risposta che stai cercando, ma se ti interessa esaminare come C può farlo, potrebbe fornire una visione di ciò che effettivamente fanno le classi e di come gli approcci alternativi possono funzionare.
kylben,

4
@kylben: "Oriented" è un allungamento non richiesto. Puoi confondere C in un comportamento orientato agli oggetti. Non puoi confonderlo con l'essere orientato in quel modo.
David Thornley,

Risposte:


74

Per quanto ne so, il è il linguaggio originale che ha inventato il paradigma "senza classi" basato su prototipi . Esisteva già (in una fase sperimentale) negli anni '80 e spinge all'estremo l' utilizzo elegante del modello prototipo di Smalltalk , in modo tale che le classi vengano completamente eliminate.

Ha influenzato tutte le altre lingue OO "senza classi" che conosco:

  • soprattutto JavaScript,
  • il linguaggio di programmazione classico e l'ambiente Squeak (che si basa su Smalltalk)
  • il linguaggio di script multi-paradigma Lua .

2
@Adam: senza tipizzazione statica, TUTTO non è solo zucchero sintattico?
Kevin Cline,

5
@DeadMG Il linguaggio OO non è quello che ti consente di implementare idee OO ma quello che lo fa per te :)
Piotr Dobrogost,

4
In realtà, sia Simula (1960) che Smalltalk-71 (così come Smalltalk-72) non avevano classi, che precedono il Sé di quasi tre decenni. Le classi furono aggiunte solo in Simula-67 e Smalltalk-74 (e Alan Kay le considerò un errore, o più precisamente un male necessario).
Jörg W Mittag,

2
@kevincline: non sono sicuro su cosa stai basando questo; OO e tipizzazione statica sono completamente ortogonali.
Paul Biggar,

2
Oltre a Simula (che ha assunto il paradigma di classe) Flavors è stato presentato al MIT nel 1979, ed era un precursore di CLOS, entrambi precedenti al Sé.
Matthew Flynn,

32

Lingue come JavaScript si basano su prototipi , in cui il comportamento viene riutilizzato clonando oggetti esistenti. L'articolo di Wikipedia che ho collegato indica che Lua, ActionScript e un certo numero di altre lingue seguono questo paradigma.


2
Qualsiasi variante ECMAScript utilizza il paradigma del prototipo.
zzzzBov,

Bene, quasi ogni variante. ActionScript (il linguaggio Flash) utilizza le classi, sebbene la VM sottostante potrebbe implementarle in termini di prototipi.
mjfgates,

@mjfgates, Actionscript 2 era basato su ECMAScript e somigliava molto a Javascript. Actionscript 3 si sta allontanando da quello, ma mantiene ancora la sua natura dinamica. Puoi digitare forte / debole qualsiasi variabile poiché in sostanza tutto è un oggetto.
J_A_X,

13

Il linguaggio di programmazione orientato agli oggetti più popolare al mondo non ha lezioni, si chiama Javascript ed è basato su prototipi: http://en.wikipedia.org/wiki/Prototype-based_programming


11
"Il linguaggio di programmazione orientato agli oggetti più popolare al mondo"? Non sono affatto sicuro di tale affermazione.
Thomas Owens

8
@ThomasOwens, grazie alla sua inclusione sul web, puoi facilmente dire che ogni moderna piattaforma abilitata al web (compresi i dispositivi mobili) ha un interprete JavaScript incluso. Questo è un caso molto forte che attualmente è il linguaggio basato sui prototipi più popolare esistente. (a meno che non si pensa di poter fare un discorso analogo per "self")
riwalk

1
Javascript è sicuramente uno dei linguaggi di programmazione più utilizzati al mondo, ma mi aspetto che la maggior parte degli usi sia semplicemente un vecchio imperativo o procedurale, con forse un po 'di programmazione orientata all'aspetto (callback? AJAX? Gestori di eventi?) Qui e lì, quindi chiamare javascript il "linguaggio OOP più popolare" non è del tutto giustificato.
tdammers,

9
Direi anche "onnipresente" per evitare una discussione sul merito della sua popolarità.
Anthony Pegram,

3
@ Stargazer712: Non mi piace essere un fanatico del linguaggio, ma afferma che "il linguaggio di programmazione orientato agli oggetti più popolare al mondo [ed: Javascript] non ha classi". Può essere scomposto in due modi: "Javascript è il linguaggio di programmazione orientato agli oggetti più popolare" e "Javascript non ha classi"; entrambi sono d'accordo.
Lie Ryan,

6

L'orientamento agli oggetti è un termine generico per diversi concetti importanti che sono solo parzialmente dipendenti l'uno dall'altro. Ad esempio, l'ereditarietà può essere dichiarata caso per caso tra istanze anziché tra classi, oppure l'intera classe può essere rappresentata da un prototypeoggetto concreto , come ha scritto Thomas. È solo più normale separare la descrizione della struttura dalla creazione dell'istanza. Allo stesso modo, l'associazione tardiva significa che gli oggetti nominalmente con lo stesso metodo non fanno necessariamente la stessa cosa quando vengono invocati e che la decisione viene presa in fase di esecuzione. Ciò è anche possibile con l'approccio basato sul prototipo. E l'incapsulamento è essenzialmente completamente indipendente dal fatto che i tuoi oggetti siano o meno istanze di classi dichiarate.

Detto questo, la maggior parte delle lingue OO sono saldamente nel campo di classe. Ma anche allora ci sono modi di dire che sfocano la linea: il design guidato dal dominio spesso porta a sistemi in cui l'identità di oggetti particolari è molto più importante del diagramma di classe statico e i decoratori consentono agli oggetti della stessa classe o interfaccia di avere molto comportamento diverso.


6

Fortezza è un linguaggio orientato agli oggetti basato su tratti anziché su classi. La differenza sta principalmente nella composizione dell'attuazione. Il comportamento di un oggetto (definizioni dei metodi) è ancora determinato dalle dichiarazioni in un punto specifico nel testo del programma. Quindi in questo senso è simile ai sistemi basati su classi.

Ci sono calcoli di oggetti (di Cardelli, credo), che sono puramente basati su oggetti. Ogni metodo è un membro di istanza. Si formano nuovi oggetti prendendo il contenuto di un oggetto esistente e aggiungendo, rimuovendo o sostituendo alcuni dei suoi membri. È leggermente diverso dai prototipi, poiché il nuovo oggetto non ha collegamenti al vecchio oggetto, solo alcuni dei suoi contenuti.

IIRC, è possibile programmare in modo simile utilizzando Python e altri linguaggi orientati alla hash: è possibile aggiungere una funzione come membro di istanza e quindi chiamarla come metodo.


5

Ada, a partire dalla sua revisione del 1995, Ada è orientata agli oggetti, ma a differenza di molti altri linguaggi OO non combina tipi e moduli orientati agli oggetti in un unico costrutto chiamato "classe". Anziché dichiarare un tipo come "classe Foo" e inserire tutte le dichiarazioni dei metodi associati all'interno della dichiarazione di classe, si dichiara un pacchetto e si dichiara il tipo (come a record) e altre cose all'interno del pacchetto. Non è "privo di classi" come lo sono alcune delle altre lingue menzionate, è solo un modo leggermente diverso di organizzare le cose.

Le caratteristiche orientate agli oggetti di Ada 95 furono aggiunte alla versione esistente del 1983 del linguaggio; ha esteso i record esistenti e i costrutti del pacchetto per supportare l'ereditarietà et al.


questo è quello che mi sono ricordato, inoltre è necessario passare il record a ciascuna funzione membro
Nikko,

@Nikko: Questo è ciò che accade dietro le quinte in ogni linguaggio orientato agli oggetti, e in modo abbastanza esplicito in Python e CLOS (lisp comune).
Marcin,

5

Io è un altro linguaggio orientato agli oggetti basato sui prototipi. In realtà trae ispirazione da molte delle lingue già menzionate in altre risposte.

Io è un linguaggio di programmazione dinamico basato su prototipo. Le idee in Io sono per lo più ispirate a Smalltalk (tutti i valori sono oggetti), Self (basato su prototipo), NewtonScript (eredità differenziale), Act1 (attori e futuri per la concorrenza), Lisp (il codice è un albero ispezionabile / modificabile in runtime) e Lua (piccola, integrabile).


4

Erlang. E sì, Erlang è un linguaggio orientato agli oggetti, in quanto soddisfa tutti e tre i punti della definizione di OO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.