Saya mendengar banyak bahwa bahasa pemrograman baru diketik secara dinamis tetapi apa artinya sebenarnya ketika kita mengatakan suatu bahasa diketik secara dinamis vs diketik secara statis?
946
Saya mendengar banyak bahwa bahasa pemrograman baru diketik secara dinamis tetapi apa artinya sebenarnya ketika kita mengatakan suatu bahasa diketik secara dinamis vs diketik secara statis?
Jawaban:
Bahasa yang diketik secara statis
Suatu bahasa diketik secara statis jika jenis variabel diketahui pada waktu kompilasi. Untuk beberapa bahasa, ini berarti Anda sebagai programmer harus menentukan tipe setiap variabel (mis: Java, C, C ++); bahasa lain menawarkan beberapa bentuk inferensi tipe , kemampuan sistem tipe untuk menyimpulkan tipe variabel (mis: OCaml, Haskell, Scala, Kotlin)
Keuntungan utama di sini adalah bahwa semua jenis pemeriksaan dapat dilakukan oleh kompiler, dan karena itu banyak bug sepele ditangkap pada tahap yang sangat awal.
Contoh: C, C ++, Java, Rust, Go, Scala
Bahasa yang diketik secara dinamis
Suatu bahasa diketik secara dinamis jika jenisnya dikaitkan dengan nilai run-time, dan tidak bernama variabel / bidang / dll. Ini berarti bahwa Anda sebagai programmer dapat menulis sedikit lebih cepat karena Anda tidak harus menentukan tipe setiap waktu (kecuali menggunakan bahasa yang diketik secara statis dengan inferensi tipe ).
Contoh: Perl, Ruby, Python, PHP, JavaScript
Sebagian besar bahasa scripting memiliki fitur ini karena tidak ada kompiler untuk melakukan pengecekan tipe statis, tetapi Anda mungkin menemukan diri Anda mencari bug yang disebabkan oleh penerjemah salah mengartikan jenis variabel. Untungnya, skrip cenderung kecil sehingga bug tidak memiliki banyak tempat untuk bersembunyi.
Sebagian besar bahasa yang diketik secara dinamis memungkinkan Anda memberikan informasi jenis, tetapi tidak memerlukannya. Satu bahasa yang saat ini sedang dikembangkan, Rascal , mengambil pendekatan hybrid yang memungkinkan pengetikan dinamis di dalam fungsi tetapi menerapkan pengetikan statis untuk tanda tangan fungsi.
sumber
Bahasa pemrograman yang diketik secara statis melakukan pengecekan tipe (yaitu proses verifikasi dan menegakkan batasan tipe) pada waktu kompilasi sebagai lawan dari run-time .
Bahasa pemrograman yang diketik secara dinamis melakukan pengecekan ketik pada saat run-time sebagai lawan waktu kompilasi .
Contoh bahasa yang diketik secara statis adalah: - Java, C, C ++
Contoh bahasa yang diketik secara dinamis adalah: - Perl, Ruby, Python, PHP, JavaScript
sumber
Berikut adalah contoh yang membandingkan bagaimana Python (diketik secara dinamis) dan Go (diketik secara statis) menangani kesalahan jenis:
Python tidak mengetik pengecekan pada saat dijalankan, dan karena itu:
Berjalan dengan sangat baik, dan menghasilkan output yang diharapkan
Hi
. Kesalahan hanya dinaikkan jika garis yang bermasalah mengenai:Menghasilkan
karena baris yang relevan sebenarnya dieksekusi.
Sebaliknya, melakukan pengecekan ketik pada waktu kompilasi:
Di atas tidak akan dikompilasi, dengan kesalahan berikut:
sumber
runhaskell
, misalnya.Sederhananya seperti ini: dalam jenis variabel bahasa yang diketik secara statis adalah statis , artinya setelah Anda menetapkan variabel ke suatu jenis, Anda tidak dapat mengubahnya. Itu karena mengetik dikaitkan dengan variabel daripada nilai yang dirujuk.
Misalnya di Jawa:
Di mana di sisi lain: dalam jenis variabel bahasa yang diketik secara dinamis adalah dinamis , artinya setelah Anda mengatur variabel ke suatu jenis, Anda DAPAT mengubahnya. Itu karena mengetik dikaitkan dengan nilai yang diasumsikan daripada variabel itu sendiri.
Misalnya dengan Python:
Jadi, yang terbaik adalah memikirkan variabel dalam bahasa yang diketik secara dinamis hanya sebagai petunjuk umum untuk nilai yang diketik.
Untuk menyimpulkan, ketikkan mendeskripsikan (atau seharusnya mendeskripsikan) variabel dalam bahasa daripada bahasa itu sendiri. Itu bisa lebih baik digunakan sebagai bahasa dengan variabel yang diketik secara statis versus bahasa dengan variabel yang diketik secara dinamis, IMHO.
Bahasa yang diketik secara statis umumnya adalah bahasa yang dikompilasi, oleh karena itu, kompiler memeriksa jenis (masuk akal kan? Karena jenis tidak boleh diubah kemudian pada saat run time).
Bahasa yang diketik secara dinamis biasanya diinterpretasikan, oleh karena itu ketik pengecekan (jika ada) terjadi pada saat dijalankan saat digunakan. Ini tentu saja membawa beberapa biaya kinerja, dan merupakan salah satu alasan bahasa dinamis (misalnya, python, ruby, php) tidak skala sebaik yang diketik (java, c #, dll). Dari perspektif lain, bahasa yang diketik secara statis memiliki lebih banyak biaya awal: membuat Anda biasanya menulis lebih banyak kode, kode yang lebih sulit. Tapi itu terbayar kemudian.
Hal yang baik adalah kedua belah pihak meminjam fitur dari sisi lain. Bahasa yang diketik memasukkan lebih banyak fitur dinamis, misalnya, generik dan pustaka dinamis dalam c #, dan bahasa dinamis termasuk lebih banyak memeriksa jenis, misalnya, mengetikkan anotasi dengan python, atau HACK varian PHP, yang biasanya bukan inti dari bahasa dan dapat digunakan pada permintaan.
Ketika datang ke pemilihan teknologi, tidak ada pihak yang memiliki keunggulan intrinsik atas yang lain. Ini hanya masalah preferensi apakah Anda ingin kontrol lebih awal atau fleksibilitas. cukup pilih alat yang tepat untuk pekerjaan itu, dan pastikan untuk memeriksa apa yang tersedia dalam hal yang berlawanan sebelum mempertimbangkan beralih.
sumber
http://en.wikipedia.org/wiki/Type_system
sumber
myObject[remoteDataName]
. Maka tidak ada cara untuk mengetahui properti mana yang akan dipilih atau bahkan jika itu adalah properti yang valid sama sekali.Terminologi "diketik secara dinamis" sayangnya menyesatkan. Semua bahasa diketik secara statis, dan tipe adalah properti ekspresi (bukan nilai seperti yang dipikirkan sebagian orang). Namun, beberapa bahasa hanya memiliki satu jenis. Ini disebut bahasa uni-diketik. Salah satu contoh bahasa semacam itu adalah kalkulus lambda yang tidak diketik.
Dalam kalkulus lambda yang tidak diketik, semua istilah adalah istilah lambda, dan satu-satunya operasi yang dapat dilakukan pada suatu istilah adalah menerapkannya pada istilah lain. Karenanya semua operasi selalu menghasilkan rekursi tak terbatas atau istilah lambda, tetapi tidak pernah menandakan kesalahan.
Namun, yang kami untuk menambah lambda kalkulus untyped dengan nomor primitif dan operasi aritmatika, maka kita bisa melakukan operasi tidak masuk akal, menambahkan seperti dua istilah lambda bersama-sama:
(λx.x) + (λy.y)
. Orang dapat berargumen bahwa satu-satunya hal yang waras yang harus dilakukan adalah memberi sinyal kesalahan ketika ini terjadi, tetapi untuk dapat melakukan ini, setiap nilai harus ditandai dengan indikator yang menunjukkan apakah istilah tersebut merupakan istilah lambda atau angka. Operator tambahan kemudian akan memeriksa bahwa memang kedua argumen tersebut ditandai sebagai angka, dan jika tidak, menandakan kesalahan. Perhatikan bahwa tag ini bukan tipe, karena tipe adalah properti program, bukan nilai yang dihasilkan oleh program tersebut.Bahasa uni-diketik yang melakukan ini disebut diketik secara dinamis.
Bahasa-bahasa seperti JavaScript, Python, dan Ruby semuanya diketik. Sekali lagi,
typeof
operator dalam JavaScript dantype
fungsi dalam Python memiliki nama yang menyesatkan; mereka mengembalikan tag yang terkait dengan operan, bukan tipenya. Demikian pula,dynamic_cast
di C ++ daninstanceof
di Jawa tidak melakukan pemeriksaan jenis.sumber
Dikompilasi vs. Diartikan
"Ketika kode sumber diterjemahkan"
Mengetik
"Ketika jenis dicentang"
5 + '3'
adalah contoh kesalahan tipe dalam bahasa yang diketik dengan kuat seperti Go dan Python, karena mereka tidak mengizinkan "ketik paksaan" -> kemampuan nilai untuk mengubah jenis dalam konteks tertentu seperti menggabungkan dua jenis. Bahasa yang diketik dengan lemah , seperti JavaScript, tidak akan menghasilkan kesalahan ketik (menghasilkan'53'
).Definisi "Static & Compiled" dan "Dynamic & Interpreted" sangat mirip ... tapi ingat itu "ketika jenis dicentang" vs "ketika kode sumber diterjemahkan".
Anda akan mendapatkan kesalahan jenis yang sama terlepas dari apakah bahasa dikompilasi atau ditafsirkan ! Anda perlu memisahkan istilah-istilah ini secara konseptual.
Contoh Python
Dinamis, Diterjemahkan
Karena Python ditafsirkan dan diketik secara dinamis, Python hanya menerjemahkan dan mengetikkan kode pemeriksaan yang dijalankannya. The
else
blok tidak pernah mengeksekusi, sehingga5 + '3'
tidak pernah bahkan melihat!Bagaimana jika itu diketik secara statis?
Kesalahan tipe akan dilempar sebelum kode dijalankan. Itu masih melakukan pengecekan tipe sebelum run-time meskipun ditafsirkan.
Bagaimana jika itu dikompilasi?
The
else
blok akan diterjemahkan / melihat sebelum run-time, tetapi karena itu dinamis diketik tidak akan melemparkan kesalahan! Bahasa yang diketik secara dinamis tidak memeriksa jenis sampai eksekusi, dan baris itu tidak pernah dijalankan.Contoh Go
Statis, Terkompilasi
Jenis diperiksa sebelum berjalan (statis) dan kesalahan jenis segera ditangkap! Jenis masih akan diperiksa sebelum run-time jika ditafsirkan, memiliki hasil yang sama. Jika itu dinamis, itu tidak akan menimbulkan kesalahan meskipun kode akan dilihat saat kompilasi.
Performa
Bahasa yang dikompilasi akan memiliki kinerja yang lebih baik saat run-time jika diketik secara statis (vs dinamis); pengetahuan jenis memungkinkan untuk optimasi kode mesin.
Bahasa yang diketik secara statis memiliki kinerja yang lebih baik saat run-time secara intrinsik karena tidak perlu memeriksa jenis secara dinamis saat mengeksekusi (memeriksa sebelum menjalankan).
Demikian pula, bahasa yang dikompilasi lebih cepat pada waktu berjalan karena kode telah diterjemahkan daripada harus "menafsirkan" / menerjemahkannya dengan cepat.
Perhatikan bahwa kedua bahasa yang dikompilasi dan diketik secara statis akan mengalami penundaan sebelum menjalankan masing-masing untuk penerjemahan dan pemeriksaan jenis.
Lebih Banyak Perbedaan
Pengetikan statis menangkap kesalahan lebih awal, alih-alih menemukannya saat dieksekusi (terutama berguna untuk program panjang). Ini lebih "ketat" karena tidak memungkinkan untuk kesalahan ketik di mana pun di program Anda dan sering mencegah variabel dari mengubah jenis, yang selanjutnya membela terhadap kesalahan yang tidak diinginkan.
Pengetikan dinamis lebih fleksibel, yang dihargai beberapa orang. Ini biasanya memungkinkan variabel untuk mengubah jenis, yang dapat mengakibatkan kesalahan tak terduga.
sumber
Bahasa yang diketik secara statis : setiap variabel dan ekspresi sudah diketahui pada waktu kompilasi.
(
int a;
a hanya dapat mengambil nilai tipe integer saat runtime)Contoh: C, C ++, Java
Bahasa yang diketik secara dinamis : variabel dapat menerima nilai yang berbeda pada saat runtime dan tipenya ditentukan pada saat dijalankan.
(
var a;
a dapat mengambil segala jenis nilai saat runtime)Contoh: Ruby, Python.
sumber
Bahasa yang diketik secara statis ketik-periksa pada waktu kompilasi dan jenisnya TIDAK dapat berubah. (Jangan lucu dengan komentar tipe-casting, variabel / referensi baru dibuat).
Bahasa yang diketik secara dinamis ketik-periksa pada saat run-time dan jenis variabel BISA diubah pada saat run-time.
sumber
Definisi yang manis dan sederhana, tetapi sesuai dengan kebutuhan: Bahasa yang diketik secara statis mengikat tipe ke variabel untuk seluruh cakupannya (Seg: SCALA) Bahasa yang diketik secara dinamis mengikat jenis ke nilai aktual yang dirujuk oleh variabel.
sumber
sumber
Bahasa yang diketik secara statis seperti C ++, Java dan Bahasa yang diketik secara dinamis seperti Python hanya berbeda dalam hal pelaksanaan jenis variabel. Bahasa yang diketik secara statis memiliki tipe data statis untuk variabel, di sini tipe data diperiksa selama kompilasi sehingga debugging jauh lebih sederhana ... sedangkan diketik secara dinamis bahasa yang tidak melakukan hal yang sama, tipe data diperiksa yang menjalankan program dan karenanya debugging agak sulit.
Selain itu mereka memiliki perbedaan yang sangat kecil dan dapat dikaitkan dengan bahasa yang sangat diketik dan diketik dengan lemah . Bahasa yang diketik sangat tidak memungkinkan Anda untuk menggunakan satu jenis seperti yang lain misalnya. C dan C ++ ... sedangkan bahasa yang diketik dengan lemah memungkinkan eg.python
sumber
Diketik secara statis
Jenis diperiksa sebelum waktu berjalan sehingga kesalahan dapat ditangkap lebih awal.
Contoh = c ++
Diketik secara dinamis
Jenis diperiksa selama eksekusi.
Contoh = Python
sumber
Bahasa yang diketik statis (kompiler menyelesaikan panggilan metode dan kompilasi referensi):
Bahasa yang diketik secara dinamis (keputusan diambil dalam menjalankan program):
sumber
Bahasa yang diketik secara dinamis membantu untuk dengan cepat membuat prototipe konsep-konsep algoritma tanpa overhead tentang memikirkan jenis variabel apa yang perlu digunakan (yang merupakan keharusan dalam bahasa yang diketik secara statis ).
sumber
Pengetikan Statis: Bahasa seperti Java dan Scala diketik secara statis.
Variabel harus didefinisikan dan diinisialisasi sebelum digunakan dalam kode.
misalnya int x; x = 10;
System.out.println (x);
Pengetikan Dinamis: Perl adalah bahasa pengetik dinamis.
Variabel tidak perlu diinisialisasi sebelum digunakan dalam kode.
y = 10; gunakan variabel ini di bagian akhir kode
sumber
$
), array (@
) dan hash (%
). Jenis variabel dalam Perl dikenal pada waktu kompilasi dan tetap sama untuk sisa variabel seumur hidup.