Klaim oleh Aleks Bromfield ini menyatakan:
Hampir setiap bahasa dengan sistem tipe statis juga memiliki sistem tipe dinamis. Selain dari C, saya tidak bisa memikirkan pengecualian
Apakah ini klaim yang valid? Saya mengerti bahwa dengan kelas Refleksi atau Memuat saat runtime Java menjadi sedikit seperti ini - tetapi dapatkah gagasan 'pengetikan bertahap' ini diperluas ke sejumlah besar bahasa?
languages
dynamic-typing
static-typing
hawkeye
sumber
sumber
Jawaban:
Tweeter asli di sini. :)
Pertama-tama, saya agak geli / terkejut karena tweet saya dianggap serius! Jika saya tahu ini akan disebar luaskan, saya akan menghabiskan lebih dari 30 detik untuk menulisnya!
Thiago Silva benar untuk menunjukkan bahwa "statis" dan "dinamis" lebih akurat menggambarkan pengecekan tipe , daripada sistem tipe . Bahkan, tidak benar-benar akurat untuk mengatakan bahwa suatu bahasa diketik secara statis atau dinamis. Alih-alih, suatu bahasa memiliki sistem tipe, dan implementasi bahasa itu mungkin memberlakukan sistem tipe menggunakan pemeriksaan statis, atau pemeriksaan dinamis, atau keduanya, atau tidak (meskipun itu tidak akan menjadi implementasi bahasa yang sangat menarik!).
Seperti yang terjadi, ada sistem tipe tertentu (atau fitur sistem tipe) yang lebih dapat menerima pemeriksaan statis, dan ada sistem tipe tertentu (atau fitur sistem tipe) yang lebih dapat menerima pemeriksaan dinamis. Misalnya, jika bahasa Anda memungkinkan Anda untuk menentukan dalam teks suatu program bahwa nilai tertentu harus selalu berupa array bilangan bulat, maka cukup mudah untuk menulis pemeriksa statis untuk memverifikasi properti itu. Sebaliknya, jika bahasa Anda memiliki subtyping, dan jika itu memungkinkan downcasting, maka cukup mudah untuk memeriksa validitas downcast saat runtime, tetapi sangat sulit untuk melakukannya pada waktu kompilasi.
Apa yang saya maksudkan dengan tweet yang saya hanyalah bahwa sebagian besar dari implementasi bahasa melakukan beberapa jumlah memeriksa jenis dinamis. Atau, yang setara, sebagian besar bahasa memiliki beberapa fitur yang sulit (jika bukan tidak mungkin) untuk diperiksa secara statis. Downcasting adalah salah satu contohnya. Contoh lain termasuk overflow aritmatika, pemeriksaan batas array, dan pemeriksaan nol. Beberapa di antaranya dapat diperiksa secara statis dalam beberapa keadaan, tetapi pada umumnya, Anda akan kesulitan menemukan implementasi bahasa yang tidak melakukan pengecekan saat runtime.
Ini bukan hal yang buruk. Itu hanya pengamatan bahwa ada banyak properti menarik yang ingin kita dukung bahasa kita, dan bahwa kita tidak benar-benar tahu cara mengecek secara statis. Dan itu adalah pengingat bahwa perbedaan seperti "tipe statis" versus "tipe dinamis" hampir tidak sejelas yang diyakini oleh beberapa orang. :)
Satu catatan terakhir: istilah "kuat" dan "lemah" tidak benar-benar digunakan dalam komunitas riset bahasa pemrograman, dan mereka tidak benar-benar memiliki makna yang konsisten. Secara umum, saya telah menemukan bahwa ketika seseorang mengatakan bahwa suatu bahasa memiliki "ketikan yang kuat" dan beberapa bahasa lainnya memiliki "ketikan yang lemah", mereka benar-benar mengatakan bahwa bahasa favorit mereka (yang dengan "ketikan yang kuat") mencegah mereka dari membuat beberapa kesalahan bahwa bahasa lain (yang dengan "mengetik lemah") tidak - atau sebaliknya, bahasa favorit mereka (yang dengan "mengetik lemah") memungkinkan mereka untuk melakukan beberapa hal keren bahwa bahasa lain (yang satu dengan "pengetikan kuat") tidak.
sumber
Baiklah. Anda dapat memiliki tas properti dalam bahasa yang diketik secara statis. Sintaksnya akan mengerikan sementara pada saat yang sama Anda akan mendapatkan semua kelemahan dari sistem yang diketik secara dinamis. Jadi sebenarnya tidak ada keuntungan apa pun kecuali kompiler memungkinkan Anda untuk menggunakan sintaksis yang lebih bagus, sesuatu seperti yang dilakukan oleh C #
dynamic
.Anda juga dapat melakukannya dengan mudah di C juga.
Sebagai reaksi terhadap jawaban lain: Saya pikir orang salah mengetik statis / dinamis dengan kuat / lemah mengetik. Pengetikan dinamis adalah tentang kemampuan untuk mengubah struktur data saat runtime dan kode dapat menggunakan data yang hanya sesuai dengan apa yang dibutuhkan oleh kode. Ini disebut Mengetik Bebek .
Menyebutkan refleksi tidak menceritakan keseluruhan cerita, karena refleksi tidak memungkinkan Anda untuk mengubah struktur data yang ada. Anda tidak bisa menambahkan bidang baru ke kelas atau struktur di C, C ++, Java atau C #. Dalam bahasa yang dinamis, menambahkan bidang atau atribut baru ke kelas yang ada tidak hanya mungkin, tetapi sebenarnya sangat umum.
Misalnya, lihat Cython , kompiler Python-ke-C. Ini menciptakan kode C statis, tetapi sistem tipe masih mempertahankan sifat dinamisnya. C adalah bahasa yang diketik secara statis, namun ia dapat mendukung pengetikan dinamis dari Python.
sumber
ExpandoObject
, meskipun sangat banyak proses opt-in, tidak seperti JavaScript atau Ruby. Namun, Anda telah membuat poin yang sangat penting, yaitu mengetik bebek (apa yang sebenarnya berarti 99% pengembang ketika mereka mengatakan "diketik secara dinamis") dan refleksi bukanlah hal yang sama sekali.True
untuk mengatakan "objek gila ini adalah turunan dari kelas yang saya definisikan"). OCaml memang memiliki fitur ini sejauh yang saya mengerti, tetapi saya tidak benar-benar tahu.Bahasa dinamis adalah bahasa statis . Apa yang biasa disebut "pengetikan dinamis" sebenarnya adalah kasus khusus pengetikan statis - kasus di mana Anda membatasi diri hanya memiliki satu jenis. Sebagai percobaan pemikiran, bayangkan menulis sebuah program di Java atau C # hanya menggunakan
Object
variabel / bidang / parameter dan down-casting segera sebelum memanggil metode apa pun . Akan lebih akurat untuk memanggil bahasa seperti Python atau Javascript "unityped". (Klaim ini kemungkinan akan membingungkan / mengganggu banyak orang, mengingat program Java atau C # seperti itu akan menggunakan banyak sub-tipe, tetapi itu karena rata-rata bahasa OOP mengonfigurasi jenis dan kelas. Baca posting blog untuk lebih jelasnya.)Perhatikan bahwa bahkan C memiliki pengetikan "dinamis" - Anda dapat melemparkan penunjuk apa pun ke penunjuk
void
(dan jika ingatan saya,char
) dan kembali lagi. Dan perhatikan, juga, bahwa tidak ada runtime yang memeriksa di sana; jika Anda salah, nikmati perilaku tidak terdefinisi Anda!sumber
String foo = (String) bar
itu tidak berarti itubar
sebenarnya aString
. Anda hanya bisa tahu itu pada saat run time, jadi saya tidak melihat bagaimana para pemain dilakukan "secara statis".dynamic
objek untuk melakukan ini. Jika Anda mencoba menambahkan properti keobject
... well, Anda tidak bisa.Perbedaan antara pengetikan statis dan dinamis adalah ketika jenis nilai diperiksa: waktu kompilasi vs waktu berjalan. Dalam bahasa di mana nilai membawa tipenya (misalnya objek Java), maka Anda selalu dapat menggunakan pengetikan dinamis bahkan ketika bahasa sebenarnya lebih memilih pengetikan statis. Berikut adalah contoh di Jawa, dengan metode yang diketik secara dinamis:
Perhatikan bagaimana jenis setiap item diperiksa saat runtime. Metode yang diketik secara statis setara adalah:
Di C, nilai (dan khususnya pointer) tidak mempertahankan tipenya selama runtime - setiap pointer setara dengan a
void *
. Sebagai gantinya, variabel dan ekspresi memiliki tipe. Untuk mencapai pengetikan dinamis, Anda harus membawa sendiri informasi jenis tersebut (misalnya sebagai bidang dalam sebuah struct).sumber
frobnicate
metode ini di sini tanpa mengetahui terlebih dahuluSpecificType
.dynamic
kata kunci). Menyamakan statis untuk waktu kompilasi dan dinamis untuk runtime sebagian besar hanya mengeruhkan air.[1,2].Add([3,4])
menghasilkan[1,2,3,4]
,[1,2,[3,4]]
atau[4,6]
?Add
metode pada array yang menerima array karena metode seperti itu akan ambigu. Mengetik bebek tidak membuat Anda tidak bisa menulis tipe dan fungsi yang bisa dipahami.Pengetikan statis vs dinamis pada dasarnya mengacu pada bagaimana jenis diperiksa. Pengetikan statis berarti bahwa verifikasi jenis berbagai variabel atau ekspresi diperiksa berdasarkan kode aktual (biasanya oleh kompiler) sementara dalam sistem tipe dinamis verifikasi ini dilakukan hanya pada saat runtime, oleh lingkungan runtime.
Apa yang saya percaya teks merujuk adalah bahwa bahkan jika jenis sebenarnya diperiksa secara statis, mereka juga diperiksa saat runtime, yaitu secara dinamis. Anda menyebutkan Refleksi Java dengan benar; refleksi hanya terjadi saat runtime dan Java Runtime Environment (JVM) benar-benar melakukan pemeriksaan tipe ketika refleksi digunakan, yang pada dasarnya berarti pemeriksaan tipe dinamis.
sumber
Pengecualiannya salah: C juga memiliki sistem tipe dinamis yang penting. Itu hanya tidak memeriksanya ("C sangat diketik, lemah diperiksa"). Misalnya, memperlakukan struct sebagai
double
(reinternpret_cast
-style) menghasilkan perilaku yang tidak terdefinisi - kesalahan tipe dinamis.sumber