Dalam bahasa dinamis, seperti JavaScript atau Python, jenis variabel ditentukan saat runtime. Ini adalah salah satu alasan mengapa mereka lebih lambat dari bahasa yang diketik seperti Java.
Bagaimana pemeriksaan tipe dilakukan? Apa alasan penting proses ini lambat?
Jawaban:
Ada kebingungan dalam pertanyaan itu.
Ada asumsi bahwa pengecekan tipe lambat, yang belum tentu demikian.
Pertanyaannya juga tampaknya membingungkan proses pengiriman tipe dengan memeriksa jenis , dan mereka adalah dua hal yang berbeda. Salah satunya adalah proses yang dilakukan pada saat run time, yang lainnya proses pada waktu kompilasi. Saya menduga pertanyaannya adalah benar-benar bertanya tentang jenis pengiriman.
Ini adalah jenis pengiriman yang dapat memperkenalkan overhead pada saat runtime, karena perhitungan menghabiskan waktu dengan instruksi yang memutuskan, secara dinamis, tindakan apa yang harus diambil, berdasarkan pada jenis nilai yang dilihatnya pada waktu berjalan. misalnya dalam bahasa yang dinamis, jika saya menerapkan "+" pada dua hal, saya bisa berarti penambahan numerik, atau penggabungan string, jadi saya perlu menghabiskan waktu melihat apa yang ada di tangan untuk memutuskan apa yang harus dilakukan. Ada strategi evaluasi yang dapat mengurangi biaya pengiriman dinamis. (misalnya, melacak JIT)
Berkenaan dengan melakukan pengecekan tipe dalam JavaScript, lihat: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Untuk gambaran umum yang lebih umum tentang cara kerja checker jenis, buku teks bahasa pemrograman standar akan membahas algoritme. Misalnya, http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
sumber
Pada dasarnya, dalam bahasa yang tidak diketik, setiap referensi menunjuk ke objek yang berisi tipe dan nilai. Misalnya
var a = 3
menunjuk ke sebuah instance yang berisi nilai 3 dan tipe int, jika Anda membuata = "bla"
, referensi diperbarui ke sebuah instance yang berisi string "bla" dan string tipe, objek lama dibuang, dll ...Ini lambat karena setiap kali operasi (mis.
a + b
) Harus dilakukan pada tipe dasar ini, runtime harus terlebih dahulu melakukan dereferensi objek, periksa apakah tipenya kompatibel, lakukan operasi, buat objek baru.Sebaliknya,
a + b
dalam C ++ atau Java memeriksa pada waktu kompilasi bahwa jenisnya valid dan kompatibel, maka a dan b disimpan sebagai nilai langsung (bukan referensi), dan penambahan adalah operasi prosesor sederhana pada nilai-nilai ini.Tentu saja, ini semua sangat teoretis. Dalam praktiknya, banyak optimasi dapat dilakukan pada proses ini untuk menghindari sebagian besar overhead, dan bahasa yang diketik secara dinamis bisa menjadi sangat cepat.
sumber
Setiap nilai disimpan bersama dengan tipenya, yang perlu diperiksa terlebih dahulu. Konversi juga mengatakan dari string ke nomor melalui inspeksi, on the fly.
sumber