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?
type-systems
type-safety
Kesalahan Terbuat
sumber
sumber
Jawaban:
Jenis sistem mencegah kesalahan
Jenis sistem menghilangkan program ilegal. Pertimbangkan kode Python berikut.
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:
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
Anak kucing jahat(Ya, itu hanya lelucon)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,
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.
sumber
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.
sumber
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:
Sementara bahasa yang diketik dengan kuat akan memaksa Anda untuk menyatakan secara eksplisit bahwa itu
a
adalah array dan tidak akan membiarkan Anda menetapkan bilangan bulat. Dengan cara ini, tidak ada kesempatana
tidak akan memilikilength
- bahkan dalam kasus paling langka.sumber
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.
sumber
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.
sumber
1 + "1"
melempar pengecualian, sedangkan dalam PHP (diketik dengan lemah)1 + "1"
menghasilkan2
(string"1"
secara otomatis dikonversi ke integer1
).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
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
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.
sumber
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;" atau
Distance As Int32
daripada 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 sepertiDouble
akan memperjelas bahwa nilai string apa pun harus dipaksakan oleh penelepon sebelum diteruskan, memiliki metode dengan kelebihan yang menerimaDouble
dan yang lain yang menerimaString
akan membuatnya lebih jelas bahwa penelepon yang memegang tali akan diizinkan untuk melewatinya seperti itu.sumber
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 .
sumber