Singkatnya: bagaimana sistem tipe dikategorikan dalam konteks akademik; khususnya, di mana saya dapat menemukan sumber yang memiliki reputasi baik yang membuat perbedaan antara berbagai jenis sistem yang jelas?
Dalam arti, kesulitan dengan pertanyaan ini bukan karena saya tidak dapat menemukan jawaban, tetapi saya dapat menemukan terlalu banyak, dan tidak ada yang benar. Latar belakangnya adalah saya berusaha memperbaiki artikel di wiki Haskell tentang pengetikan , yang saat ini mengklaim perbedaan berikut:
- Tanpa pengetikan: Bahasa tidak memiliki gagasan tipe, atau dari perspektif yang diketik: Ada satu jenis dalam bahasa tersebut. Bahasa assembly hanya memiliki tipe 'pola bit', Rexx dan Tk hanya memiliki tipe 'teks', inti MatLab hanya memiliki tipe 'matriks bernilai kompleks'.
- Lemah mengetik: Hanya ada beberapa jenis dibedakan dan mungkin ketik sinonim untuk beberapa jenis. Misalnya C menggunakan bilangan integer untuk boolean, integer, karakter, set bit, dan enumerasi.
- Pengetikan yang kuat: Kumpulan jenis berbutir halus seperti di Ada, Bahasa Wirthian (Pascal, Modula-2), Eiffel
Ini sepenuhnya bertentangan dengan persepsi pribadi saya, yang lebih sejalan:
- Lemah mengetik: Objek memiliki tipe, tetapi secara implisit dikonversi ke tipe lain ketika konteks menuntutnya. Misalnya, Perl, PHP, dan JavaScript adalah semua bahasa yang
"1"
dapat digunakan dalam lebih kurang konteks apa pun yang1
bisa. - Pengetikan yang kuat: Objek memiliki tipe, dan tidak ada konversi tersirat (walaupun overloading dapat digunakan untuk mensimulasikannya), jadi menggunakan objek dalam konteks yang salah adalah kesalahan. Dalam Python, pengindeksan array dengan string atau float melempar pengecualian TypeError; di Haskell itu akan gagal pada waktu kompilasi.
Saya meminta pendapat tentang hal ini dari orang lain yang lebih berpengalaman di lapangan daripada saya, dan satu memberikan karakterisasi ini:
- Lemah mengetik: Melakukan operasi yang tidak valid pada data tidak dikontrol atau ditolak, tetapi hanya menghasilkan hasil yang tidak valid / sewenang-wenang.
- Pengetikan yang kuat: Operasi pada data hanya diizinkan jika data tersebut kompatibel dengan operasi.
Seperti yang saya pahami, karakterisasi pertama dan terakhir akan memanggil C yang diketik dengan lemah, yang kedua akan menyebutnya diketik dengan kuat. Yang pertama dan kedua akan memanggil Perl dan PHP yang diketik dengan lemah, yang ketiga akan memanggil mereka yang diketik dengan kuat. Ketiganya akan menggambarkan Python sebagai tipe yang sangat diketik.
Saya pikir kebanyakan orang akan mengatakan kepada saya, "tidak ada konsensus, tidak ada makna istilah yang diterima". Jika orang-orang yang salah, saya akan senang mendengar tentang hal itu, tetapi jika mereka benar, lalu bagaimana cara peneliti CS menjelaskan dan membandingkan sistem jenis? Terminologi apa yang bisa saya gunakan yang tidak terlalu bermasalah?
Sebagai pertanyaan terkait, saya merasa perbedaan dinamis / statis sering diberikan dalam hal "waktu kompilasi" dan "waktu berjalan", yang menurut saya tidak memuaskan mengingat bahwa apakah suatu bahasa dikompilasi atau tidak bukan merupakan properti dari bahasa tersebut sebagai implementasinya. Saya merasa harus ada deskripsi semantik murni dari pengetikan dinamis versus statis; sesuatu di sepanjang baris "bahasa statis adalah bahasa di mana setiap subekspresi dapat diketik". Saya akan menghargai setiap pemikiran, terutama referensi, yang membawa kejelasan pada gagasan ini.
sumber
Jawaban:
Secara historis, istilah "bahasa pemrograman yang diketik dengan kuat" mulai digunakan pada tahun 70-an sebagai reaksi terhadap bahasa pemrograman yang banyak digunakan, yang sebagian besar memiliki lubang ketik. Beberapa contoh:
Di Fortran, ada hal-hal yang disebut area penyimpanan "UMUM", yang dapat dibagi di seluruh modul, tetapi tidak ada pemeriksaan untuk melihat apakah setiap modul mendeklarasikan isi penyimpanan UMUM dengan tipe yang sama. Jadi, satu modul dapat menyatakan bahwa blok penyimpanan UMUM tertentu memiliki bilangan bulat dan yang lain angka floating point, dan hasilnya data akan rusak. Fortran juga memiliki pernyataan "EQUIVALENCE", di mana penyimpanan yang sama dapat dinyatakan mengandung dua objek berbeda dari jenis yang berbeda.
Dalam Algol 60, jenis parameter prosedur dinyatakan sebagai hanya "prosedur", tanpa menentukan jenis parameter prosedur. Jadi, orang dapat berasumsi bahwa parameter prosedur adalah prosedur penerimaan integer, tetapi meneruskan prosedur penerimaan nyata sebagai argumen. Ini akan menghasilkan jenis korupsi yang sama dengan pernyataan UMUM dan EKUIVALENSI. (Namun, Algol 60 memang menghilangkan masalah yang lebih tua.)
Dalam Pascal, "catatan varian" ditambahkan yang hampir persis seperti pernyataan EQUIVALENCE lama.
Dalam C, "tipe gips" ditambahkan dimana setiap tipe data dapat ditafsirkan kembali sebagai data dari tipe yang berbeda. Ini adalah jenis lubang yang disengaja dimaksudkan untuk programmer yang seharusnya tahu apa yang mereka lakukan.
Bahasa yang diketik sangat dirancang pada 70-an dimaksudkan untuk menghilangkan semua lubang jenis tersebut. Jika Anda menelusuri apa artinya ini, itu pada dasarnya berarti bahwa representasi data dilindungi. Tidak mungkin untuk melihat objek data dari satu tipe sebagai objek dari tipe lain yang kebetulan memiliki pola bit yang sama dengan representasi internalnya. Para ahli teori mulai menggunakan istilah "representasi kemandirian" untuk menandai sifat ini alih-alih gagasan samar tentang "ketikan yang kuat".
Perhatikan bahwa bahasa yang diketik secara dinamis seperti Lisp yang melakukan pemeriksaan jenis run-time yang lengkap "sangat diketik" dalam arti melindungi representasi. Pada saat yang sama, bahasa yang diketik secara statis akan kehilangan independensi perwakilan kecuali mereka melakukan pemeriksaan batas array. Jadi, mereka tidak "diketik dengan kuat" dalam arti istilah yang ketat. Karena konsekuensi anomali ini, istilah "sangat diketik" menjadi tidak digunakan setelah 70-an. Ketika Departemen Pertahanan AS mengembangkan persyaratan yang ketat untuk desain Ada, mereka memasukkan persyaratan bahwa bahasa tersebut harus "diketik dengan kuat". (Tampaknya telah dipercaya pada saat itu bahwa gagasan "sangat diketik" adalah jelas. Tidak ada definisi yang ditawarkan. ) Semua proposal bahasa yang diajukan sebagai tanggapan diklaim "sangat diketik". Ketika Dijkstra menganalisis semua proposal bahasa, ia menemukan bahwa tidak ada satupun dari mereka yang diketik dengan kuat dan, pada kenyataannya, bahkan tidak jelas apa arti istilah itu. Lihat laporannyaEWD663 . Namun, saya melihat bahwa istilah itu kembali digunakan sekarang, melalui generasi peneliti yang lebih muda yang tidak tahu sejarah kotak-kotak istilah tersebut.
Istilah "diketik secara statis" berarti bahwa semua pemeriksaan tipe dilakukan secara statis dan tidak ada kesalahan tipe yang akan muncul pada saat run-time. Jika bahasa ini juga sangat diketik, itu berarti bahwa sebenarnya tidak ada kesalahan ketik selama eksekusi. Jika, di sisi lain, ada tipe lubang di sistem tipe, tidak adanya kesalahan tipe run-time tidak berarti apa-apa. Hasilnya bisa benar-benar rusak.
Perdebatan baru tentang "pengetikan kuat vs lemah" tampaknya tentang apakah konversi jenis tertentu harus diizinkan. Mengizinkan string yang memerlukan bilangan bulat adalah "pengetikan lemah" menurut orang-orang ini. Ada beberapa alasan untuk itu karena berusaha mengubah string ke integer mungkin gagal, jika string tidak mewakili integer. Namun, mengonversi integer ke string tidak memiliki masalah itu. Akankah itu menjadi contoh "mengetik lemah" menurut orang-orang ini? Saya tidak punya ide. Saya perhatikan bahwa diskusi Wikipedia tentang "pengetikan lemah" tidak mengutip publikasi referensi. Saya tidak percaya bahwa itu adalah ide yang masuk akal.
Catatan ditambahkan : Poin dasarnya adalah bahwa istilah "pengetikan kuat" tidak mulai digunakan sebagai istilah teknis dengan definisi yang ketat. Itu lebih seperti yang dirasakan oleh beberapa perancang bahasa: "sistem tipe kami kuat; ia menangkap semua kesalahan jenis; ia tidak memiliki lubang ketik" dan, jadi, ketika mereka menerbitkan desain bahasa mereka, mereka mengklaim bahwa "diketik dengan kuat" . Itu adalah kata buzz yang terdengar bagus dan orang-orang mulai menggunakannya. Kertas Cardelli-Wegner adalah yang pertama yang saya lihat di mana beberapa analisis diberikan tentang apa artinya. Posting saya di sini harus dianggap sebagai penjabaran dari posisi mereka.
sumber
int
danlong
menjadi 32 bit, atau keduanyalong
danlong long
menjadi 64, sebuah program yang menggunakan pointer ke satu jenis untuk menulis beberapa penyimpanan dan menggunakan pointer dari tipe lain untuk membacanya, umumnya tidak akan memicu kesalahan run-time yang terdeteksi, tetapi dapat secara sewenang-wenang tidak berfungsi dengan cara lain yang sewenang-wenang. Dengan demikian, C modern kehilangan jenis keamanan yang ada dari bahasa lain, tanpa mendapatkan semantik yang memiliki kualitas implementasi bahasa Ritchie yang memiliki sebelumnya ditawarkan dalam pertukaranMakalah yang ditemukan Uday Reddy dalam jawabannya, On Understanding Types, Abstraction Data, dan Polymorphism (1985), memberikan jawaban berikut:
sumber
Jawaban resmi dapat ditemukan dalam artikel survei Cardelli dan Wegner: Tentang Jenis Pemahaman, abstraksi data, dan polimorfisme .
Harap diingat bahwa "mengetik kuat" memiliki arti yang diterima, "mengetik lemah" tidak. Kegagalan pengetikan yang kuat dapat dianggap lemah dan orang mungkin berbeda pada jenis kegagalan apa yang dapat diterima dan apa yang tidak.
sumber