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.