Virtual atau abstrak murni, apa namanya?

15

Saat membahas pertanyaan tentang fungsi virtual pada Stack Overflow, saya bertanya-tanya apakah ada penamaan resmi untuk fungsi virtual murni (abstrak) dan non-murni.

Saya selalu mengandalkan wikipedia untuk informasi saya, yang menyatakan itu fungsi virtual murni dan non-murni adalah istilah umum. Sayangnya, artikel tersebut tidak mendukungnya dengan sumber atau referensi.

Mengutip jawaban Jon Skeet untuk balasan saya bahwa murni dan tidak murni adalah istilah umum yang digunakan:

@ Seven: Hmm ... mungkin, tapi saya hanya pernah melihatnya dalam konteks C ++ sebelumnya. Saya menduga siapa pun yang berbicara tentang mereka cenderung memiliki latar belakang C ++ :)

Apakah istilah tersebut berasal dari C ++, atau mereka pertama kali didefinisikan atau diimplementasikan dalam bahasa sebelumnya, dan apakah mereka istilah ilmiah 'resmi'?

MEMPERBARUI:

Frank Shearar membantu memberikan tautan ke deskripsi SIMULA 67 Common Base Language (1970). Bahasa ini tampaknya menjadi bahasa pertama yang memperkenalkan kata kunci OO sebagai kelas , objek , dan juga virtual sebagai konsep formal. Itu tidak mendefinisikan murni / tidak murni atau abstrak , tetapi mendukung konsep .

Siapa yang mendefinisikannya?

Steven Jeuris
sumber
1
Mungkin menemukan ini menarik ... objectmentor.com/resources/articles/abcpvf.pdf
Aaron McIver
2
fungsi virtual, warisan virtual, tabel virtual - tidak ada dengan penjelasan nyata apa yang membuat mereka "virtual". Saya tahu aturannya, tapi mengapa kata itu? Lagipula, fungsi "virtual" sama nyatanya dengan fungsi lainnya - hanya perlu pencarian yang mengikat, itu saja. Mungkin Stroustrup sangat menyukai kata itu. Saya pikir kelas itu abstrak (tidak murni), sedangkan metode mungkin murni (tapi tidak abstrak). Mungkin saja aku mengada-ada.
Steve314
3
@ Steve314, itu bukan Stroustrup - rupanya mereka dipanggil seperti ini di Simula .
Péter Török

Jawaban:

9

Nygaard dan Dahl pertama kali menggunakan istilah ini, dalam SIMULA 67 Common Base Language . Lihat di bagian 2.1, misalnya, dan bagian 2.2.3. (Sejauh yang saya tahu paling tidak. Tapi hei, sejauh menyangkut OOP, itu mungkin penggunaan pertama istilah itu.)

Frank Shearar
sumber
3
Simula adalah bahasa OO pertama, AFAIK, sehingga memiliki penggunaan pertama banyak istilah dalam konteks OOP. Ini sangat memengaruhi Stroustrup, yang awalnya hanya menginginkan bahasa dengan efisiensi C dan kelas-kelas Simula.
David Thornley
Saya membaca sekilas makalah ini, dan ya, sepertinya itu yang pertama, karena mereka memperkenalkan 'kelas' dan 'objek'.
Steven Jeuris
2
Jadi, setelah beberapa waktu terbuang membaca definisi SIMULA 67. Simula 67 menciptakan 'virtual' bersama dengan 'kelas', 'objek', 'tersembunyi', 'panggilan dengan nilai', 'panggilan dengan referensi' pada tahun 1970. Tidak ada tanda 'murni', 'tidak murni', atau 'abstrak'.
Steven Jeuris
5
"Wasted" tampaknya seperti kata aneh yang digunakan untuk menggambarkan membaca salah satu makalah mani lapangan.
Frank Shearar
7

Jadi ... Saya sudah melakukan sedikit riset. Berikut ini adalah sedikit pelajaran sejarah bagi mereka yang tertarik. :) Lewati ke kesimpulan di bagian bawah jika Anda hanya tertarik dengan jawabannya.

1967 :

SIMULA 67 , bahasa pemrograman berorientasi objek pertama mendefinisikan kata kunci sebagai kelas , objek , panggilan dengan referensi , panggilan dengan nilai dan virtual .

Sistem pewarisan SIMULA pada awalnya dikenal dengan nama yang berbeda, gabungan (dan kemudian dikenal sebagai awalan ), merujuk pada fakta bahwa kode supertipe disalin dan 'disatukan' dengan kode subtipe. Kemudian bentuk lain sistem warisan muncul, delegasi , di mana panggilan didelegasikan dengan mengacu pada jenis yang benar.

Virtual kemungkinan besar mengacu pada proses yang perlu dilakukan untuk mengirimkan panggilan ke implementasi yang benar dengan menggunakan tabel metode virtual . Ini virtual dibandingkan dengan implementasi tetap / konkret.

1971 :

Niklaus Wirth, menulis tentang konsep yang didefinisikan sebagai Stepwise Refinement . Ini pada dasarnya menjelaskan cara membagi program dalam solusi parsial yang dapat diperpanjang.

1974 :

Ini adalah kertas paling awal yang saya temukan yang mengandung istilah tipe data abstrak oleh Barbara Liskov .

Tipe data abstrak mendefinisikan kelas objek abstrak yang sepenuhnya ditandai oleh operasi yang tersedia pada objek-objek tersebut. Ini berarti bahwa tipe abstrak dapat didefinisikan dengan mendefinisikan operasi karakterisasi untuk tipe itu. Ketika seorang programmer menggunakan objek data abstrak, ia hanya peduli dengan perilaku yang ditunjukkan objek itu tetapi tidak dengan rincian tentang bagaimana perilaku itu dicapai melalui implementasi.

Makalah ini juga mendefinisikan sebuah cluster operasi yang tampaknya menentukan apa yang sekarang kita kenal sebagai antarmuka .

Terminologi ilmiah yang menarik (makalah dari 1996):

Warisan : mekanisme yang lebih rendah di mana objek atau kelas dapat berbagi perilaku atau data.

Subtyping : mengekspresikan spesialisasi konseptual. Suatu bentuk khusus warisan, juga disebut warisan antarmuka .

Prinsip Abstraksi : Proses pengorganisasian pengetahuan kita tentang domain aplikasi ke dalam peringkat hierarki urutan abstraksi, untuk mendapatkan pemahaman yang lebih baik tentang fenomena yang bersangkutan.

Abstraksi yang diimplementasikan sebagian : abstraksi yang definisinya sengaja dibiarkan tidak lengkap.

Kelas abstrak : Istilah khusus untuk kelas yang diimplementasikan sebagian dalam sistem berorientasi objek.

Warisan nonstrict : Memungkinkan operasi untuk didefinisikan ulang (atau bahkan dihapus) dalam subkelas.

Warisan ketat : Warisan yang kompatibel secara perilaku.

Kesimpulan :

Kelas abstrak adalah istilah paling umum untuk digunakan dalam sistem berorientasi objek. Tampaknya fungsi virtual murni dan non-murni hanya berasal dari C ++. Misalnya, wawancara dengan Stroustrup ini membuatnya seolah-olah dia yang menciptakan istilah-istilah itu. Makalah ilmiah menggunakan terminologi yang lebih umum.

Virtual berasal dari SIMULA, yang menyebabkan penggunaannya menjadi luas, tetapi itu bukan istilah umum. Itu sudah mendefinisikan detail implementasi. Berbicara dalam hal jenis warisan lebih tepat. Non-virtual secara default sesuai dengan warisan ketat secara default, sedangkan virtual secara default sesuai dengan warisan nonstrict .

Adakah yang tertarik untuk menyesuaikan entri wikipedia ? :)

Steven Jeuris
sumber
Sebelum Barbara Liskov, Dijkstra juga memiliki sesuatu untuk dikatakan pada "KOMPOSISI PROGRAM LANGKAH-WISE" , yang mungkin juga merupakan sumber daya yang relevan.
Steven Jeuris
4

Dalam C ++, fungsi anggota yang terikat secara dinamis, dan dengan demikian dapat diganti oleh sub-kelas disebut "virtual". Fungsi virtual yang mutlak harus diganti disebut "virtual murni". Perhatikan bahwa fungsi virtual murni mungkin memiliki tubuh, meskipun seringkali tidak. Kelas yang memiliki setidaknya satu fungsi virtual murni disebut "abstrak", dan tidak dapat dipakai, hanya berasal dari.

Saya menduga alasan mengapa fungsi virtual disebut virtual adalah fakta bahwa tidak diketahui fungsi sebenarnya yang akan dipanggil pada waktu kompilasi. Dalam arti tertentu, panggilan fungsi virtual "tidak ada" pada waktu kompilasi.

Saya juga menduga bahwa alasan istilah "abstrak" digunakan untuk kelas dengan fungsi virtual murni adalah bahwa Anda tidak dapat memiliki objek dari kelas itu. Dalam arti tertentu, ini adalah konsep abstrak yang jauh dari dunia benda konkret.

Edit: Bahasa lain.

Sejauh pertanyaan tentang seberapa umum istilah "virtual" itu, inilah dua sen saya. Di Smalltalk semua fungsi menggunakan pengikatan dinamis, jadi semuanya virtual, dan tidak perlu istilah khusus atau kata kunci bahasa. Di Jawa, jika saya tidak salah, kompiler secara otomatis memutuskan apakah pengikatan dinamis harus digunakan, sejauh yang menyangkut programmer tidak ada perbedaan, dan karenanya tidak ada kata kunci "virtual".

Dalam C ++ perbedaan antara virtual dan non-virtual diperlukan, karena terserah kepada programmer untuk memutuskan kapan pengikatan dinamis harus digunakan untuk menghemat overhead ketika itu tidak diperlukan.

Dima
sumber
1
+1: Juga, "Abstrak" berlaku untuk banyak bahasa. "Virtual" tidak.
S.Lott
@ S.Lott: Seluruh pertanyaannya adalah apakah virtual adalah istilah umum atau tidak. Sejauh yang saya tahu sekarang, virtual memang berlaku untuk banyak bahasa, dan pertama kali diciptakan oleh Simula. Pertanyaan tetap tentang murni / tidak murni dan abstrak.
Steven Jeuris
@Steven Jeuris: "virtual memang berlaku untuk banyak bahasa"? Betulkah. Sejauh ini, tampaknya C, C ++ dan Simula. Ini tentu saja tidak berlaku untuk Python sedikit pun. Tampaknya tidak berlaku untuk Java.
S.Lott
Ini berlaku untuk Object Pascal / Delphi. Delphi memiliki konsep tambahan - dynamic- yang merupakan semacam metode virtual yang memperdagangkan ruang untuk waktu: mereka membutuhkan lebih sedikit ruang, dan lebih lambat untuk dieksekusi, daripada virtualmetode.
Frank Shearar
2
@Steven Jeuris: "virtual secara default" bukanlah hal yang sama dengan menggunakan "virtual" untuk menggambarkan fungsi abstrak. Saya pikir orang-orang yang mengatakan "semua fungsi adalah virtual" menerapkan konsep C ++ ke bahasa lain. Dan saya pikir mereka melakukannya dengan tidak benar. Karena semua fungsi metode virtual dalam Python, topik tidak pernah disebutkan menggunakan "virtual" kecuali di tempat-tempat seperti Stack Overflow untuk menerapkan konsep C ++ ke Python. Saya pikir virtual diterapkan secara tidak benar dalam kasus-kasus itu, karena dokumen bahasa Python tidak menggunakan kata.
S.Lott