Puro virtual o abstracto, ¿qué hay en un nombre?

15

Mientras discutía una pregunta sobre las funciones virtuales en Stack Overflow, me preguntaba si había algún nombre oficial para las funciones virtuales puras (abstractas) y no puras.

Siempre confié en wikipedia para obtener mi información, que establece que las funciones virtuales puras y no puras son el término general. Desafortunadamente, el artículo no lo respalda con un origen o referencias.

Para citar la respuesta de Jon Skeet a mi respuesta, el término general utilizado es puro y no puro:

@ Steven: Hmm ... posiblemente, pero solo lo he visto antes en el contexto de C ++. Sospecho que cualquiera que hable de ellos probablemente tenga antecedentes de C ++ :)

¿Los términos se originaron en C ++, o se definieron o implementaron por primera vez en un lenguaje anterior, y son los términos científicos 'oficiales'?

ACTUALIZAR:

Frank Shearar proporcionó un enlace útil a la descripción de SIMULA 67 Common Base Language (1970). Este lenguaje parece ser el primer idioma en introducir palabras clave OO como clase , objeto y también virtual como un concepto formal. Que no definen pura / no pura o abstracta , sino que es compatible con los conceptos .

¿Quién los definió?

Steven Jeuris
fuente
1
Podría encontrar esto interesante ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver
2
funciones virtuales, herencia virtual, tablas virtuales: ninguna con una explicación real de lo que las hace "virtuales". Sé las reglas, pero ¿por qué esa palabra? Después de todo, una función "virtual" es tan real como cualquier otra función: solo necesita una búsqueda de enlace tardío, eso es todo. Tal vez a Stroustrup realmente le gustó la palabra. Pensé que las clases eran abstractas (no puras), mientras que los métodos podrían ser puros (pero no abstractos). Sin embargo, es posible que lo haya inventado.
Steve314
3
@ Steve314, no era Stroustrup, aparentemente ya se llamaban así en Simula .
Péter Török

Respuestas:

9

Nygaard y Dahl usaron el término por primera vez, en SIMULA 67 Common Base Language . Mire en la sección 2.1, por ejemplo, y la sección 2.2.3. (Hasta donde puedo decir al menos. Pero bueno, en lo que respecta a OOP, es probable que sea el primer uso del término).

Frank Shearar
fuente
3
Simula fue el primer lenguaje OO, AFAIK, por lo que tiene el primer uso de muchos términos en un contexto OOP. Influyó mucho en Stroustrup, que inicialmente solo quería un lenguaje con eficiencia C y clases Simula.
David Thornley
Estoy hojeando este documento, y sí, parece ser el primero, ya que están introduciendo 'clases' y 'objetos'.
Steven Jeuris
2
Entonces, después de un tiempo perdido leyendo la definición SIMULA 67. Simula 67 acuñó 'virtual' junto con 'clase', 'objeto', 'oculto', 'llamada por valor', 'llamada por referencia' en 1970. Ningún signo de 'puro', 'impuro' o 'abstracto'.
Steven Jeuris
55
"Perdido" parece una palabra extraña para describir la lectura de uno de los documentos fundamentales del campo.
Frank Shearar
7

Entonces ... he estado investigando un poco. Lo que sigue es una pequeña lección de historia para los interesados. :) Salte a la conclusión en la parte inferior si solo le interesa la respuesta.

1967 :

SIMULA 67 , el primer lenguaje de programación orientado a objetos define palabras clave como clase , objeto , llamada por referencia , llamada por valor y virtual .

El sistema de herencia de SIMULA se conocía originalmente con un nombre diferente, concatenación (y luego conocido como prefijo ), en referencia al hecho de que el código de los supertipos se copiaba y 'concatenaba' con el código de los subtipos. Más tarde surgió otra forma de sistema de herencia , la delegación , donde las llamadas se delegan por referencia al tipo correcto.

Virtual probablemente se refiere al proceso que debe realizarse para enviar una llamada a la implementación correcta mediante el uso de una tabla de método virtual . Es virtual en comparación con una implementación fija / concreta.

1971 :

Niklaus Wirth, escribe sobre un concepto definido como refinamiento gradual . Básicamente explica cómo dividir un programa en soluciones parciales en las que se puede extender.

1974 :

Este es el primer artículo que encontré que acuña el término tipos de datos abstractos de Barbara Liskov .

Un tipo de datos abstractos define una clase de objetos abstractos que se caracteriza completamente por las operaciones disponibles en esos objetos. Esto significa que se puede definir un tipo abstracto definiendo las operaciones de caracterización para ese tipo. Cuando un programador hace uso de un objeto de datos abstractos, solo le preocupa el comportamiento que exhibe ese objeto, pero no los detalles de cómo se logra ese comportamiento mediante una implementación.

Este documento también define un grupo de operaciones que parece especificar lo que ahora conocemos como interfaz .

Interesante terminología científica (artículo de 1996):

Herencia : un mecanismo de nivel más bajo por el cual los objetos o clases pueden compartir comportamientos o datos.

Subtipo : expresa la especialización conceptual. Una forma específica de herencia, también llamada herencia de interfaz .

Principios de abstracción : el proceso de organizar nuestro conocimiento de un dominio de aplicación en clasificaciones jerárquicas de ordenaciones de abstracciones, con el fin de obtener una mejor comprensión de los fenómenos en cuestión.

Abstracciones parcialmente implementadas : abstracciones cuyas definiciones se han dejado a propósito incompletas.

Clases abstractas : Término específico para una clase parcialmente implementada en sistemas orientados a objetos.

Herencia no estricta : permite que las operaciones se redefinan (o incluso se eliminen) en subclases.

Herencia estricta : herencia compatible con el comportamiento.

Conclusión :

La clase abstracta es el término más general para usar en sistemas orientados a objetos. Parece que las funciones virtuales puras y no puras solo se originan en C ++. Por ejemplo, esta entrevista con Stroustrup hace parecer que inventó los términos. Los artículos científicos usan terminología más general.

Virtual se origina en SIMULA, lo que hace que su uso sea generalizado, pero no es un término general. Ya define los detalles de implementación. Hablar en términos de tipos de herencia es más apropiado. No virtual por defecto corresponde a herencia estricta por defecto, mientras que virtual por defecto corresponde a herencia no estricta .

Cualquier persona interesada en ajustar la entrada de wikipedia ? :)

Steven Jeuris
fuente
Antes de Barbara Liskov, Dijkstra también tenía algo que decir sobre "COMPOSICIÓN DEL PROGRAMA PASO A PASO" , que también podría ser un recurso relevante.
Steven Jeuris
4

En C ++, las funciones miembro que están vinculadas dinámicamente y, por lo tanto, pueden ser anuladas por una subclase se denominan "virtuales". Las funciones virtuales que deben ser anuladas absolutamente se llaman "virtuales puras". Tenga en cuenta que una función virtual pura puede tener un cuerpo, aunque a menudo no lo tiene. Una clase que tiene al menos una función virtual pura se llama "abstracta" y no se puede instanciar, solo derivar de.

Supongo que la razón por la cual las funciones virtuales se llaman virtuales es el hecho de que no se sabe qué función real se llamará en tiempo de compilación. En cierto sentido, una función virtual llamada "no existe" en tiempo de compilación.

También supongo que la razón por la cual el término "abstracto" se usa para una clase con una función virtual pura es que no puede tener ningún objeto de esa clase. En cierto sentido, es un concepto abstracto muy alejado del mundo concreto de los objetos.

Editar: otros idiomas.

En cuanto a la cuestión de cuán general es el término "virtual", aquí están mis dos centavos. En Smalltalk, todas las funciones usan enlace dinámico, por lo que todas son virtuales y no se necesita un término especial o una palabra clave de idioma. En Java, si no me equivoco, el compilador decide automáticamente si se debe utilizar el enlace dinámico, por lo que al programador no le corresponde distinción y, por lo tanto, no hay una palabra clave "virtual".

En C ++, la distinción entre virtual y no virtual es necesaria, ya que depende del programador decidir cuándo se debe usar el enlace dinámico para ahorrar en la sobrecarga cuando no es necesario.

Dima
fuente
1
+1: Además, "Resumen" se aplica a muchos idiomas. "Virtual" no lo hace.
S.Lott
@ S.Lott: La pregunta completa es si virtual es o no un término general. Por lo que puedo decir ahora, virtual se aplica a muchos idiomas, y fue acuñado por primera vez por Simula. Queda la pregunta sobre puro / no puro y abstracto.
Steven Jeuris
@ Steven Jeuris: "¿virtual se aplica a muchos idiomas"? De Verdad. Hasta ahora, parece ser C, C ++ y Simula. Ciertamente, no se aplica a Python ni siquiera un poco. No parece aplicarse a Java.
S.Lott
Se aplica a Object Pascal / Delphi. Delphi tiene un concepto adicional dynamic, que es un tipo de método virtual que intercambia espacio por tiempo: ocupan menos espacio y son más lentos de ejecutar que los virtualmétodos.
Frank Shearar
2
@Steven Jeuris: "virtual por defecto" no es lo mismo que usar "virtual" para describir funciones abstractas. Creo que las personas que dicen "todas las funciones son virtuales" están aplicando un concepto de C ++ a otro lenguaje. Y creo que lo están haciendo de manera incorrecta. Como todas las funciones del método son virtuales en Python, el tema nunca se menciona usando "virtual", excepto en lugares como Stack Overflow para aplicar el concepto de C ++ a Python. Creo que virtual se aplica incorrectamente en esos casos, ya que los documentos del lenguaje Python no usan la palabra.
S.Lott