Saya melihat istilah-istilah ini di mana-mana dalam pemrograman dan saya memiliki gagasan yang kabur tentang apa artinya. Pencarian menunjukkan kepada saya bahwa hal-hal seperti itu telah ditanyakan di seluruh stack overflow sebenarnya. Sejauh yang saya ketahui, pengetikan Statis / Dinamis dalam bahasa sedikit berbeda dengan pengetikan Kuat / Lemah, tetapi apa perbedaannya adalah di luar jangkauan saya. Sumber yang berbeda tampaknya menggunakan makna yang berbeda atau bahkan menggunakan istilah tersebut secara bergantian. Saya tidak dapat menemukan tempat yang membicarakan keduanya dan sebenarnya menjelaskan perbedaannya. Apa yang akan menyenangkan adalah jika seseorang bisa menjelaskan ini dengan jelas di sini untuk saya dan seluruh dunia.
319
Jawaban:
Pengetikan Statis / Dinamis adalah tentang kapan informasi jenis diperoleh (Baik pada waktu kompilasi atau saat runtime)
Pengetikan Kuat / Lemah adalah tentang bagaimana jenis ketat dibedakan (misalnya apakah bahasa mencoba melakukan konversi tersirat dari string ke angka).
Lihat halaman wiki untuk informasi lebih detail.
sumber
"12" + "34"
akan sama"46"
, tetapi"12" + "34Q"
akan sama"1234Q"
[untungnya, orang bisa menulis"12" & "34"
jika ada yang ingin penggabungan]. Anehnya, variabel yang menyimpan angka menyimpannya sebagai pelampung presisi ganda, dan matematika pada variabel tersebut menggunakan nilai floating-point tanpa string munging, tetapi tidak ada cara untuk bertanya apakah suatu variabel adalah string atau angka.Anda telah menemukan titik lemah dalam terminologi yang digunakan amatir untuk berbicara tentang bahasa pemrograman. Jangan menggunakan istilah pengetikan "kuat" dan "lemah" , karena mereka tidak memiliki kesepakatan universal tentang makna teknis. Sebaliknya, pengetikan statis berarti bahwa program diperiksa sebelum dieksekusi , dan suatu program mungkin ditolak sebelum dimulai. Pengetikan dinamis berarti bahwa tipe nilai diperiksa selama eksekusi , dan operasi yang diketik dengan buruk dapat menyebabkan program berhenti atau menandakan kesalahan pada saat dijalankan . Alasan utama untuk pengetikan statis adalah untuk mengesampingkan program yang mungkin memiliki "kesalahan tipe dinamis".
Pengetikan yang kuat umumnya berarti bahwa tidak ada celah dalam sistem tipe, sedangkan pengetikan yang lemah berarti sistem tipe dapat ditumbangkan (membatalkan jaminan apa pun). Istilah ini sering digunakan secara tidak benar untuk maksud pengetikan statis dan dinamis. Untuk melihat perbedaannya, pikirkan C: bahasanya dicentang jenisnya pada waktu kompilasi (pengetikan statis), tetapi ada banyak celah; Anda bisa melempar nilai dari tipe apa pun ke tipe lain dengan ukuran yang sama --- khususnya, Anda dapat menggunakan tipe pointer secara bebas. Pascal adalah bahasa yang dimaksudkan untuk diketik dengan kuat tetapi terkenal memiliki celah yang tidak terduga: rekaman varian tanpa tag.
Implementasi bahasa yang sangat diketik sering mendapatkan celah dari waktu ke waktu, biasanya sehingga bagian dari sistem run-time dapat diimplementasikan dalam bahasa tingkat tinggi. Sebagai contoh, Objective Caml memiliki fungsi yang disebut
Obj.magic
yang memiliki efek run-time hanya mengembalikan argumennya, tetapi pada waktu kompilasi ia mengkonversi nilai dari jenis apa pun ke salah satu dari jenis lainnya. Contoh favorit saya adalah Modula-3, yang desainernya disebut tipe-casting constructLOOPHOLE
.Karena itu, Anda tidak dapat mengandalkan dua orang yang menggunakan kata "kuat" dan "lemah" dengan cara yang persis sama. Jadi hindari mereka.
sumber
Sederhananya seperti ini: dalam bahasa yang diketik secara statis , jenisnya statis , artinya setelah Anda menetapkan variabel ke suatu jenis, Anda TIDAK BISA mengubahnya. Itu karena mengetik dikaitkan dengan variabel daripada nilai yang dirujuk.
Misalnya di Jawa:
Sedangkan dalam bahasa yang diketik secara dinamis , jenisnya dinamis , artinya setelah Anda menetapkan variabel ke suatu jenis, Anda BISA mengubahnya. Itu karena mengetik dikaitkan dengan nilai daripada variabel.
Misalnya dengan Python:
Di sisi lain, pengetikan kuat / lemah dalam bahasa terkait dengan konversi tipe implisit (sebagian diambil dari jawaban @ Dario):
Misalnya dengan Python:
sedangkan di PHP:
Pengetikan statis memungkinkan untuk memeriksa kebenaran jenis pada waktu kompilasi. Bahasa yang diketik secara statis biasanya dikompilasi, dan bahasa yang diketik secara dinamis ditafsirkan. Oleh karena itu, bahasa yang diketik secara dinamis dapat memeriksa pengetikan saat dijalankan.
sumber
Lemah mengetik berarti bahwa jenis objek dapat berubah tergantung pada konteksnya. Misalnya dalam bahasa yang diketik dengan lemah, string "123" dapat dianggap sebagai angka 123 jika Anda menambahkan nomor lain ke dalamnya. Contoh bahasa dengan pengetikan lemah adalah bash, awk dan PHP.
Jenis lain dari bahasa yang diketik dengan lemah adalah C, di mana data pada alamat memori dapat diperlakukan sebagai jenis yang berbeda dengan casting.
Dalam bahasa yang sangat diketik, jenis objek tidak berubah - int selalu int dan mencoba menggunakannya sebagai string akan menghasilkan kesalahan. Baik Java dan Python sangat diketik.
Perbedaan antara pengetikan dinamis dan statis adalah ketika aturan tipe diberlakukan. Dalam bahasa yang diketik secara statis, jenis setiap variabel dan parameter harus dideklarasikan di sumber dan diberlakukan pada waktu kompilasi. Dalam bahasa yang diketik secara dinamis, tipe-tipe tersebut hanya diperiksa ketika digunakan saat runtime. Jadi Java diketik secara statis dan Python diketik secara dinamis.
Namun batas-batasnya terkadang sedikit buram. Sebagai contoh meskipun Java diketik secara statis, setiap kali Anda menggunakan refleksi atau gips (misalnya ketika menggunakan wadah Obyek) mereka Anda menunda pemeriksaan tipe untuk runtime.
Demikian pula bahasa yang paling diketik kuat masih akan secara otomatis mengkonversi antara bilangan bulat dan mengapung (dan dalam beberapa bahasa BigInts presisi abitrary).
sumber
f
mengambil argumenx
(fun f(x)
) [** jadi tidak ada tipe yang dinyatakan **] dan isi fungsi adalahx+1
. Tanpa tipe yang dideklarasikan, kompiler akan mencari tahu yangx
harus berupa int.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Hari ini meneliti tentang hal ini saya menemukan artikel hebat ini http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Ini telah membersihkan banyak hal-hal untuk saya dan saya pikir itu dapat menambah beberapa jawaban besar di atas.
Mengetik Kuat dan Lemah:
Tipe Statis dan Dinamis
Jenis Eksplisit / Implisit:
sumber
Dari Scott's Programming Language Pragmatics , edisi ke-3 halaman 291, kami miliki
Jadi secara sederhana, pengetikan statis / dinamis mengacu pada waktu ketika pengecekan tipe terjadi: waktu kompilasi untuk pengetikan statis, dan jangka waktu untuk bahasa dinamis. Demikian juga, pengetikan kuat / lemah mengacu pada seberapa agresif suatu bahasa dalam menegakkan sistem tipenya.
Saya sudah mencoba menerjemahkan deskripsi Scott ke dalam diagram yang bagus, yang saya posting di bawah ini.
sumber
Saya pikir kolega lain membuat pekerjaan yang baik esp. menjelaskan perbedaan antara pengetikan statis dan dinamis. Namun sejauh menyangkut pengetikan kuat dan lemah, harus dikatakan bahwa ada perbedaan pemahaman / pandangan.
Berikut dua contoh:
Beberapa mengatakan bahwa Haskell sangat diketik, karena Anda tidak diperbolehkan melakukan konversi jenis apa pun .
Lainnya (mis. Dario view) mengatakan bahasa yang memungkinkan untuk secara implisit mengkonversi dari string ke nomor sengaja diketik, tetapi bahkan yang lain menyebut ini hanya mengetik bebek.
Kedua pernyataan tersebut menyoroti bukan ekstrem yang berlawanan dari sistem tipe, tetapi aspek yang sama sekali berbeda. Jadi saya bergabung dengan pandangan Pak Ramsey untuk tidak menggunakan istilah "kuat" dan "lemah" untuk membedakan antara sistem tipe.
sumber
Statis v / s bahasa yang diketik secara dinamis
Sangat v / s bahasa yang diketik dengan lemah
Bacaan lanjutan yang bagus
sumber
Bahasa yang diketik secara statis umumnya mengharuskan Anda untuk mendeklarasikan jenis variabel, yang kemudian diperiksa pada waktu kompilasi untuk mengurangi kesalahan. Kata "statis" dalam "diketik secara statis" mengacu pada "analisis kode statis", yang merupakan proses memeriksa kode sebelum menjalankannya. Meskipun dimungkinkan untuk bahasa yang diketik secara statis untuk menyimpulkan jenis variabel dari sisi kanan ekspresi atau parameter aktual, dalam praktiknya sebagian besar bahasa yang diketik secara statis memerlukan jenis variabel untuk dinyatakan secara eksplisit.
Bahasa yang diketik secara dinamis umumnya tidak memerlukan deklarasi variabel untuk memiliki tipe, dan mereka menyimpulkan tipe variabel berdasarkan tipe yang dihitung sebagai hasil dari mengevaluasi sisi kanan setiap pernyataan penugasan atau parameter aktual untuk panggilan fungsi. Karena variabel dapat diberikan beberapa tugas selama masa pakainya, jenisnya dapat berubah dari waktu ke waktu dan inilah mengapa ini disebut "diketik secara dinamis". Selain itu, lingkungan runtime perlu melacak tipe saat ini untuk setiap variabel, sehingga tipe terikat ke nilai daripada dengan deklarasi variabel. Ini dapat dianggap sebagai sistem informasi jenis runtime (RTTI).
Elemen bahasa yang diketik secara statis dan dinamis dapat digabungkan. Sebagai contoh, C # mendukung variabel yang diketik secara statis dan dinamis, dan bahasa berorientasi objek umumnya mendukung down-casting hirarki jenis. Bahasa yang diketik secara statis biasanya menyediakan berbagai cara untuk mem-bypass pengecekan jenis, misalnya dengan menggunakan casting, refleksi, dan pemanggilan dinamis.
Pengetikan Kuat vs. Lemah mengacu pada rangkaian seberapa banyak bahasa mencoba untuk mencegah bug karena menggunakan variabel seolah-olah itu satu jenis ketika itu sebenarnya jenis lain. Misalnya C dan Java adalah bahasa yang diketik secara statis, namun Java menggunakan pemeriksaan tipe yang jauh lebih kuat daripada C. Kode C berikut senang dikompilasi dan dijalankan, dan akan menempatkan nilai acak ke dalam variabel b pada saat runtime, kemungkinan besar menyebabkan bug:
Kode Java yang setara akan menghasilkan kesalahan kompilasi, yang umumnya lebih disukai:
sumber