Jenis sistem mencegah kesalahan
Jenis sistem menghilangkan program ilegal. Pertimbangkan kode Python berikut.
a = 'foo'
b = True
c = a / b
Dengan Python, program ini gagal; itu melempar pengecualian. Dalam bahasa seperti Java, C #, Haskell , apa pun, ini bahkan bukan program hukum. Anda sepenuhnya menghindari kesalahan ini karena itu tidak mungkin dilakukan dalam rangkaian program input.
Demikian pula, sistem tipe yang lebih baik mengesampingkan lebih banyak kesalahan. Jika kita melompat ke sistem tipe super canggih, kita dapat mengatakan hal-hal seperti ini:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Sekarang sistem tipe menjamin bahwa tidak ada kesalahan divide-by-0.
Kesalahan macam apa
Berikut adalah daftar singkat tentang apa yang dapat mencegah sistem jenis kesalahan
- Kesalahan di luar jangkauan
- Injeksi SQL
- Generalisasi 2, banyak masalah keamanan (untuk apa pengecatan di Perl )
- Kesalahan di luar urutan (lupa menelepon init)
- Memaksa subset nilai yang akan digunakan (misalnya, hanya bilangan bulat yang lebih besar dari 0)
Anak kucing jahat (Ya, itu hanya lelucon)
- Kehilangan kesalahan presisi
- Kesalahan memori transaksional perangkat lunak (STM) (ini membutuhkan kemurnian, yang juga memerlukan jenis)
- Generalisasi 8, mengendalikan efek samping
- Invarian atas struktur data (apakah pohon biner seimbang?)
- Lupa pengecualian atau melempar yang salah
Dan ingat, ini juga pada waktu kompilasi . Tidak perlu menulis tes dengan cakupan kode 100% hanya untuk memeriksa kesalahan jenis, kompiler hanya melakukannya untuk Anda :)
Studi kasus: Kalkulus lambda diketik
Baiklah, mari kita periksa yang paling sederhana dari semua jenis sistem, cukup ketik kalkulus lambda .
Pada dasarnya ada dua jenis,
Type = Unit | Type -> Type
Dan semua istilah adalah variabel, lambdas, atau aplikasi. Berdasarkan ini, kita dapat membuktikan bahwa program yang diketik dengan baik akan berakhir. Tidak pernah ada situasi di mana program akan macet atau berulang selamanya. Ini tidak dapat dibuktikan dalam kalkulus lambda normal karena, itu tidak benar.
Pikirkan tentang ini, kita dapat menggunakan sistem tipe untuk menjamin bahwa program kita tidak berulang selamanya, cukup keren bukan?
Putar ke tipe dinamis
Sistem tipe dinamis dapat menawarkan jaminan yang identik dengan sistem tipe statis, tetapi pada saat runtime daripada waktu kompilasi. Sebenarnya, karena ini runtime, Anda sebenarnya dapat menawarkan lebih banyak informasi. Namun Anda kehilangan beberapa jaminan, terutama tentang properti statis seperti pengakhiran.
Jadi tipe dinamis tidak mengesampingkan program tertentu, melainkan mengarahkan program yang cacat ke tindakan yang didefinisikan dengan baik, seperti melempar pengecualian.
TLDR
Jadi, panjang dan pendeknya, adalah bahwa sistem tipe mengesampingkan program tertentu. Banyak program rusak dalam beberapa cara, oleh karena itu, dengan sistem tipe kami menghindari program-program yang rusak ini.