Puro virtuale o astratto, cosa c'è in un nome?


15

Mentre discutevo di una domanda sulle funzioni virtuali su Stack Overflow, mi chiedevo se esistesse un nome ufficiale per funzioni virtuali pure (astratte) e non pure.

Ho sempre fatto affidamento su Wikipedia per le mie informazioni, che afferma che le funzioni virtuali pure e non pure sono il termine generale. Sfortunatamente, l'articolo non lo supporta con un'origine o riferimenti.

Per citare la risposta di Jon Skeet alla mia risposta che puro e non puro sono i termini generali usati:

@Steven: Hmm ... forse, ma l'ho mai visto prima nel contesto di C ++. Sospetto che chiunque ne parli abbia probabilmente uno sfondo C ++ :)

I termini provengono dal C ++ o sono stati prima definiti o implementati in una lingua precedente e sono i termini scientifici "ufficiali"?

AGGIORNARE:

Frank Shearar ha fornito un collegamento utile alla descrizione del SIMULA 67 Common Base Language (1970). Questa lingua sembra essere la prima lingua a introdurre parole chiave OO come classe , oggetto e anche virtuale come concetto formale. Essa non definisce puro / non pura o astratta , ma lo fa sostenere i concetti .

Chi li ha definiti?


1
Potrebbe trovare questo interessante ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver

2
funzioni virtuali, eredità virtuale, tabelle virtuali - nessuna con una vera spiegazione di ciò che le rende "virtuali". Conosco le regole, ma perché quella parola? Dopotutto, una funzione "virtuale" è reale come qualsiasi altra funzione: ha solo bisogno di una ricerca con associazione tardiva, tutto qui. Forse a Stroustrup è piaciuta davvero la parola. Pensavo che le classi fossero astratte (non pure), mentre i metodi potrebbero essere puri (ma non astratti). È possibile che l'ho inventato, però.
Steve314,

3
@ Steve314, non era Stroustrup - apparentemente erano chiamati così già a Simula .
Péter Török,

Risposte:


9

Nygaard e Dahl usarono per la prima volta il termine in SIMULA 67 Common Base Language . Guarda nella sezione 2.1, per esempio, e nella sezione 2.2.3. (Per quanto ne so almeno. Ma hey, per quanto riguarda OOP, è probabilmente il primo utilizzo del termine.)


3
Simula è stato il primo linguaggio OO, AFAIK, quindi ha il primo utilizzo di molti termini in un contesto OOP. Ha influenzato notevolmente Stroustrup, che inizialmente voleva solo un linguaggio con efficienza C e classi Simula.
David Thornley,

Sto sfogliando questo documento, e sì, sembra essere il primo, in quanto introducono "classi" e "oggetti".
Steven Jeuris,

2
Quindi, dopo qualche tempo sprecato a leggere la definizione di SIMULA 67. Simula 67 ha coniato "virtuale" insieme a "classe", "oggetto", "nascosto", "chiamata per valore", "chiamata per riferimento" nel 1970. Nessun segno di "puro", "non puro" o "astratto".
Steven Jeuris,

5
"Sprecato" sembra una parola strana da usare per descrivere la lettura di una delle carte seminali del campo.
Frank Shearar,

7

Quindi ... ho fatto una piccola ricerca. Quella che segue è una piccola lezione di storia per chi è interessato. :) Salta alla conclusione in fondo se sei interessato solo alla risposta.

1967 :

SIMULA 67 , il primo linguaggio di programmazione orientato agli oggetti definisce le parole chiave come classe , oggetto , chiamata per riferimento , chiamata per valore e virtuale .

Il sistema di eredità di SIMULA era originariamente noto con un nome diverso, concatenazione (e in seguito noto come prefisso ), facendo riferimento al fatto che il codice dei supertipi veniva copiato e "concatenato" con il codice dei sottotipi. Successivamente è emersa un'altra forma di sistema di ereditarietà , la delega , in cui le chiamate sono delegate in riferimento al tipo corretto.

Virtual molto probabilmente si riferisce al processo che deve essere eseguito per inviare una chiamata all'implementazione corretta utilizzando una tabella dei metodi virtuali . È virtuale rispetto a un'implementazione fissa / concreta.

1971 :

Niklaus Wirth, scrive di un concetto definito come perfezionamento graduale . Spiega sostanzialmente come dividere un programma in soluzioni parziali su cui può essere esteso.

1974 :

Questo è il primo documento che ho trovato che conia il termine tipi di dati astratti di Barbara Liskov .

Un tipo di dati astratto definisce una classe di oggetti astratti che è completamente caratterizzata dalle operazioni disponibili su tali oggetti. Ciò significa che un tipo astratto può essere definito definendo le operazioni caratterizzanti per quel tipo. Quando un programmatore utilizza un oggetto dati astratto, si preoccupa solo del comportamento che quell'oggetto esibisce, ma non di alcun dettaglio su come tale comportamento viene raggiunto mediante un'implementazione.

Questo documento definisce anche un cluster operativo che sembra specificare ciò che ora conosciamo come interfaccia .

Interessante terminologia scientifica (articolo del 1996):

Ereditarietà : un meccanismo di livello più basso mediante il quale oggetti o classi possono condividere comportamenti o dati.

Sottotipizzazione : esprime la specializzazione concettuale. Una forma specifica di eredità, chiamata anche eredità dell'interfaccia .

Principi di astrazione : il processo di organizzazione della nostra conoscenza di un dominio di applicazione in classifiche gerarchiche degli ordinamenti di astrazioni, al fine di ottenere una migliore comprensione dei fenomeni in questione.

Astrazioni parzialmente attuate : astrazioni le cui definizioni sono state volutamente lasciate incomplete.

Classi astratte : termine specifico per una classe parzialmente implementata in sistemi orientati agli oggetti.

Eredità nascosta : consente di ridefinire (o addirittura rimuovere) le operazioni in sottoclassi.

Eredità rigorosa : eredità compatibile con il comportamento.

Conclusione :

La classe astratta è il termine più generale da utilizzare nei sistemi orientati agli oggetti. Sembra che le funzioni virtuali pure e non pure provengano solo da C ++. Ad esempio, questa intervista con Stroustrup sembra che abbia inventato i termini. Gli articoli scientifici usano una terminologia più generale.

Virtual ha origine da SIMULA, il che comporta una diffusione del suo utilizzo, ma non è un termine generale. Definisce già i dettagli di implementazione. Parlare in termini di tipi di eredità è più appropriato. Non virtuale per impostazione predefinita corrisponde all'eredità rigorosa per impostazione predefinita, mentre virtuale per impostazione predefinita corrisponde all'eredità non rigorosa .

Qualcuno interessato a modificare la voce di Wikipedia ? :)


Prima di Barbara Liskov, Dijkstra aveva anche qualcosa da dire su "COMPOSIZIONE DEL PROGRAMMA STEP-WISE" , che potrebbe anche essere una risorsa rilevante.
Steven Jeuris,

4

In C ++, le funzioni membro che sono legate dinamicamente e quindi possono essere sovrascritte da una sottoclasse sono chiamate "virtuali". Le funzioni virtuali che devono assolutamente essere ignorate sono chiamate "puro virtuale". Nota che una pura funzione virtuale può avere un corpo, sebbene spesso non lo sia. Una classe che ha almeno una funzione virtuale pura è chiamata "astratta" e non può essere istanziata, ma solo derivata.

Sto indovinando il motivo per cui le funzioni virtuali sono chiamate virtuali è il fatto che non è noto quale funzione effettiva verrà chiamata al momento della compilazione. In un certo senso, una chiamata di funzione virtuale "non esiste" al momento della compilazione.

Sto anche immaginando che il motivo per cui il termine "astratto" è usato per una classe con una pura funzione virtuale è che non puoi avere oggetti di quella classe. In un certo senso è un concetto astratto molto lontano dal mondo concreto degli oggetti.

Modifica: altre lingue.

Per quanto riguarda la questione di quanto sia generale il termine "virtuale", ecco i miei due centesimi. In Smalltalk tutte le funzioni usano l'associazione dinamica, quindi sono tutte virtuali e non è necessario un termine speciale o una parola chiave della lingua. In Java, se non sbaglio, il compilatore decide automaticamente se utilizzare l'associazione dinamica, per quanto riguarda il programmatore non c'è distinzione e quindi nessuna parola chiave "virtuale".

In C ++ è necessaria la distinzione tra virtuale e non virtuale, poiché spetta al programmatore decidere quando utilizzare l'associazione dinamica per risparmiare sull'overhead quando non è necessario.


1
+1: Inoltre, "Abstract" si applica a molte lingue. "Virtuale" no.
S. Lott,

@ S.Lott: l'intera domanda è se virtuale è o meno un termine generale. Per quanto ne so ora, il virtuale si applica a molte lingue ed è stato coniato per la prima volta da Simula. Rimane una domanda su puro / non puro e astratto.
Steven Jeuris,

@Steven Jeuris: "il virtuale si applica a molte lingue"? Veramente. Finora sembra essere C, C ++ e Simula. Certamente non si applica a Python neanche un po '. Non sembra applicarsi a Java.
S. Lott,

Si applica a Object Pascal / Delphi. Delphi ha un concetto aggiuntivo dynamic- che è una specie di metodo virtuale che scambia spazio per il tempo: occupano meno spazio e sono più lenti da eseguire rispetto ai virtualmetodi.
Frank Shearar,

2
@Steven Jeuris: "virtuale di default" non è la stessa cosa che usare "virtuale" per descrivere funzioni astratte. Penso che le persone che affermano che "tutte le funzioni sono virtuali" stanno applicando un concetto C ++ a un'altra lingua. E penso che lo stiano facendo impropriamente. Dal momento che tutte le funzioni del metodo sono virtuali in Python, l'argomento non viene mai menzionato usando "virtuale" tranne in luoghi come Stack Overflow per applicare il concetto C ++ a Python. Penso che virtuale sia applicato in modo improprio in quei casi, poiché i documenti del linguaggio Python non usano la parola.
S.Lott
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.