Czysty wirtualny czy abstrakcyjny, co jest w nazwie?

15

Omawiając pytanie dotyczące funkcji wirtualnych w przepełnieniu stosu, zastanawiałem się, czy istnieje jakieś oficjalne nazewnictwo dla czystych (abstrakcyjnych) i nieczystych funkcji wirtualnych.

W moich informacjach zawsze polegałem na wikipedii, która stwierdza, że ogólne i nieczyste funkcje wirtualne są ogólnym terminem. Niestety w artykule nie ma kopii zapasowej źródła ani referencji.

Cytując odpowiedź Jona Skeeta na moją odpowiedź, że ogólny i nieoczyszczony to ogólny termin:

@Steven: Hmm ... prawdopodobnie, ale kiedykolwiek widziałem to tylko w kontekście C ++. Podejrzewam, że ktokolwiek o nich mówi, prawdopodobnie ma doświadczenie w C ++ :)

Czy te terminy pochodzą z C ++, czy też zostały po raz pierwszy zdefiniowane lub zaimplementowane we wcześniejszym języku i czy są to „oficjalne” terminy naukowe?

AKTUALIZACJA:

Frank Shearar udzielił pomocnego linku do opisu SIMULA 67 Common Base Language (1970). Ten język wydaje się być pierwszym językiem, który wprowadza słowa kluczowe OO jako klasę , obiekt , a także wirtualny jako pojęcie formalne. To nie definiują czysta / non-pure lub abstrakcyjny , ale to nie obsługuje pojęć .

Kto je zdefiniował?

Steven Jeuris
źródło
1
To może być interesujące ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver
2
funkcje wirtualne, wirtualne dziedziczenie, wirtualne tabele - żadne z prawdziwym wyjaśnieniem, co czyni je „wirtualnymi”. Znam zasady, ale dlaczego to słowo? W końcu „wirtualna” funkcja jest tak samo realna, jak każda inna funkcja - po prostu wymaga późnego wyszukiwania, to wszystko. Może Stroustrup naprawdę polubił to słowo. Myślałem, że klasy są abstrakcyjne (nie czyste), podczas gdy metody mogą być czyste (ale nie abstrakcyjne). Możliwe jednak, że to wymyśliłem.
Steve314,
3
@ Steve314, to nie był Stroustrup - najwyraźniej byli tak nazywani już w Simula .
Péter Török

Odpowiedzi:

9

Nygaard i Dahl po raz pierwszy użyli tego terminu, w SIMULA 67 Common Basic Language . Patrz na przykład sekcja 2.1 i sekcja 2.2.3. (O ile mogę przynajmniej powiedzieć. Ale hej, jeśli chodzi o OOP, to prawdopodobnie pierwsze użycie tego terminu.)

Frank Shearar
źródło
3
Simula była pierwszym językiem OO, AFAIK, więc po raz pierwszy używa wielu terminów w kontekście OOP. Bardzo wpłynęło to na Stroustrupa, który początkowo chciał po prostu języka z efektywnością C i lekcjami Simula.
David Thornley,
Przeglądam ten artykuł i tak, wydaje się, że jest pierwszy, ponieważ wprowadzają „klasy” i „obiekty”.
Steven Jeuris
2
Więc po pewnym czasie zmarnowałem czytanie definicji SIMULA 67. Simula 67 wymyśliła w 1970 r. „Wirtualny” wraz z „klasą”, „przedmiotem”, „ukrytym”, „wywołaniem według wartości”, „wywołaniem przez odniesienie”. Brak oznak „czystego”, „nieczystego” lub „abstrakcyjnego”.
Steven Jeuris
5
„Zmarnowane” wydaje się dziwnym słowem, które można opisać, czytając jedną z najważniejszych prac w tej dziedzinie.
Frank Shearar
7

Więc ... Robię małe badania. Poniżej znajduje się krótka lekcja historii dla zainteresowanych. :) Przejdź do konkluzji na dole, jeśli interesuje Cię tylko odpowiedź.

1967 :

SIMULA 67 , pierwszy obiektowy język programowania, definiuje słowa kluczowe jako klasę , obiekt , wywołanie przez odniesienie , wywołanie według wartości i wirtualny .

System dziedziczenia SIMULA był pierwotnie znany pod inną nazwą, konkatenacją (a później znany jako prefiks ), odnosząc się do faktu, że kod nadtypów został skopiowany i „połączony” z kodem podtypów. Później pojawiła się inna forma systemu dziedziczenia , delegacja , w której połączenia są delegowane przez odniesienie do odpowiedniego typu.

Wirtualny najprawdopodobniej odnosi się do procesu, który należy wykonać, aby wywołać wywołanie poprawnej implementacji za pomocą wirtualnej tabeli metod . Jest wirtualny w porównaniu do stałej / konkretnej implementacji.

1971 :

Niklaus Wirth pisze o koncepcji zdefiniowanej jako stopniowe udoskonalanie . Zasadniczo wyjaśnia, jak podzielić program na częściowe rozwiązania, które można rozszerzyć.

1974 :

To pierwszy znaleziony przeze mnie artykuł, w którym ujęto termin abstrakcyjne typy danych autorstwa Barbary Liskov .

Abstrakcyjny typ danych definiuje klasę obiektów abstrakcyjnych, która jest całkowicie scharakteryzowana przez operacje dostępne na tych obiektach. Oznacza to, że można zdefiniować typ abstrakcyjny, definiując operacje charakteryzujące dla tego typu. Gdy programista korzysta z abstrakcyjnego obiektu danych, interesuje go jedynie zachowanie, które ten obiekt wykazuje, ale nie szczegóły, w jaki sposób osiąga się to za pomocą implementacji.

W tym dokumencie zdefiniowano także klaster operacji, który wydaje się określać to, co obecnie znamy jako interfejs .

Interesująca terminologia naukowa (artykuł z 1996 r.):

Dziedziczenie : mechanizm niskiego poziomu, za pomocą którego obiekty lub klasy mogą współdzielić zachowanie lub dane.

Subtyping : wyraża specjalizację koncepcyjną. Szczególna forma dziedziczenia, zwana także dziedziczeniem interfejsu .

Zasady abstrakcji : proces organizowania naszej wiedzy na temat dziedziny aplikacji w hierarchiczne rankingi kolejności abstrakcji w celu lepszego zrozumienia omawianych zjawisk.

Częściowo wdrożone abstrakcje : abstrakcje, których definicje celowo pozostawiono niekompletne.

Klasy abstrakcyjne : Określenie specyficzne dla częściowo zaimplementowanej klasy w systemach obiektowych.

Nieograniczone dziedziczenie : umożliwia ponowne zdefiniowanie (lub nawet usunięcie) operacji w podklasach.

Ścisłe dziedziczenie : Dziedziczenie zgodne z zachowaniem.

Wniosek :

Klasa abstrakcyjna to najbardziej ogólny termin używany w systemach obiektowych. Wygląda na to, że czyste i nieczyste funkcje wirtualne pochodzą tylko z C ++. Na przykład ten wywiad ze Stroustrupem wydaje się, że wynalazł warunki. Artykuły naukowe używają bardziej ogólnej terminologii.

Wirtualny pochodzi z SIMULA, co powoduje, że jego użycie jest powszechne, ale nie jest to termin ogólny. Definiuje już szczegóły implementacji. Mówienie w kategoriach rodzajów dziedziczenia jest bardziej odpowiednie. Domyślnie nie-wirtualny domyślnie odpowiada ścisłemu dziedziczeniu , natomiast domyślnie wirtualny odpowiada nieograniczonemu dziedziczeniu .

Czy ktoś jest zainteresowany dostosowaniem wpisu na Wikipedii ? :)

Steven Jeuris
źródło
Przed Barbarą Liskov Dijkstra miał również coś do powiedzenia na temat „SKŁADU PROGRAMU KROK” WISE , co może być również odpowiednim zasobem.
Steven Jeuris
4

W C ++ funkcje składowe, które są dynamicznie powiązane, a zatem mogą zostać zastąpione przez podklasę, nazywane są „wirtualnymi”. Funkcje wirtualne, które absolutnie muszą zostać zastąpione, nazywane są „czystymi wirtualnymi”. Zauważ, że czysto wirtualna funkcja może mieć ciało, chociaż często nie. Klasa, która ma co najmniej jedną czystą funkcję wirtualną, jest nazywana „abstrakcyjną” i nie można jej tworzyć, tylko na podstawie.

Zgaduję, że powodem, dla którego funkcje wirtualne są nazywane wirtualnymi, jest fakt, że nie wiadomo, która faktyczna funkcja zostanie wywołana w czasie kompilacji. W pewnym sensie wirtualne wywołanie funkcji „nie istnieje” w czasie kompilacji.

Zgaduję również, że powodem, dla którego termin „streszczenie” jest używany dla klasy z czystą funkcją wirtualną, jest to, że nie można mieć żadnych obiektów tej klasy. W pewnym sensie jest to abstrakcyjne pojęcie dalekie od konkretnego świata przedmiotów.

Edycja: inne języki.

Jeśli chodzi o pytanie, jak ogólny jest termin „wirtualny”, oto moje dwa centy. W Smalltalk wszystkie funkcje używają dynamicznego wiązania, więc wszystkie są wirtualne i nie ma potrzeby używania specjalnego terminu ani słowa kluczowego języka. W języku Java, jeśli się nie mylę, kompilator automatycznie decyduje, czy należy zastosować powiązanie dynamiczne, więc w przypadku programisty nie ma rozróżnienia, a zatem nie ma słowa kluczowego „wirtualnego”.

W C ++ konieczne jest rozróżnienie między wirtualnym a niewirtualnym, ponieważ to do programisty należy decyzja, kiedy należy użyć powiązania dynamicznego, aby zaoszczędzić na narzutach, gdy nie są potrzebne.

Dima
źródło
1
+1: Również „Streszczenie” dotyczy wielu języków. „Wirtualny” nie.
S.Lott,
@ S.Lott: Całe pytanie dotyczy tego, czy wirtualny jest terminem ogólnym. O ile mogę teraz stwierdzić, wirtualny ma zastosowanie w wielu językach i został po raz pierwszy wymyślony przez Simulę. Pozostaje pytanie o czystość / nieczystość i abstrakcję.
Steven Jeuris,
@Steven Jeuris: „wirtualny ma zastosowanie w wielu językach”? Naprawdę. Jak dotąd wydaje się, że są to C, C ++ i Simula. Z pewnością nie dotyczy to nawet Pythona. Wydaje się, że nie dotyczy to Javy.
S.Lott,
Dotyczy to Object Pascal / Delphi. Delphi ma dodatkową koncepcję - dynamic- która jest rodzajem wirtualnej metody, która wymienia przestrzeń na czas: zajmuje mniej miejsca i jest wolniejsza do wykonania niż virtualmetody.
Frank Shearar,
2
@Steven Jeuris: „wirtualny domyślnie” to nie to samo, co użycie „wirtualnego” do opisu abstrakcyjnych funkcji. Myślę, że ludzie, którzy mówią „wszystkie funkcje są wirtualne”, stosują koncepcję C ++ w innym języku. I myślę, że robią to niewłaściwie. Ponieważ wszystkie funkcje metody są wirtualne w Pythonie, temat ten nigdy nie jest wspomniany przy użyciu „wirtualnego”, z wyjątkiem miejsc takich jak Przepełnienie stosu, aby zastosować koncepcję C ++ w Pythonie. Wydaje mi się, że w takich przypadkach wirtualnie jest stosowane niewłaściwie, ponieważ dokumenty w języku Python nie używają tego słowa.
S.Lott,