Puro virtual ou abstrato, o que há em um nome?

15

Ao discutir uma pergunta sobre funções virtuais no Stack Overflow, perguntei-me se havia alguma nomeação oficial para funções virtuais puras (abstratas) e não puras.

Eu sempre confiei na wikipedia para minhas informações, que afirmam que funções virtuais puras e não puras são o termo geral. Infelizmente, o artigo não faz backup com uma origem ou referências.

Para citar a resposta de Jon Skeet à minha resposta de que puro e não puro é o termo geral usado:

@ Steven: Hmm ... possivelmente, mas eu só vi isso no contexto de C ++ antes. Eu suspeito que alguém falando sobre eles provavelmente tenha um background em C ++ :)

Os termos se originaram em C ++, ou foram definidos ou implementados pela primeira vez em um idioma anterior, e são os termos científicos "oficiais"?

ATUALIZAR:

Frank Shearar forneceu um link para a descrição do SIMULA 67 Common Base Language (1970). Esse idioma parece ser o primeiro idioma a introduzir palavras-chave OO como classe , objeto e também virtual como conceito formal. Ele não definir pura / não-puro ou abstrata , mas ele suporta os conceitos .

Quem os definiu?

Steven Jeuris
fonte
1
Pode achar isso interessante ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver
2
funções virtuais, herança virtual, tabelas virtuais - nenhuma com nenhuma explicação real do que as torna "virtuais". Eu sei as regras, mas por que essa palavra? Afinal, uma função "virtual" é tão real quanto qualquer outra função - ela só precisa de uma pesquisa de ligação tardia, é tudo. Talvez Stroustrup tenha gostado muito da palavra. Eu pensei que as classes eram abstratas (não puras), enquanto os métodos podem ser puros (mas não abstratos). É possível que eu tenha inventado isso.
91111 Steve314
3
@ Steve314, não era Stroustrup - aparentemente eles já foram chamados assim em Simula .
Péter Török

Respostas:

9

Nygaard e Dahl usaram o termo pela primeira vez, no SIMULA 67 Common Base Language . Veja a seção 2.1, por exemplo, e a seção 2.2.3. (Pelo que sei, pelo menos. Mas, ei, no que diz respeito à OOP, provavelmente é o primeiro uso do termo.)

Frank Shearar
fonte
3
O Simula foi a primeira linguagem OO, AFAIK, portanto, tem o primeiro uso de muitos termos em um contexto OOP. Isso influenciou bastante o Stroustrup, que inicialmente queria apenas um idioma com eficiência em C e aulas com Simula.
David Thornley
Estou examinando este artigo e, sim, parece ser o primeiro, pois eles estão introduzindo 'classes' e 'objetos'.
Steven Jeuris
2
Então, depois de algum tempo perdido lendo a definição SIMULA 67. O Simula 67 cunhou 'virtual' junto com 'classe', 'objeto', 'oculto', 'chamada por valor', 'chamada por referência' em 1970. Nenhum sinal de 'puro', 'impuro' ou 'abstrato'.
Steven Jeuris
5
"Desperdiçado" parece uma palavra estranha para descrever a leitura de um dos documentos seminais do campo.
Frank Shearar
7

Então ... eu tenho feito uma pequena pesquisa. O que se segue é uma pequena lição de história para os interessados. :) Pule para a conclusão na parte inferior, se você estiver interessado apenas na resposta.

1967 :

O SIMULA 67 , a primeira linguagem de programação orientada a objetos, define as palavras-chave como classe , objeto , chamada por referência , chamada por valor e virtual .

O sistema de herança do SIMULA era originalmente conhecido por um nome diferente, concatenação (e mais tarde conhecido como prefixo ), referindo-se ao fato de que o código dos supertipos foi copiado e 'concatenado' com o código dos subtipos. Mais tarde , surgiu outra forma de sistema de herança , a delegação , onde as chamadas são delegadas por referência ao tipo correto.

O virtual provavelmente se refere ao processo que precisa ser executado para despachar uma chamada para a implementação correta usando uma tabela de método virtual . É virtual em comparação com uma implementação fixa / concreta.

1971 :

Niklaus Wirth, escreve sobre um conceito definido como Stepwise Refinement . Ele explica basicamente como dividir um programa em soluções parciais nas quais pode ser estendido.

1974 :

Este é o primeiro artigo que encontrei que inventa o termo tipos de dados abstratos de Barbara Liskov .

Um tipo de dado abstrato define uma classe de objetos abstratos que é completamente caracterizada pelas operações disponíveis nesses objetos. Isso significa que um tipo abstrato pode ser definido definindo as operações de caracterização para esse tipo. Quando um programador faz uso de um objeto de dados abstratos, ele se preocupa apenas com o comportamento que esse objeto exibe, mas não com detalhes de como esse comportamento é alcançado por meio de uma implementação.

Este artigo também define um cluster de operações que parece especificar o que sabemos agora como interface .

Terminologia científica interessante (artigo de 1996):

Herança : um mecanismo de nível mais baixo pelo qual objetos ou classes podem compartilhar comportamento ou dados.

Subtipagem : expressa especialização conceitual. Uma forma específica de herança, também chamada herança de interface .

Princípios de abstração : O processo de organizar nosso conhecimento de um domínio de aplicativo em classificações hierárquicas de ordenações de abstrações, a fim de obter uma melhor compreensão dos fenômenos em questão.

Abstrações parcialmente implementadas : abstrações cujas definições foram propositadamente deixadas incompletas.

Classes abstratas : Termo específico para uma classe parcialmente implementada em sistemas orientados a objetos.

Herança não restrita : permite que as operações sejam redefinidas (ou mesmo removidas) nas subclasses.

Herança estrita : herança comportamentalmente compatível.

Conclusão :

Classe abstrata é o termo mais geral a ser usado em sistemas orientados a objetos. Parece que as funções virtuais puras e não puras são originárias apenas do C ++. Por exemplo, esta entrevista com Stroustrup parece que ele inventou os termos. Trabalhos científicos usam terminologia mais geral.

O Virtual é originário do SIMULA, o que faz com que seu uso seja generalizado, mas não é um termo geral. Ele já define os detalhes da implementação. Falar em termos de tipos de herança é mais apropriado. Por padrão, não virtual corresponde a herança estrita por padrão, enquanto virtual por padrão corresponde a herança não restrita .

Alguém interessado em ajustar a entrada da Wikipedia ? :)

Steven Jeuris
fonte
Antes de Barbara Liskov, Dijkstra também tinha algo a dizer sobre "COMPOSIÇÃO DO PROGRAMA STEP-WISE" , que também pode ser um recurso relevante.
precisa
4

No C ++, funções-membro dinamicamente ligadas e, portanto, podem ser substituídas por uma subclasse são chamadas de "virtuais". Funções virtuais que absolutamente devem ser substituídas são chamadas de "virtual puro". Observe que uma função virtual pura pode ter um corpo, embora muitas vezes não tenha. Uma classe que possui pelo menos uma função virtual pura é chamada "abstrata" e não pode ser instanciada, derivada apenas de.

Eu estou supondo que a razão pela qual as funções virtuais são chamadas de virtual é o fato de que não se sabe qual função real será chamada em tempo de compilação. Em certo sentido, uma chamada de função virtual "não existe" em tempo de compilação.

Também estou supondo que a razão pela qual o termo "abstrato" seja usado para uma classe com uma função virtual pura seja porque você não pode ter nenhum objeto dessa classe. Em certo sentido, é um conceito abstrato muito distante do mundo concreto dos objetos.

Editar: outros idiomas.

Quanto à questão de quão geral é o termo "virtual", aqui estão meus dois centavos. No Smalltalk, todas as funções usam ligação dinâmica; portanto, todas são virtuais e não é necessário um termo especial ou uma palavra-chave no idioma. Em Java, se não me engano, o compilador decide automaticamente se a ligação dinâmica deve ser usada; portanto, no que diz respeito ao programador, não há distinção e, portanto, nenhuma palavra-chave "virtual".

No C ++, a distinção entre virtual e não virtual é necessária, porque cabe ao programador decidir quando a ligação dinâmica deve ser usada para economizar na sobrecarga quando não é necessária.

Dima
fonte
1
+1: Além disso, "Resumo" se aplica a vários idiomas. "Virtual" não.
S.Lott
@ S.Lott: A questão toda é se virtual é ou não um termo geral. Até onde eu sei agora, o virtual se aplica a muitos idiomas e foi cunhado pela Simula. Permanece a pergunta sobre puro / não puro e abstrato.
Steven Jeuris
@ Steven Jeuris: "virtual se aplica a muitos idiomas"? Realmente. Até agora, parece ser C, C ++ e Simula. Certamente não se aplica ao Python nem um pouco. Parece não se aplicar ao Java.
S.Lott
Isso se aplica ao Object Pascal / Delphi. O Delphi tem um conceito adicional - dynamic- que é um tipo de método virtual que troca espaço por tempo: eles ocupam menos espaço e são mais lentos de executar do que os virtualmétodos.
Frank Shearar
2
@ Steven Jeuris: "virtual por padrão" não é a mesma coisa que usar "virtual" para descrever funções abstratas. Acho que as pessoas que dizem "todas as funções são virtuais" estão aplicando um conceito de C ++ a outra linguagem. E eu acho que eles estão fazendo isso de forma inadequada. Como todas as funções de método são virtuais no Python, o tópico nunca é mencionado usando "virtual", exceto em locais como Stack Overflow para aplicar o conceito C ++ ao Python. Acho que virtual é aplicado indevidamente nesses casos, pois os documentos da linguagem Python não usam a palavra.
S.Lott 9/02