Existe-t-il des langages de programmation orientés objet qui ne sont pas basés sur des classes?

44

Existe-t-il des langages de programmation orientés objet qui ne sont pas basés sur le paradigme de classe?

gaffes
la source
1
Techniquement, c. Bien que l’ orientation soit assez difficile dans le sens de la langue. Je sais que ce n’est pas le type de réponse que vous recherchez, mais si vous voulez voir comment C peut le faire, cela vous donnera peut-être une idée de ce que les classes font réellement et de la façon dont les approches alternatives peuvent fonctionner.
Kylben
4
@kylben: "Orienté" est un étirement inattendu. Vous pouvez matraquer C en un comportement orienté objet. Vous ne pouvez pas le matraquer pour qu'il soit orienté de cette façon.
David Thornley

Réponses:

74

Autant que je sache, Self est la langue d'origine qui a inventé le paradigme "sans classe" basé sur des prototypes . Il existait déjà (à un stade expérimental) dans les années 1980 et pousse à l'extrême l' utilisation élégante du modèle prototype par Smalltalk , de telle sorte que les classes sont complètement éliminées.

Cela a influencé toutes les autres langues OO "sans classe" que je connais:

  • le plus souvent, Javascript,
  • le langage de programmation classique et l'environnement Squeak (qui est construit sur Smalltalk)
  • le langage de script multi-paradigme Lua .
DaveFar
la source
2
@Adam: sans typage statique, tout n'est-il pas que du sucre syntaxique?
kevin cline
5
@DeadMG Le langage OO n'est pas celui qui vous permet de mettre en œuvre des idées OO mais celui qui le fait pour vous :)
Piotr Dobrogost
4
En fait, Simula (1960) et Smalltalk-71 (ainsi que Smalltalk-72) n'avaient pas non plus de classes, ce qui est antérieur à Self de près de trois décennies. Les classes n'ont été ajoutées que dans Simula-67 et Smalltalk-74 (et Alan Kay les considérait comme une erreur ou plus précisément un mal nécessaire).
Jörg W Mittag
2
@ kevincline: Vous ne savez pas sur quoi vous vous basez; OO et le typage statique sont complètement orthogonaux.
Paul Biggar
2
Outre Simula (qui a repris le paradigme de la classe), Flavors a été introduit au MIT en 1979 et a été un précurseur du CLOS, tous deux antérieurs à Self.
Matthew Flynn
32

Les langages tels que JavaScript sont basés sur des prototypes , dans lesquels le comportement est réutilisé en clonant des objets existants. L'article de Wikipedia que j'ai lié à indique que Lua, ActionScript et un certain nombre d'autres langages suivent ce paradigme.

Thomas Owens
la source
2
Toute variante ECMAScript utilise le paradigme du prototype.
zzzzBov
Eh bien, presque toutes les variantes. ActionScript (le langage Flash) utilise des classes, bien que la machine virtuelle sous-jacente puisse les implémenter en termes de prototypes.
Mjfgates
@mjfgates, Actionscript 2 était autrefois basé sur ECMAScript et ressemblait beaucoup à Javascript. Actionscript 3 s'en éloigne, mais conserve sa nature dynamique. Vous pouvez taper fort / faible n’importe quelle variable puisque tout est essentiellement un objet.
J_A_X
13

Le langage de programmation orienté objet le plus populaire dans le monde ne possède pas de classes, il s'appelle Javascript et est basé sur un prototype: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
la source
11
"Le langage de programmation orienté objet le plus populaire au monde"? Je ne suis pas sûr de cette revendication du tout.
Thomas Owens
8
@ThomasOwens, en raison de son inclusion sur le Web, vous pouvez facilement dire que chaque plate-forme moderne compatible Web (y compris les appareils mobiles) comprend un interprète JavaScript. C’est un très bon exemple du fait qu’il s’agisse actuellement du langage le plus populaire basé sur des prototypes. (sauf si vous pensez que vous pouvez faire un argument similaire pour "SELF")
riwalk
1
Javascript est certainement l'un des langages de programmation les plus utilisés dans le monde, mais je m'attendrais à ce que la plupart des usages soient tout à fait anciens impératifs ou procéduraux, avec peut-être un peu de programmation orientée aspect (callbacks? AJAX? Gestionnaires d'événements?) Ici et là, appeler javascript le «langage OOP le plus populaire» n'est pas tout à fait justifié.
tdammers
9
Je dirais aussi "omniprésent" pour éviter une discussion sur le bien-fondé de sa popularité.
Anthony Pegram
3
@ Stargazer712: Je n'aime pas être un langage bigot, mais il affirme que "le langage de programmation orienté objet le plus populaire au monde [ed: Javascript] n'a pas de cours". Il peut être décomposé en deux revendications: "Javascript est le langage de programmation orienté objet le plus populaire" et "Javascript n'a pas de classes"; les deux, je suis d'accord avec.
Lie Ryan
6

L'orientation objet est un terme générique qui désigne plusieurs concepts importants qui ne sont que partiellement contingents. Par exemple, l'héritage peut être déclaré au cas par cas entre instances plutôt qu'entre classes, ou la classe entière peut être représentée par un prototypeobjet concret , comme l'a écrit Thomas. Il est plus habituel de séparer la description de la structure de la création d'instance. De même, une liaison tardive signifie que les objets ayant théoriquement la même méthode ne font pas nécessairement la même chose quand elle est invoquée et que la décision est prise au moment de l'exécution. C’est également possible avec l’approche basée sur un prototype. Et l’encapsulation est essentiellement indépendante du fait que vos objets soient des instances de classes déclarées ou non.

Cela dit, la plupart des langues OO sont fermement ancrées dans le camp des classes. Mais même dans ce cas, certains idiomes sont flous: la conception pilotée par le domaine conduit souvent à des systèmes dans lesquels l’identité d’objets particuliers est beaucoup plus importante que le diagramme de classes statique, et les décorateurs permettent aux objets de la même classe ou de la même interface comportement différent.

Kilian Foth
la source
6

La forteresse est un langage orienté objet basé sur des traits plutôt que sur des classes. La différence réside principalement dans la composition de la mise en œuvre. Le comportement d'un objet (définitions de méthodes) est toujours déterminé par les déclarations en un point spécifique du texte du programme. En ce sens, cela ressemble aux systèmes basés sur des classes.

Il y a des calculs d'objet (de Cardelli, je pense), qui sont purement basés sur des objets. Chaque méthode est un membre d'instance. Vous formez de nouveaux objets en reprenant le contenu d'un objet existant et en ajoutant, supprimant ou remplaçant certains de ses membres. C'est un peu différent des prototypes, car le nouvel objet n'a aucun lien avec l'ancien, mais seulement une partie de son contenu.

IIRC, il est possible de programmer de manière similaire en utilisant Python et d’autres langages orientés hashtable: vous pouvez ajouter une fonction en tant que membre d’instance, puis l’appeler en tant que méthode.

Ryan Culpepper
la source
5

Ada, depuis sa révision de 1995, Ada est orienté objet, mais contrairement à beaucoup d'autres langages OO, il ne combine pas les types et les modules orientés objet dans une construction unique appelée "classe". Plutôt que de déclarer un type en tant que "classe Foo" et de placer toutes les déclarations de méthode associées dans la déclaration de classe, vous déclarez un package et déclarez le type (en tant que a record) et d'autres éléments à l'intérieur du package. Ce n'est pas "sans classe" de la même manière que certaines des autres langues mentionnées, c'est juste une manière légèrement différente d'organiser les choses.

Les fonctionnalités orientées objet d'Ada 95 ont été ajoutées à la version 1983 existante du langage; il a étendu les constructions d'enregistrement et de package existantes pour prendre en charge héritage et al.

Keith Thompson
la source
c'est ce dont je me souvenais, vous devez également transmettre votre dossier à chaque fonction membre
Nikko,
@ Nikko: C'est ce qui se passe dans les coulisses de tous les langages orientés objet et assez explicitement en Python et CLOS (Common Lisp).
Marcin
5

Io est un autre langage orienté objet basé sur un prototype. Il s’inspire en réalité de plusieurs des langues déjà mentionnées dans d’autres réponses.

Io est un langage de programmation dynamique basé sur un prototype. Les idées dans Io sont principalement inspirées de Smalltalk (toutes les valeurs sont des objets), Self (basé sur un prototype), NewtonScript (héritage différentiel), Act1 (acteurs et futures pour la concurrence), Lisp (le code est une arborescence pouvant être inspectée / modifiable à l'exécution) et Lua (petit, incorporable).

Zsolt Török
la source
4

Erlang. Et oui, Erlang est un langage orienté objet, car il remplit les trois points de la définition de OO.

Jörg W Mittag
la source