Pur virtuel ou abstrait, qu'est-ce qu'il y a dans un nom?

15

En discutant d' une question sur les fonctions virtuelles sur Stack Overflow, je me suis demandé s'il y avait une dénomination officielle pour les fonctions virtuelles pures (abstraites) et non pures.

J'ai toujours compté sur wikipedia pour mes informations, qui stipule que les fonctions virtuelles pures et non pures sont le terme général. Malheureusement, l'article ne le sauvegarde pas avec une origine ou des références.

Pour citer la réponse de Jon Skeet à ma réponse que pur et non pur sont le terme général utilisé:

@Steven: Hmm ... peut-être, mais je ne l'ai jamais vu dans le contexte de C ++ auparavant. Je soupçonne que quiconque en parle est susceptible d'avoir une formation en C ++ :)

Les termes provenaient-ils du C ++, ou ont-ils été définis ou mis en œuvre pour la première fois dans un langage antérieur, et s'agit-il des termes scientifiques «officiels»?

MISE À JOUR:

Frank Shearar a utilement fourni un lien vers la description du langage de base commun SIMULA 67 (1970). Ce langage semble être le premier langage à introduire des mots-clés OO comme classe , objet , et aussi virtuel comme concept formel. Il ne définit pas pur / non pur ou abstrait , mais il prend en charge les concepts .

Qui les a définis?

Steven Jeuris
la source
1
Pourrait
Aaron McIver
2
fonctions virtuelles, héritage virtuel, tables virtuelles - aucune avec une véritable explication de ce qui les rend "virtuels". Je connais les règles, mais pourquoi ce mot? Après tout, une fonction "virtuelle" est aussi réelle que n'importe quelle autre fonction - elle a juste besoin d'une recherche de liaison tardive, c'est tout. Peut-être que Stroustrup a vraiment aimé le mot. Je pensais que les cours étaient abstraits (pas purs), alors que les méthodes pouvaient être pures (mais pas abstraites). Il est possible que j'aie inventé ça, cependant.
Steve314
3
@ Steve314, ce n'était pas Stroustrup - apparemment, ils étaient déjà appelés ainsi dans Simula .
Péter Török

Réponses:

9

Nygaard et Dahl ont utilisé le terme pour la première fois, dans SIMULA 67 Common Base Language . Regardez dans la section 2.1, par exemple, et la section 2.2.3. (Pour autant que je sache au moins. Mais bon, en ce qui concerne les POO, c'est probablement la première utilisation du terme.)

Frank Shearar
la source
3
Simula a été le premier langage OO, AFAIK, donc il a la première utilisation de beaucoup de termes dans un contexte OOP. Cela a grandement influencé Stroustrup, qui au départ voulait juste un langage avec efficacité C et des classes Simula.
David Thornley
Je parcourt cet article, et oui, il semble que ce soit le premier, car ils introduisent des «classes» et des «objets».
Steven Jeuris
2
Donc, après un certain temps perdu à lire la définition de SIMULA 67. Simula 67 a inventé «virtuel» avec «classe», «objet», «caché», «appel par valeur», «appel par référence» en 1970. Aucun signe de «pur», «impur» ou «abstrait».
Steven Jeuris
5
"Gaspillé" semble être un mot étrange à utiliser pour décrire la lecture d'un des articles fondateurs du domaine.
Frank Shearar
7

Alors ... j'ai fait un peu de recherche. Ce qui suit est une petite leçon d'histoire pour les personnes intéressées. :) Passez à la conclusion en bas si vous êtes uniquement intéressé par la réponse.

1967 :

SIMULA 67 , le premier langage de programmation orienté objet définit les mots clés comme classe , objet , appel par référence , appel par valeur et virtuel .

Le système d' héritage de SIMULA était à l'origine connu sous un nom différent, concaténation (et plus tard connu sous le nom de préfixe ), se référant au fait que le code des supertypes était copié et `` concaténé '' avec le code des sous-types. Plus tard, une autre forme de système d'héritage a émergé, la délégation , où les appels sont délégués par référence au type correct.

Virtuel se réfère très probablement au processus qui doit être effectué pour envoyer un appel à l'implémentation correcte en utilisant une table de méthode virtuelle . Il est virtuel par rapport à une implémentation fixe / concrète.

1971 :

Niklaus Wirth, écrit sur un concept défini comme le raffinement par étapes . Il explique en gros comment diviser un programme en solutions partielles sur lesquelles il est possible d'étendre.

1974 :

C'est le premier article que j'ai trouvé qui invente le terme types de données abstraits par Barbara Liskov .

Un type de données abstrait définit une classe d'objets abstraits qui est complètement caractérisée par les opérations disponibles sur ces objets. Cela signifie qu'un type abstrait peut être défini en définissant les opérations de caractérisation pour ce type. Lorsqu'un programmeur utilise un objet de données abstrait, il ne s'intéresse qu'au comportement que cet objet présente mais pas aux détails de la manière dont ce comportement est réalisé au moyen d'une implémentation.

Cet article définit également un cluster d'opérations qui semble spécifier ce que nous connaissons maintenant comme une interface .

Terminologie scientifique intéressante (article de 1996):

Héritage : un mécanisme de bas niveau par lequel des objets ou des classes peuvent partager un comportement ou des données.

Sous - typage : exprime la spécialisation conceptuelle. Une forme spécifique d'héritage, également appelée héritage d'interface .

Principes d'abstraction : Processus d'organisation de notre connaissance d'un domaine d'application en classements hiérarchiques d'ordonnances d'abstractions, afin d'obtenir une meilleure compréhension des phénomènes concernés.

Abstractions partiellement implémentées : abstractions dont les définitions ont délibérément été laissées incomplètes.

Classes abstraites : terme spécifique pour une classe partiellement implémentée dans les systèmes orientés objet.

Héritage sans restriction : permet de redéfinir (ou même de supprimer) les opérations dans les sous-classes.

Héritage strict : héritage compatible avec le comportement.

Conclusion :

La classe abstraite est le terme le plus général à utiliser dans les systèmes orientés objet. Il semble que les fonctions virtuelles pures et non pures ne proviennent que de C ++. Par exemple, cette interview avec Stroustrup donne l'impression qu'il a inventé les termes. Les articles scientifiques utilisent une terminologie plus générale.

Le virtuel provient de SIMULA, ce qui fait que son utilisation est répandue, mais ce n'est pas un terme général. Il définit déjà les détails d'implémentation. Parler en termes de types d'héritage est plus approprié. Non virtuel par défaut correspond à un héritage strict par défaut, tandis que virtuel par défaut correspond à un héritage non strict .

Toute personne intéressée à ajuster l' entrée wikipedia ? :)

Steven Jeuris
la source
Avant Barbara Liskov, Dijkstra avait également quelque chose à dire sur "COMPOSITION DU PROGRAMME STEP-WISE" , qui pourrait également être une ressource pertinente.
Steven Jeuris
4

En C ++, les fonctions membres qui sont liées dynamiquement et qui peuvent donc être remplacées par une sous-classe sont appelées "virtuelles". Les fonctions virtuelles qui doivent impérativement être remplacées sont appelées «virtuelles pures». Notez qu'une fonction virtuelle pure peut avoir un corps, bien que ce ne soit souvent pas le cas. Une classe qui a au moins une fonction virtuelle pure est appelée "abstraite" et ne peut pas être instanciée, uniquement dérivée de.

Je suppose que la raison pour laquelle les fonctions virtuelles sont appelées virtuelles est le fait qu'on ne sait pas quelle fonction réelle sera appelée au moment de la compilation. Dans un sens, un appel de fonction virtuelle "n'existe pas" au moment de la compilation.

Je suppose également que la raison pour laquelle le terme "abstrait" est utilisé pour une classe avec une fonction virtuelle pure est que vous ne pouvez pas avoir d'objets de cette classe. En un sens, c'est un concept abstrait très éloigné du monde concret des objets.

Edit: Autres langues.

En ce qui concerne la question de savoir comment le terme «virtuel» est général, voici mes deux cents. Dans Smalltalk, toutes les fonctions utilisent une liaison dynamique, donc elles sont toutes virtuelles, et il n'y a pas besoin de terme spécial ou de mot clé de langue. En Java, si je ne me trompe pas, le compilateur décide automatiquement si la liaison dynamique doit être utilisée, en ce qui concerne le programmeur il n'y a pas de distinction, et donc pas de mot-clé "virtuel".

En C ++, la distinction entre virtuel et non virtuel est nécessaire, car c'est au programmeur de décider quand la liaison dynamique doit être utilisée pour économiser sur la surcharge lorsqu'elle n'est pas nécessaire.

Dima
la source
1
+1: De plus, "Résumé" s'applique à de nombreuses langues. "Virtuel" ne le fait pas.
S.Lott
@ S.Lott: Toute la question est de savoir si virtuel est ou non un terme général. Pour autant que je sache maintenant, le virtuel s'applique à de nombreuses langues et a été inventé pour la première fois par Simula. La question reste pure / non pure et abstraite.
Steven Jeuris
@Steven Jeuris: "le virtuel s'applique à de nombreuses langues"? Vraiment. Jusqu'à présent, il semble que ce soit C, C ++ et Simula. Cela ne s'applique certainement pas à Python, même un petit peu. Il ne semble pas s'appliquer à Java.
S.Lott
Il s'applique à Object Pascal / Delphi. Delphi a un concept supplémentaire - dynamic- qui est une sorte de méthode virtuelle qui échange de l'espace contre du temps: elles prennent moins de place et sont plus lentes à exécuter que les virtualméthodes.
Frank Shearar
2
@Steven Jeuris: "virtuel par défaut" n'est pas la même chose que d'utiliser "virtuel" pour décrire des fonctions abstraites. Je pense que les gens qui disent que "toutes les fonctions sont virtuelles" appliquent un concept C ++ à un autre langage. Et je pense qu'ils le font mal. Étant donné que toutes les fonctions de méthode sont virtuelles en Python, le sujet n'est jamais mentionné en utilisant "virtuel" sauf dans des endroits comme Stack Overflow pour appliquer le concept C ++ à Python. Je pense que virtuel n'est pas appliqué correctement dans ces cas, car les documents en langage Python n'utilisent pas le mot.
S.Lott