Kategorisasi sistem tipe (kuat / lemah, dinamis / statis)

23

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 yang 1bisa.
  • 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.

Ben Millwood
sumber
6
Saya pikir Anda sudah memiliki jawaban: tidak ada definisi yang dapat diterima tentang pengetikan yang lemah dan kuat.
svick
Saya tidak akan menemukan itu sulit dipercaya, tapi saya mengajukan pertanyaan dengan harapan ada satu yang belum saya dengar :) atau setidaknya definisi yang lebih otoritatif daripada apa yang dilakukan oleh beberapa pria yang mengedit wiki. .
Ben Millwood
3
Untuk beberapa diskusi lebih lanjut tentang ini, lihat pertanyaan terkait ini di SO .
svick
1
Untuk memperkuat poin svick, tidak mungkin menemukan referensi otoritas pada sesuatu yang tidak diterima. Apa pun yang mengklaim sebagai otoritatif hanya akan salah (karena sejumlah contoh tandingan dapat diberikan).
edA-qa mort-ora-y
Nah, ada perbedaan antara seseorang yang menulis makalah yang mengatakan "inilah One True Definition yang disetujui semua orang" dan seseorang yang menulis makalah yang mengatakan "inilah definisi yang akan saya gunakan untuk makalah ini, meskipun saya tahu ada orang lain ". Bahkan yang terakhir akan lebih baik dari apa yang saya ketahui sejauh ini. Saya pikir Anda mungkin benar, dalam hal ini, apa yang orang katakan tentang berbagai jenis sistem yang berbeda? Apakah perbedaan dinamis / statis, setidaknya, konkret?
Ben Millwood

Jawaban:

18

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.

Uday Reddy
sumber
Bisakah Anda memberikan beberapa referensi untuk perkembangan bersejarah? "tidak adanya kesalahan jenis run-time tidak berarti apa-apa" - maksud Anda waktu kompilasi di sini?
Raphael
Berikut ini makalah tentang Euclid yang muncul di Google Cendekia. Saya ingat melihat beberapa makalah di tahun 70-an, di mana bahasa diklaim diketik dengan kuat. Itu umumnya dianggap sebagai promosi dagang.
Uday Reddy
1
@Raphael. Maksud saya "kesalahan jenis run-time". Untuk dapat menjalankan waktu, program harus melewati pemeriksa tipe statis. Intinya adalah bahwa bahasa yang diketik dengan kuat, misalnya, Java, akan memberikan kesalahan ketik pada saat run-time ketika tidak bisa memeriksanya pada waktu kompilasi. Bahasa jenis lubang, misalnya, C, akan membiarkan run-time menghasilkan sampah bukannya memberikan kesalahan.
Uday Reddy
1
@ Benmachine. Lihat bagian "memeriksa jenis" di kertas Euclid yang saya kutip. Saya pikir intinya adalah bahwa "sangat diketik" adalah kata buzz. Itu bukan gagasan teknis. Paling-paling, konten teknis itu berarti bahwa tidak ada lubang tipe.
Uday Reddy
1
Pada implementasi modern yang khas di mana dua tipe integer yang berbeda memiliki representasi yang sama (misalnya keduanya intdan longmenjadi 32 bit, atau keduanya longdan long longmenjadi 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 pertukaran
supercat
7

Makalah yang ditemukan Uday Reddy dalam jawabannya, On Understanding Types, Abstraction Data, dan Polymorphism (1985), memberikan jawaban berikut:

Bahasa pemrograman di mana jenis setiap ekspresi dapat ditentukan dengan analisis program statis dikatakan diketik secara statis. Pengetikan statis adalah properti yang berguna, tetapi persyaratan bahwa semua variabel dan ekspresi terikat ke jenis pada waktu kompilasi kadang-kadang terlalu ketat. Ini dapat digantikan oleh persyaratan yang lebih lemah bahwa semua ekspresi dijamin tipe konsisten walaupun tipe itu sendiri mungkin tidak diketahui secara statis; ini umumnya dapat dilakukan dengan memperkenalkan beberapa jenis pemeriksaan run-time. Bahasa di mana semua ekspresi adalah tipe konsisten disebut bahasa yang sangat diketik. Jika suatu bahasa diketik dengan kuat, kompilernya dapat menjamin bahwa program yang diterimanya akan dijalankan tanpa kesalahan ketik. Secara umum, kita harus berusaha keras untuk mengetik dan mengadopsi pengetikan statis jika memungkinkan.

benmachine
sumber
diposting sebagai komunitas wiki karena saya tidak pantas mendapatkan kredit untuk menemukan ini.
Ben Millwood
Masalah yang saya miliki di sini terkait dengan komentar pertama svick. Meskipun mungkin menyenangkan bahwa Anda telah menemukan definisi pengetikan yang kuat, ini jelas bukan definisi yang umum diterima.
edA-qa mort-ora-y
@ edA-qamort-ora-y: atas dasar apa Anda mengatakan itu? Apakah Anda memiliki sesuatu yang lebih baik daripada bukti anekdotal untuk apa yang bisa dan tidak diterima secara umum? Ada kutipan? (Saya mengerti bahwa Anda mungkin memiliki poin yang valid bahkan jika tidak, tetapi saya masih berpikir jawaban di atas menjawab saya; bahkan jika tidak ada konsensus, ada baiknya mengetahui setidaknya satu dari jawaban akademis yang serius).
Ben Millwood
1
Saya benar-benar tidak dapat membuktikan tidak adanya definisi yang disepakati, bukan? Itu tidak mungkin secara logis. Namun, artikel Wikipedia tentang pengetikan yang kuat memang memberikan banyak bukti, dan referensi, untuk ketidaksepakatan dan kontradiksi. en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y
@ edA-qamort-ora-y: Kutipan dari Wikipedia sebenarnya tidak membantu: beberapa tidak akademis, yang lain dikutip karena alasan selain mendefinisikan istilah. Makalah Pemrograman Typeful memang tampak menjanjikan, tetapi hanya merujuk pada definisi yang sangat singkat; mungkin ada baiknya mengedit jawaban saya. Berkenaan dengan bukti ketidakhadiran, saya pikir bukti kontroversi / ketidaksepakatan di antara orang-orang yang tahu apa yang mereka bicarakan akan cukup bagi saya (yang memang, makalah Pemrograman Typeful dapat memberi saya).
Ben Millwood
6

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.

Uday Reddy
sumber
Luar biasa, itulah yang saya inginkan. Makalah ini butuh sedikit bacaan, jadi saya pikir harus ada jawaban yang merangkum poin-poin penting. Haruskah saya mengeditnya menjadi jawaban Anda, atau memposting jawaban wiki komunitas saya sendiri? Apa pun yang terjadi, saya akan memberikannya beberapa hari lagi jika ada orang lain yang memiliki input, lalu terima apa pun yang tersisa :)
Ben Millwood
@ Benmachine. Makalah lengkap layak dibaca, tetapi masalah konseptual tingkat tinggi dibahas hanya dalam beberapa bagian pertama.
Uday Reddy
4
Saya masih berpikir itu harus dirangkum di halaman ini. Tautan mungkin kedaluwarsa nanti.
Ben Millwood
@ Benmachine. Anda dipersilakan untuk mengirim ringkasan sebagai jawaban Anda sendiri untuk pertanyaan Anda.
Uday Reddy