Jika saya dapat mengekspor satu fitur Buka ke bahasa lain, itu akan menjadi antarmuka. - Russ Cox
Kompiler Pascal saya yang sangat sederhana telah menjadi subjek dari
dua publikasi tentang Habré. Sejak tulisan mereka, bahasa telah memperoleh semua alat yang hilang yang diperlukan oleh Pascal standar, dan banyak barang yang ditambahkan Borland ke Pascal di zaman keemasannya. Kompiler juga mempelajari beberapa optimasi lokal paling sederhana, cukup jika hanya untuk menjaga mata Anda dari pendarahan ketika Anda melihat daftar disassembler.
Namun demikian, hutan pemrograman berorientasi objek tetap sama sekali tidak tersentuh. Jadi mengapa tidak berfungsi sebagai tempat pengujian bagi kompiler untuk bereksperimen di bidang ini? Dan mengapa kita tidak mengambil inspirasi dari kata-kata Russ Cox, yang dibuat dalam epigraf? Mari kita coba menerapkan metode dan antarmuka Go-style di Pascal. Idenya menarik jika hanya karena semua kompiler Pascal yang populer di masa lalu (Delphi, Free Pascal) pada dasarnya meminjam model objek dari C ++. Sangat menarik untuk melihat bagaimana pendekatan yang sama sekali berbeda, diadopsi dari Go, berakar di tanah yang sama. Jika Anda siap untuk mengikuti saya dengan ironi dalam jumlah yang cukup besar, untuk menjatuhkan pertanyaan "Mengapa?" Dan mengambil apa yang terjadi sebagai permainan, selamat datang di kucing.
Prinsip
Yang dimaksud dengan "Go style" adalah beberapa prinsip yang dengannya kami akan mengimplementasikan metode dan antarmuka dalam Pascal:
- Tidak ada konsep independen tentang kelas, objek, warisan.
- Metode ini dapat diterapkan untuk semua tipe data tertentu. Anda tidak perlu mengubah deklarasi tipe itu sendiri.
- Antarmuka kompatibel dengan tipe data tertentu yang menerapkan semua metode yang tercantum dalam deklarasi antarmuka. Pernyataan tipe data tertentu tidak mengharuskannya mengimplementasikan antarmuka.
Implementasi
Untuk mendeklarasikan metode dan antarmuka, kata kunci Pascal standar dan antarmuka digunakan dalam peran baru. Tidak ada kata kunci baru yang dimasukkan. Kata
for
digunakan untuk menunjukkan nama dan jenis penerima metode (dalam terminologi Go). Berikut adalah contoh metode deskripsi untuk tipe
TCat
dideklarasikan sebelumnya dengan bidang
Name
:
procedure Greet for c: TCat (const HumanName: string); begin WriteLn('Meow, ' + HumanName + '! I am ' + c.Name); end;
Penerima sebenarnya argumen pertama untuk metode ini.
Antarmuka adalah entri Pascal biasa, dalam deklarasi di mana
record
kata digantikan oleh
interface
kata. Dalam catatan ini, tidak diperbolehkan untuk mendeklarasikan bidang apa pun kecuali bidang jenis prosedural. Selain itu, bidang
Self
tersembunyi ditambahkan ke awal rekaman. Ini menyimpan pointer ke data jenis tertentu, yang dikonversi ke tipe antarmuka. Berikut ini contoh deklarasi antarmuka:
type IPet = interface Greet: procedure (const HumanName: string); end;
Saat mengonversi jenis tertentu ke antarmuka, kompiler memeriksa keberadaan semua metode yang diperlukan oleh antarmuka dan pencocokan tanda tangan mereka. Kemudian ia menetapkan
Self
pointer, mengisi semua bidang prosedural dari antarmuka dengan pointer ke metode tipe tertentu.
Dibandingkan dengan Go, implementasi antarmuka saat ini di Pascal memiliki keterbatasan: tidak mungkin secara dinamis meminta tipe data tertentu yang telah dikonversi ke tipe antarmuka. Dengan demikian, antarmuka kosong tidak ada artinya. Mungkin langkah pengembangan selanjutnya adalah mengisi celah ini. Namun, bahkan dalam bentuk saat ini, antarmuka memberikan polimorfisme, berguna dalam banyak tugas yang tidak sepele. Kami akan mempertimbangkan satu masalah seperti itu.
Contoh
Contoh yang baik dari penggunaan antarmuka adalah
program untuk rendering adegan tiga dimensi menggunakan metode ray tracing. Adegan ini terdiri dari benda-benda geometris sederhana: parallelepipeds, spheres, dll. Setiap sinar yang dipancarkan dari mata pengamat perlu dilacak (melalui semua pantulannya) hingga mencapai sumber cahaya atau menuju infinity. Untuk melakukan ini, metode
Intersect
ditugaskan untuk setiap jenis benda, yang menghitung koordinat titik di mana sinar mengenai permukaan benda dan komponen normal pada titik ini. Implementasi metode ini untuk berbagai jenis badan berbeda. Dengan demikian, akan lebih mudah untuk menyimpan informasi tentang tubuh dalam array entri antarmuka
Body
, dan untuk semua elemen array, metode
Intersect
disebut pada gilirannya. Antarmuka mengalihkan panggilan ini ke metode tertentu tergantung pada jenis tubuh.
Ini mungkin terlihat seperti adegan yang dibangun dengan cara yang dijelaskan:

Seluruh kode sumber program, termasuk deskripsi adegan, mengambil 367 baris.
Ringkasan
Implementasi polimorfisme paling sederhana dalam kompiler Pascal sendiri ternyata mudah, dengan cepat menghasilkan buah pertama. Beberapa komplikasi dapat diharapkan dalam tugas mendefinisikan secara dinamis tipe data tertentu, yang dikonversi ke tipe antarmuka. Upaya juga akan membutuhkan penghapusan konflik yang tidak jelas dengan mekanisme pengecekan tipe standar Pascal standar. Akhirnya, selain semua kekhawatiran tentang antarmuka, perjuangan yang tidak seimbang berlanjut dengan Microsoft atas alarm palsu Windows Defender mereka ketika meluncurkan beberapa contoh yang dikompilasi.