The artikel Wikipedia pada bahasa berbasis prototipe berisi paragraf berikut:
Hampir semua sistem berbasis prototipe didasarkan pada bahasa yang ditafsirkan dan diketik secara dinamis. Namun, sistem yang didasarkan pada bahasa yang diketik secara statis layak secara teknis.
Dalam hal apa sistem tipe statis memaksakan pembatasan atau memperkenalkan kompleksitas dalam bahasa berbasis prototipe, dan mengapa ada bahasa prototipe yang diketik secara lebih dinamis?
Jawaban:
Batas antara tipe fundamental dan objek kabur dan sering secara artifisial diperkenalkan. Sebagai contoh, Di C sebuah struct hanya sekelompok catatan, hanya tipe non-objek turunan. Dalam C ++, sebuah struct adalah kelas dengan semua bidang publik, sebuah objek. Namun, C ++ hampir sepenuhnya kompatibel dengan C ... perbatasannya sangat lembut di sini.
Untuk pemrograman berbasis prototipe Anda harus memiliki objek yang bisa berubah saat runtime. Mereka HARUS diketik lunak karena setiap perubahan saat runtime, kelas dari satu jenis berubah menjadi yang lain - jenisnya berubah.
Anda mungkin menjaga tipe fundamental dan turunan non-objek sebagai statis sekalipun. Tapi ini menimbulkan perbedaan yang aneh, objek diketik dengan lembut, bukan obyek diketik statis, dan barier yang keras harus dibuat di antara keduanya. Haruskah Anda dapat mengubah struktur? Sebuah benang? Haruskah Angka menjadi kelas atau tipe fundamental, atau sekumpulan tipe fundamental, int / float / bignum / etc?
Itu hanya lebih alami dan mudah dipelajari, digunakan dan ditulis untuk memiliki seragam ini, semua jenis bisa berubah atau tidak ada jenis yang bisa berubah saat runtime. Jika Anda menyatakan hanya satu jenis (Objek) yang bisa berubah, Anda berakhir dengan sakit kepala dan masalah kedua dunia.
Ketik-statis adalah:
Ketik dinamis adalah:
Dengan memadukan keduanya, Anda banyak berkorban.
sumber
Kesulitannya cukup mudah untuk dilihat: Mengambil tampilan objek sebagai kamus metode, atau sebagai hal-hal yang merespons pesan, perhatikan hal berikut tentang bahasa OO umum yang diketik secara statis:
Semua kunci kamus / pesan secara umum dideklarasikan terlebih dahulu, menggunakan pengidentifikasi yang dideklarasikan secara statis.
Set pesan tertentu dideklarasikan sebelumnya, dan objek dikaitkan dengan set ini untuk menentukan pesan mana yang mereka respons.
Hubungan inklusi dari satu set pesan menjadi subset dari yang lain dinyatakan secara statis dan eksplisit; tidak diumumkan tetapi subset logis tidak valid.
Pengecekan jenis upaya untuk memastikan bahwa semua pesan dikirim hanya ke objek yang menanggapi mereka.
Setiap konflik ini sampai batas tertentu dengan sistem berbasis prototipe:
Nama pesan dapat dideklarasikan terlebih dahulu, dalam bentuk "atom" atau string yang diinternir atau yang lainnya, tetapi hanya sedikit; plastisitas objek berarti menetapkan tipe ke metode adalah canggung.
Ini bisa dibilang fitur penting dari sistem berbasis prototipe yang set pesan didefinisikan oleh apa yang ditanggapi oleh suatu objek, bukan sebaliknya. Masuk akal untuk menetapkan alias ke kombinasi tertentu pada waktu kompilasi, tetapi set pesan yang ditentukan saat runtime harus dimungkinkan.
Dampak nyata dari dua hal di atas menyentuh rumah dengan hubungan inklusi, di mana deklarasi eksplisit sama sekali tidak bisa dijalankan. Warisan dalam pengertian subtyping nominal yang statis bertentangan dengan sistem berbasis prototipe.
Yang membawa kita ke titik akhir, yang sebenarnya tidak ingin kita ubah. Kami masih ingin memastikan bahwa pesan hanya dikirim ke objek yang meresponsnya. Namun:
Jadi bagaimana ini bisa diatasi? Entah membatasi generalitas penuh entah bagaimana (yang tidak menyenangkan, dan dapat dengan cepat membunuh manfaat menggunakan sistem berbasis prototipe di tempat pertama), atau membuat sistem tipe jauh lebih cair dan mengungkapkan kendala daripada jenis yang tepat .
Sistem tipe berbasis kendala dengan cepat mengarah pada gagasan struktural sub-mengetik , yang dalam arti yang sangat longgar dapat dianggap sebagai setara statis "mengetik bebek". Hambatan terbesar di sini adalah bahwa sistem seperti itu jauh lebih rumit untuk diketik, dan kurang dikenal (yang berarti sedikit pekerjaan yang harus dipelajari sebelumnya).
Singkatnya: Ini mungkin, itu hanya lebih sulit untuk dilakukan daripada sistem tipe statis nominal atau sistem dinamis berdasarkan runtime metadata, dan karenanya sedikit orang yang peduli.
sumber
Saya percaya cara untuk mencapai bahasa berbasis prototipe yang diketik secara statis adalah dengan mendasarkan bahasa di sekitar Templat dan Konsep.
Konsep pernah menjadi fitur yang direncanakan untuk C ++ 0x. Kode generik dalam templat C ++ sudah de facto "secara statis diketik bebek". Gagasan Konsep adalah untuk dapat mengatakan beberapa hal tentang anggota yang diperlukan dan karakteristik tipe, tanpa memerlukan atau menyiratkan model pewarisan kelas yang mendasari hubungan itu (karena harus bekerja dengan kode templat yang ada yang sudah "diketik dengan bebek statis" ).
Dalam bahasa yang didasarkan dari bawah ke atas pada Templat dan Konsep, itu akan menjadi Konsep yang berbasis prototipe, dan Templat akan membebaskan Anda dari peduli tentang model kelas apa pun yang mungkin atau mungkin tidak digunakan untuk menerapkan jenis nilai.
Selain trik menggunakan kompilasi bertahap untuk memungkinkan bahasa menjadi meta-bahasa sendiri, derivasi prototipikal Konsep ini tentu tidak akan berubah begitu dibuat. Namun, keberatan yang bukan berbasis prototipe adalah herring merah. Ini hanya akan menjadi bahasa fungsional. Sebuah dinamis bahasa prototipe-dasar yang juga fungsional memiliki setidaknya dicoba .
sumber