¿Existen lenguajes de programación orientados a objetos que no estén basados ​​en clases?

44

¿Hay algún lenguaje de programación orientado a objetos que no esté basado en el paradigma de clase?

errores
fuente
1
Técnicamente hablando, C. Aunque orientado es bastante difícil en el sentido del lenguaje que lo hace fácil. Sé que ese no es el tipo de respuesta que estás buscando, pero si te interesa ver cómo C puede hacerlo, podría darte una idea de lo que realmente hacen las clases y cómo pueden funcionar los enfoques alternativos.
kylben
44
@kylben: "Orientado" es un estiramiento no solicitado. Puede golpear a C en un comportamiento orientado a objetos. No puedes forzarlo para que se oriente de esa manera.
David Thornley

Respuestas:

74

Hasta donde yo sé, Self es el lenguaje original que inventó el paradigma "sin clases" basado en prototipos . Ya existía (en una etapa experimental) en la década de 1980 y empuja el uso elegante del patrón prototipo de Smalltalk al extremo, de modo que las clases se eliminan por completo.

Influyó en todos los otros idiomas OO "sin clase" que conozco:

  • más prominentemente Javascript,
  • El lenguaje de programación clásico y el entorno Squeak (que está construido sobre Smalltalk)
  • El lenguaje de script multi-paradigma Lua .
DaveFar
fuente
2
@ Adam: sin tipeo estático, ¿no es TODO solo azúcar sintáctico?
Kevin Cline
55
@DeadMG El lenguaje OO no es el que le permite implementar ideas OO, sino el que lo hace por usted :)
Piotr Dobrogost
44
En realidad, tanto Simula (1960) como Smalltalk-71 (así como Smalltalk-72) tampoco tenían clases, lo que es anterior a Self en casi tres décadas. Las clases solo se agregaron en Simula-67 y Smalltalk-74 (y Alan Kay los consideró un error, o más precisamente un mal necesario).
Jörg W Mittag
2
@kevincline: No estoy seguro de en qué lo estás basando; OO y la escritura estática son completamente ortogonales.
Paul Biggar
2
Además de Simula (que asumió el paradigma de clase) Flavors se introdujo en el MIT en 1979, y fue un precursor de CLOS, ambos anteriores a Self.
Matthew Flynn el
32

Los lenguajes como JavaScript se basan en prototipos , donde el comportamiento se reutiliza clonando objetos existentes. El artículo de Wikipedia con el que me vinculé indica que Lua, ActionScript y otros lenguajes siguen este paradigma.

Thomas Owens
fuente
2
Cualquier variante ECMAScript utiliza el paradigma prototipo.
zzzzBov
Bueno, casi cualquier variante. ActionScript (el lenguaje Flash) usa clases, aunque la VM subyacente podría implementarlas en términos de prototipos.
mjfgates
@mjfgates, Actionscript 2 solía estar basado en ECMAScript y se parecía mucho a Javascript. Actionscript 3 se está alejando de eso, pero aún conserva su naturaleza dinámica. Puede escribir con fuerza / debilidad cualquier variable, ya que en esencia todo es un Objeto.
J_A_X
13

El lenguaje de programación orientado a objetos más popular del mundo no tiene clases, se llama Javascript y está basado en prototipos: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
fuente
11
¿"El lenguaje de programación orientado a objetos más popular del mundo"? No estoy seguro de esa afirmación en absoluto.
Thomas Owens
8
@ThomasOwens, debido a su inclusión en la web, puede decir fácilmente que todas las plataformas modernas habilitadas para la web (incluidos los dispositivos móviles) tienen un intérprete de JavaScript incluido. Ese es un caso muy fuerte de que actualmente es el lenguaje basado en prototipos más popular en existencia. (a menos que piense que puede hacer un argumento similar para "SELF")
riwalk
1
Javascript es sin duda uno de los lenguajes de programación más utilizados en el mundo, pero esperaría que la mayoría de los usos sean simplemente imperativos o de procedimientos antiguos, con tal vez un poco de programación orientada a aspectos (devoluciones de llamada? AJAX? Controladores de eventos?) Aquí y allí, por lo que llamar a javascript el 'lenguaje OOP más popular' no está justificado.
tdammers
99
También diría "omnipresente" para evitar una discusión sobre los méritos de su popularidad.
Anthony Pegram
3
@ Stargazer712: No me gusta ser un fanático del lenguaje, pero afirma que "el lenguaje de programación orientado a objetos más popular del mundo [ed: Javascript] no tiene clases". Se puede descomponer de dos afirmaciones: "Javascript es el lenguaje de programación orientado a objetos más popular" y "Javascript no tiene clases"; ambos con los que estoy de acuerdo.
Lie Ryan
6

La orientación a objetos es un término general para varios conceptos importantes que solo dependen en parte uno del otro. Por ejemplo, la herencia se puede declarar caso por caso entre instancias en lugar de entre clases, o la clase completa se puede representar por un prototypeobjeto concreto , como escribió Thomas. Es más habitual separar la descripción de la estructura de la creación de la instancia. Del mismo modo, el enlace tardío significa que los objetos con nominalmente el mismo método no necesariamente hacen lo mismo cuando se invoca, y que la decisión se toma en tiempo de ejecución. Eso también es posible con el enfoque basado en prototipos. Y la encapsulación es esencialmente completamente independiente de si sus objetos son instancias de clases declaradas o no.

Dicho esto, la mayoría de los idiomas OO están firmemente en el campo de clase. Pero incluso entonces hay expresiones idiomáticas que difuminan la línea: el diseño impulsado por el dominio a menudo conduce a sistemas en los que la identidad de objetos particulares es mucho más importante que el diagrama de clases estático, y los decoradores permiten que los objetos de la misma clase o interfaz tengan comportamiento diferente

Kilian Foth
fuente
6

Fortress es un lenguaje orientado a objetos basado en rasgos en lugar de clases. La diferencia está principalmente en la composición de la implementación. El comportamiento de un objeto (definiciones de métodos) aún está determinado por las declaraciones en un punto específico del texto del programa. Entonces, en ese sentido, es similar a los sistemas basados ​​en clases.

Hay cálculos de objetos (por Cardelli, creo), que se basan exclusivamente en objetos. Cada método es un miembro de instancia. Usted forma nuevos objetos tomando el contenido de un objeto existente y agregando, eliminando o reemplazando algunos de sus miembros. Es ligeramente diferente de los prototipos, ya que el nuevo objeto no tiene ningún enlace con el objeto antiguo, solo algunos de sus contenidos.

IIRC, es posible programar de manera similar usando Python y otros lenguajes orientados a tablas hash: puede agregar una función como miembro de instancia y luego llamarla como método.

Ryan Culpepper
fuente
5

Ada, a partir de su revisión de 1995, Ada está orientada a objetos, pero a diferencia de muchos otros lenguajes OO, no combina tipos y módulos orientados a objetos en una sola construcción llamada "clase". En lugar de declarar un tipo como "clase Foo" y colocar todas las declaraciones de método asociadas dentro de la declaración de clase, declara un paquete y declara el tipo (como a record) y otras cosas dentro del paquete. No es "libre de clases" en la forma en que lo son algunos de los otros idiomas mencionados, es solo una forma ligeramente diferente de organizar las cosas.

Las características orientadas a objetos de Ada 95 se agregaron a la versión existente de 1983 del lenguaje; extendió el registro existente y las construcciones de paquetes para admitir herencia et al.

Keith Thompson
fuente
eso es lo que recordaba, también debes pasar tu registro a cada función miembro
Nikko
@ Nikko: Eso es lo que sucede detrás de escena en cada lenguaje orientado a objetos, y bastante explícitamente en Python y CLOS (lisp común).
Marcin
5

Io es otro lenguaje orientado a objetos basado en prototipos. En realidad, se inspira en varios de los idiomas ya mencionados en otras respuestas.

Io es un lenguaje de programación dinámico basado en prototipos. Las ideas en Io están inspiradas principalmente en Smalltalk (todos los valores son objetos), Self (basado en prototipos), NewtonScript (herencia diferencial), Act1 (actores y futuros para la concurrencia), Lisp (el código es un árbol inspeccionable / modificable en tiempo de ejecución) y Lua (pequeña, empotrable).

Zsolt Török
fuente
4

Erlang Y sí, Erlang es un lenguaje orientado a objetos, ya que cumple con los tres puntos de la definición de OO.

Jörg W Mittag
fuente