Apa manfaat keamanan dari sistem tipe?

47

Dalam JavaScript: The Good Parts oleh Douglas Crockford, ia menyebutkan dalam bab warisannya,

Manfaat lain dari warisan klasik adalah bahwa ia mencakup spesifikasi sistem tipe. Ini sebagian besar membebaskan programmer dari harus menulis operasi casting eksplisit, yang merupakan hal yang sangat baik karena ketika casting, manfaat keamanan dari sistem tipe hilang.

Jadi pertama-tama, apa sebenarnya keamanan itu? perlindungan terhadap korupsi data, atau peretas, atau kerusakan sistem, dll?

Apa manfaat keamanan dari sistem tipe? Apa yang membuat sistem tipe berbeda yang memungkinkannya memberikan manfaat keamanan ini?

Kesalahan Terbuat
sumber
Saya tidak yakin bahwa sistem tipe memberikan manfaat apa pun untuk bahasa yang tidak dikompilasi, tetapi sebagai pengguna jangka panjang dari bahasa yang dikompilasi, saya menemukan bahwa bahasa yang dikompilasi dengan pemeriksaan tipe yang cermat efektif dalam mencegah berbagai jenis kode yang ambigu, tidak terdefinisi atau tidak lengkap dari melewati tahap "kompilasi". Saya kira Anda bisa mengatakan bahwa tip ketik dan sistem Lint sangat berharga untuk Web Scripting (JavaScript) dan jika demikian, saya yakin kita akan melihat cukup banyak. Siapa pun yang lucu? Bahasa dinamis seperti Python sepertinya tidak lebih buruk karena kurangnya sistem tipe statis.
Warren P
1
Hari ini kita memahami bahwa mengetik harus perilaku dan bukan struktural. Sayangnya, sebagian besar bahasa pemrograman modern tidak memiliki cara untuk menegaskan perilaku tipe ( lihat pertanyaan ini untuk bacaan yang bagus). Ini membuat sistem tipe sangat tidak berguna dalam banyak kasus terutama karena kesalahan tipe sederhana yang jawaban yang disebutkan di sini dapat ditangkap oleh linter pintar yang memeriksa masalah umum.
Benjamin Gruenbaum
4
@BenjaminGruenbaum Apa yang Anda deskripsikan sudah ada dalam bahasa seperti OCaml secara statis. Ini disebut pengetikan struktural, itu sebenarnya cukup lama, pengetikan nominal lebih baru.
jozefg
2
@BenjaminGruenbaum: ... Apa !? Ini jelas tidak dapat diputus dalam bahasa yang diketik secara statis, atau menulis kompiler untuk bahasa-bahasa itu tidak mungkin.
BlueRaja - Danny Pflughoeft
6
@BenjaminGruenbaum: Komentar Anda sangat berharga, dan kertas yang menarik, tetapi tidak menanggung keluar klaim Anda bahwa "biasanya diputuskan dalam bahasa statis seperti Java terlalu", karena hal ini menunjukkan bahwa adalah decidable di C #, dan daun membuka pertanyaan apakah itu diputuskan di Jawa. (Lagi pula, IME, ketika kompiler untuk bahasa yang diketik secara statis tidak dapat memutuskan bahwa sesuatu diketik dengan baik, ia menolaknya (atau gagal untuk mengompilasinya), jadi ketidakpastian keputusan adalah gangguan daripada lubang pada jenis- keamanan.)
ruakh

Jawaban:

82

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

  1. Kesalahan di luar jangkauan
  2. Injeksi SQL
  3. Generalisasi 2, banyak masalah keamanan (untuk apa pengecatan di Perl )
  4. Kesalahan di luar urutan (lupa menelepon init)
  5. Memaksa subset nilai yang akan digunakan (misalnya, hanya bilangan bulat yang lebih besar dari 0)
  6. Anak kucing jahat (Ya, itu hanya lelucon)
  7. Kehilangan kesalahan presisi
  8. Kesalahan memori transaksional perangkat lunak (STM) (ini membutuhkan kemurnian, yang juga memerlukan jenis)
  9. Generalisasi 8, mengendalikan efek samping
  10. Invarian atas struktur data (apakah pohon biner seimbang?)
  11. 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.

jozefg
sumber
25
+1 untuk dikompilasi sama dengan menulis banyak tes.
Dan Neely
3
@DanNeely Ini hanya untuk mengilustrasikan bahwa dalam bahasa yang dinamis, Anda perlu menggunakan semua bagian kode untuk menangkap kesalahan yang diperiksa sistem tipe secara gratis. Dan dalam bahasa yang diketik secara dependen, Anda sebenarnya dapat sepenuhnya mengganti tes dengan tipe. Sering kali Anda perlu membuktikan teorema kebenaran tambahan
jozefg
3
Jika sistem tipe Anda telah membuktikan bahwa program Anda harus berakhir, itu (mungkin) dilakukan dengan membuktikan bahwa ia menghitung fungsi primitif-rekursif. Yang keren saya kira, tetapi kelas kompleksitas yang secara signifikan kurang menarik daripada apa yang dapat memecahkan Turing Machine. (Itu tidak berarti bahwa nilai menengah tidak besar; fungsi Ackermann adalah primitif-rekursif ...)
Donal Fellows
5
@DonalFellows Fungsi Ackermann bukan rekursif primitif, meskipun ini adalah fungsi total yang dapat dihitung.
Taymon
4
@sacundim Tepatnya, bahasa seperti agda memungkinkan untuk pemeriksaan totalitas opsional dan dalam kasus yang jarang terjadi di mana Anda ingin rekursi sewenang-wenang Anda dapat bertanya dengan baik, ini adalah sistem yang sangat apik.
jozefg
17

Realitas itu sendiri diketik. Anda tidak dapat menambahkan panjang ke bobot. Dan sementara Anda dapat menambahkan kaki ke meter (keduanya adalah satuan panjang), Anda harus menskalakan setidaknya satu dari keduanya. Gagal melakukannya dapat menghancurkan misi Mars Anda, secara harfiah.

Dalam sistem typesafe, menambahkan dua panjang yang dinyatakan dalam unit yang berbeda akan menjadi kesalahan atau akan menyebabkan pemain otomatis.

MSalters
sumber
15

Tipe sistem membantu Anda menghindari kesalahan pengkodean sederhana, atau lebih tepatnya memungkinkan kompiler menangkap kesalahan itu untuk Anda.

Misalnya, dalam JavaScript dan Python, masalah berikut ini sering kali hanya akan tertangkap saat runtime - dan tergantung pada kualitas pengujian / kelangkaan kondisi tersebut dapat membuatnya menjadi produksi:

if (someRareCondition)
     a = 1
else
     a = {1, 2, 3}

// 10 lines below
k = a.length

Sementara bahasa yang diketik dengan kuat akan memaksa Anda untuk menyatakan secara eksplisit bahwa itu aadalah array dan tidak akan membiarkan Anda menetapkan bilangan bulat. Dengan cara ini, tidak ada kesempatan atidak akan memiliki length- bahkan dalam kasus paling langka.

Eugene
sumber
5
Dan linter cerdas dalam IDE seperti WebStorm JavaScript dapat mengatakan "Kemungkinan referensi yang tidak ditentukan ke. Panjang untuk nomor a". Ini tidak diberikan kepada kami dengan memiliki sistem tipe eksplisit.
Benjamin Gruenbaum
4
1. Secara statis tidak terlalu kuat 2. @BenjaminGruenbaum Ya, tapi ini dilakukan dengan mengejar grafik tugas di latar belakang, anggap saja seperti juru bahasa mini yang mencoba mencari tahu ke mana perginya. Jauh lebih sulit daripada ketika tipe memberi Anda gratis
jozefg
6
@BenjaminGruenbaum: Jangan bingung implisit / eksplisit dengan kuat / lemah. Haskell, misalnya, memiliki sistem tipe yang sangat kuat yang membuat sebagian besar bahasa lain malu, tetapi karena keputusan desain bahasa tertentu membuatnya juga mampu melakukan inferensi tipe universal, yang pada dasarnya menjadikannya bahasa pengetikan yang sangat implisit dengan dukungan untuk pengetikan eksplisit. (Yang harus Anda gunakan, karena tipe penyimpulan hanya dapat menyimpulkan dari apa yang Anda tulis, bukan apa yang Anda maksudkan!)
Phoshi
6
“Bahasa yang diketik dengan kuat akan memaksa Anda untuk secara eksplisit menyatakan bahwa a adalah array” Itu salah. Python sangat diketik dan tidak mengharuskan itu. Bahkan bahasa yang diketik secara statis dan sangat tidak memerlukan hal itu jika mereka mendukung inferensi jenis (dan sebagian besar bahasa arus utama melakukannya, setidaknya sebagian).
Konrad Rudolph
1
@BenjaminGruenbaum: Ah, cukup adil. Meski begitu, akan ada kasus-kasus di mana tidak ada penganalisa statis JS dapat melakukan jenis pengetikan yang sama dengan bahasa pengetikan yang kuat, memecahkan bahwa dalam kasus umum membutuhkan pemecahan masalah penghentian. Haskell harus membuat beberapa keputusan desain yang adil untuk mencapai inferensi tipe hampir 100%, dan C # / Scala tidak dapat menyimpulkan semuanya. Tentu saja, dalam kasus-kasus itu, tidak masalah karena Anda hanya dapat secara eksplisit menentukan jenis - dalam Javascript, itu berarti bahkan penganalisa statis terbaik tidak dapat lagi memeriksa kode Anda.
Phoshi
5

Semakin awal dalam siklus pengembangan perangkat lunak Anda dapat menangkap kesalahan, semakin murah untuk memperbaikinya. Pertimbangkan kesalahan yang menyebabkan klien terbesar Anda, atau semua klien Anda kehilangan data. Kesalahan semacam itu bisa menjadi akhir dari perusahaan Anda jika hanya tertangkap setelah pelanggan nyata kehilangan data! Jelas lebih murah untuk menemukan dan memperbaiki bug ini sebelum memindahkannya ke produksi.

Bahkan untuk kesalahan yang lebih murah, lebih banyak waktu dan energi dihabiskan jika penguji terlibat daripada jika programmer dapat menemukan dan memperbaikinya. Lebih murah jika tidak diperiksa ke kontrol sumber di mana programmer lain dapat membangun perangkat lunak yang bergantung padanya. Jenis keamanan mencegah kesalahan kelas tertentu bahkan dari kompilasi, sehingga menghilangkan hampir seluruh biaya potensial dari kesalahan tersebut.

Tapi itu bukan keseluruhan cerita. Seperti yang akan diberitahukan oleh siapa pun yang memprogram dalam bahasa yang dinamis, kadang-kadang ada baiknya jika program Anda hanya mengkompilasi sehingga Anda dapat mencoba sebagian darinya tanpa menyelesaikan setiap detail kecil untuk dikerjakan. Ada pertukaran antara keamanan dan kenyamanan. Tes unit dapat mengurangi beberapa risiko menggunakan bahasa yang dinamis, tetapi menulis dan mempertahankan tes unit yang baik memiliki biaya sendiri yang mungkin lebih tinggi daripada menggunakan bahasa yang aman.

Jika Anda bereksperimen, jika kode Anda hanya akan digunakan sekali (seperti laporan satu kali), jika Anda berada dalam situasi di mana Anda tidak akan repot-repot menulis tes unit, maka bahasa yang dinamis mungkin sempurna untukmu. Jika Anda memiliki aplikasi besar dan ingin mengubah satu bagian tanpa merusak sisanya, maka mengetikkan keselamatan adalah penyelamat. Jenis-jenis kesalahan yang ditangkap keselamatan adalah jenis kesalahan yang cenderung diabaikan atau salah oleh manusia saat melakukan refactoring.

GlenPeterson
sumber
Ini menjual pengetikan dinamis, gagal menyebutkan manfaat utamanya (yang disebutkan berguna oleh yang relatif tidak penting). Tampaknya juga menyiratkan sesuatu yang aneh tentang tes unit - ya, mereka sulit dilakukan dan memiliki biaya, dan itu berlaku untuk bahasa yang diketik secara statis juga. Apa yang ingin dikatakan ini? Juga gagal menyebutkan keterbatasan (berdasarkan desain) dari sistem tipe saat ini, baik dalam hal apa yang dapat mereka ungkapkan maupun dalam kesalahan apa yang dapat mereka tangkap.
@MattFenwick apa yang Anda rasakan adalah manfaat utama dari pengetikan dinamis?
GlenPeterson
Sistem tipe statis tipikal menolak banyak program yang diketik dengan baik oleh desain. ( alternatif ) (BTW, kritik saya hanya diarahkan pada paragraf ke-3 dan ke-4.)
4

pengantar

Keamanan jenis dapat dicapai dengan bahasa yang diketik secara statis (dikompilasi, pemeriksaan tipe statis) dan / atau runtime (dievaluasi, pemeriksaan tipe dinamis). Menurut Wikipedia, '... sistem tipe kuat digambarkan sebagai sistem yang tidak mungkin mengalami kesalahan jenis runtime yang tidak dicentang (ed Luca Cardelli). Dalam tulisan lain, tidak adanya kesalahan run-time yang tidak diperiksa disebut sebagai safety atau type safety ... '

Keselamatan - Pemeriksaan Tipe Statis

Secara klasik, keamanan jenis telah identik dengan pengetikan statis, dalam bahasa seperti C, C ++ dan Haskell, yang dirancang untuk mendeteksi kesalahan pencocokan jenis saat dikompilasi. Ini bermanfaat untuk menghindari kondisi yang berpotensi tidak terdefinisi atau rawan kesalahan ketika program dijalankan. Ini bisa sangat berharga di mana ada risiko bahwa tipe penunjuk mungkin tidak cocok, misalnya, situasi yang dapat menyebabkan konsekuensi bencana jika tidak terdeteksi. Dalam hal ini pengetikan statis dianggap identik dengan keamanan memori.

Namun pengetikan statis tidak sepenuhnya aman tetapi meningkatkan keamanan . Bahkan sistem yang diketik secara statis dapat memiliki konsekuensi bencana. Banyak ahli menganggap bahwa tipe yang diketik secara statis dapat digunakan untuk menulis sistem yang lebih kuat dan kurang rawan kesalahan (mission critical).

Bahasa yang diketik secara statis dapat membantu mengurangi risiko hilangnya data atau hilangnya keakuratan dalam pekerjaan numerik, yang dapat terjadi karena kesalahan pencocokan atau pemangkasan ganda ke float atau tipe integral dan float yang tidak cocok.

Ada keuntungan menggunakan bahasa yang diketik secara statis untuk efisiensi dan kecepatan eksekusi. Manfaat runtime dari tidak harus menentukan jenis selama eksekusi.

Keselamatan - Pengecekan Jenis Runtime

Erlang, misalnya, adalah tipe deklaratif, jenis bahasa yang diperiksa secara dinamis yang berjalan pada mesin virtual. Kode erlang dapat disusun byte. Erlang dianggap sebagai bahasa misi-kritis, toleran-kesalahan yang paling penting, dan dilaporkan bahwa Erlang memiliki keandalan sembilan angka sembilan (99,9999999% atau tidak lebih dari 31,5 msec per tahun).

Bahasa tertentu, seperti Common Lisp, tidak diketik secara statis tetapi jenis dapat dideklarasikan jika diinginkan yang dapat membantu meningkatkan kecepatan dan efisiensi. Perlu dicatat juga bahwa banyak dari bahasa yang ditafsirkan yang lebih banyak digunakan, seperti Python, berada di bawah loop evaluasi, ditulis dalam bahasa yang diketik secara statis seperti C atau C ++. Commom Lisp dan Python dianggap tipe aman oleh definisi di atas.

AsymLabs
sumber
2
Saya keberatan dengan "sangat diketik". Maksud Anda mengetik secara statis. Tipe yang kuat membawa hampir tidak ada artinya, pada dasarnya digunakan untuk mengatakan "Saya suka sistem tipe ini"
jozefg
@ jozefg Poin bagus. Saya akan mengubah pos.
AsymLabs
3
Juga tidak berguna untuk mengatakan bahasa yang ditafsirkan ... tentang implementasi bahasa ya, tetapi bukan bahasa itu sendiri. Bahasa apa pun dapat ditafsirkan atau dikompilasi. Dan bahkan setelah pengeditan Anda menggunakan istilah pengetikan yang kuat dan lemah.
Esailija
3
@ jozefg: Saya selalu berpikir bahwa sangat diketik berarti bahwa setiap nilai memiliki tipe tetap (misalnya integer, string, dll), sedangkan yang diketik lemah berarti bahwa nilai dapat dipaksakan ke nilai dari tipe lain, jika dianggap nyaman untuk dilakukan begitu. Misalnya, dalam Python (sangat diketik), 1 + "1"melempar pengecualian, sedangkan dalam PHP (diketik dengan lemah) 1 + "1"menghasilkan 2(string "1"secara otomatis dikonversi ke integer 1).
Giorgio
1
@Iorgio dengan definisi seperti misalnya Java tidak diketik dengan kuat. Tetapi dalam banyak kasus itu diklaim. Tidak ada artinya untuk kata-kata ini. Ketikan Strong / Weak memiliki definisi yang jauh lebih akurat sebagai "Saya suka / tidak bahasa ini" seperti kata jozefg.
Esailija
1

manfaat keamanan dari sistem tipe hilang.

Jadi pertama-tama, apa sebenarnya keamanan itu? perlindungan terhadap korupsi data, atau peretas, atau kerusakan sistem, dll?

Apa manfaat keamanan dari sistem tipe? Apa yang membuat sistem tipe berbeda yang memungkinkannya memberikan manfaat keamanan ini?

Saya merasa seperti sistem tipe memiliki pandangan negatif. Tipe sistem lebih banyak tentang membuat jaminan daripada membuktikan tidak adanya kesalahan. Yang terakhir adalah konsekuensi dari sistem tipe. Jenis sistem untuk bahasa pemrograman adalah cara untuk menghasilkan, pada waktu kompilasi, bukti bahwa suatu program memenuhi beberapa jenis spesifikasi.

Jenis spesifikasi yang dapat dikodekan sebagai tipe tergantung pada bahasa, atau lebih langsung, pada kekuatan sistem tipe bahasa.

Jenis spesifikasi yang paling dasar adalah jaminan tentang perilaku input / output fungsi dan validitas bagian dalam badan fungsi. Pertimbangkan tajuk fungsi

f : (Int,Int) -> String

Sistem tipe yang baik akan memastikan bahwa f hanya diterapkan pada objek yang akan menghasilkan sepasang Int ketika mengevaluasi, dan menjamin bahwa f akan selalu menghasilkan string.

Beberapa pernyataan dalam bahasa, seperti blok if-then, tidak memiliki perilaku input / output; di sini sistem tipe menjamin bahwa setiap deklarasi atau pernyataan dalam blok valid; yaitu operasi yang berlaku untuk objek dari jenis yang benar. Jaminan-jaminan ini dapat digabungkan.

Juga, ini memang memberikan semacam kondisi keamanan memori. Kutipan yang Anda hadapi adalah tentang casting. Dalam beberapa kasus, casting baik-baik saja, seperti casting Int 32-bit ke Int 64-bit. Namun, secara umum, itu crash sistem tipe.

Mempertimbangkan

Foo x = new Foo(3,4,5,6);
f((Int)x,(Int)x);

Karena casting, x diubah menjadi Int, jadi secara teknis tipe di atas tidak memeriksa; Namun, itu benar-benar mengalahkan tujuan pengetikan.

Satu hal yang dapat membuat sistem tipe yang berbeda dan lebih baik adalah untuk melarang gips (A) x di mana x sebelum kasus adalah tipe B, kecuali B adalah subtipe (atau sub-objek) dari A. Ide-ide teori subtyping telah digunakan dalam keamanan untuk menghapus kemungkinan serangan integer overflow / underflow.

Ringkasan

Sistem tipe adalah cara untuk membuktikan suatu program memenuhi beberapa jenis spesifikasi. Manfaat sistem tipe dapat memberikan tergantung pada kekuatan sistem tipe yang digunakan.

Jonathan Gallagher
sumber
1

Satu keuntungan yang belum disebutkan untuk sistem tipe berpusat pada kenyataan bahwa banyak program membaca lebih banyak daripada yang tertulis, dan dalam banyak kasus sistem tipe memungkinkan banyak informasi ditentukan dengan cara yang ringkas dan dapat dengan mudah dicerna oleh seseorang yang membaca kode. Sementara tipe parameter tidak menggantikan komentar deskriptif, kebanyakan orang akan lebih cepat membaca: "int Distance;" atauDistance As Int32daripada membaca "Jarak harus menjadi bilangan bulat +/- 2147483647"; melewati fraksi dapat menghasilkan hasil yang tidak konsisten. "Selanjutnya, tipe parameter dapat membantu mengurangi kesenjangan antara apa yang dilakukan implementasi API tertentu, dibandingkan dengan apa yang berhak diandalkan oleh penelepon. Misalnya, jika implementasi Javascript tertentu dari API menggunakan parameternya dengan cara yang akan memaksa string apa pun ke bentuk numerik, mungkin tidak jelas apakah penelepon diizinkan untuk bergantung pada perilaku tersebut, atau jika implementasi API lainnya mungkin tidak berfungsi jika diberikan string. Memiliki metode yang parameternya ditentukan seperti Doubleakan memperjelas bahwa nilai string apa pun harus dipaksakan oleh penelepon sebelum diteruskan, memiliki metode dengan kelebihan yang menerima Doubledan yang lain yang menerimaString akan membuatnya lebih jelas bahwa penelepon yang memegang tali akan diizinkan untuk melewatinya seperti itu.

supercat
sumber
0

Jadi pertama-tama, apa sebenarnya keamanan itu? Perlindungan terhadap korupsi data, atau peretas, atau kerusakan sistem, dll.?

Semua jawaban lainnya dan banyak lagi. Secara umum, "keamanan jenis" hanya berarti bahwa tidak ada program yang berhasil dikompilasi oleh penyusun akan mengandung kesalahan jenis.

Sekarang, apa itu kesalahan jenis? Pada prinsipnya, Anda dapat menentukan properti yang tidak diinginkan sebagai kesalahan tipe, dan beberapa sistem tipe akan dapat secara statis memastikan tidak ada program yang memiliki kesalahan seperti itu.

Dengan "properti" di atas, maksud saya beberapa jenis proposisi logis yang berlaku untuk program Anda, misalnya, "semua indeks berada dalam batas array". Jenis-jenis properti lainnya termasuk, "semua pointer yang ditangguhkan valid", "program ini tidak melakukan I / O", atau "program ini hanya menjalankan I / O ke / dev / null", dll. Hampir semua jenis properti dapat ditentukan dan ketik diperiksa dengan cara ini, tergantung pada ekspresifitas sistem tipe Anda.

Sistem tipe dependen adalah yang paling umum dari sistem tipe, di mana Anda dapat menegakkan hampir semua properti yang Anda suka. Ini tidak selalu mudah dilakukan, karena properti canggih tunduk pada ketidaklengkapan milik Gödel .

naasking
sumber