T: Saya sering mendengar klaim bahwa bahasa yang diketik secara dinamis lebih produktif daripada bahasa yang diketik secara statis. Apa alasan dari klaim ini? "
Ini memiliki alasan historis. Jika Anda kembali ke beberapa dekade, bahasa dinamis jauh lebih produktif daripada bahasa statis (sementara itu juga jauh lebih lambat). Perl jelas jauh lebih produktif daripada C jika Anda tahu keduanya dan tugas yang ada memungkinkan. Namun seiring waktu bahasa telah meminjam banyak dari satu sama lain, dan bahasa yang lebih baru mempersempit kesenjangan (baik dalam produktivitas dan kinerja).
Berikut adalah beberapa hal yang perlu dipertimbangkan:
Pengumpulan sampah : Pengumpulan sampah adalah dorongan produktivitas yang sangat besar . Saya percaya Java adalah bahasa statis arus utama pertama dengan GC. Sebelum ini, statis pada dasarnya berarti manajemen memori manual. (Catatan: Di sini dan di bawah ini saya hanya mempertimbangkan bahasa umum. Banyak bahasa eksperimental dan niche ada yang akan memberikan contoh tandingan pada setiap poin yang saya buat.)
Keamanan memori : Ini adalah peningkatan produktivitas yang tidak perlu Anda khawatirkan dengan menembak diri sendiri. Sebelum "dikelola" bahasa statis seperti Java, statis biasanya berarti akses memori langsung. Debug juga merupakan bagian dari produktivitas, dan akses memori yang tidak aman dapat menyebabkan bug yang benar-benar tidak jelas.
Sistem tipe rumit. Sebelum pengenalan tipe parameter (seperti templat atau generik) dalam bahasa statis, keterbatasan sistem tipe statis sering menjadi beban. Sebagai contoh di Jawa Anda harus secara eksplisit downcast setiap kali Anda memilih item dari koleksi. Jadi Anda mendapat overhead sintaksis dari gips dan tidak ada jenis keselamatan. Mempertimbangkan bagaimana koleksi yang ada di mana-mana dalam pemrograman, ini adalah kelemahan utama.
Harus menyatakan jenis semuanya banyak mengetik berlebihan, tetapi dengan inferensi tipe modern, ini dapat dikurangi secara signifikan.
Perpustakaan standar besar. Python terkenal diiklankan sebagai "baterai" karena perpustakaan standar yang besar. Ini dibandingkan dengan C yang memiliki perpustakaan standar yang sangat minimalis. Tetapi dengan platform seperti Java dan .net, perpustakaan standar yang luas menjadi standar, dan bahasa yang lebih baru seperti Scala dan F # mewarisi ini "gratis".
Struktur data kelas satu. Bahasa dinamis seperti Perl dan Python memiliki struktur data kelas satu seperti daftar dan peta dengan pintasan sintaksis yang mudah digunakan untuk operasi umum. Dibandingkan dengan ini, C tidak memiliki koleksi bawaan kecuali array ukuran tetap.
Penutupan dan sintaks lambda - bahasa dinamis biasanya sudah memiliki ini dari awal, tetapi bahasa statis telah mengadopsi ini, paling baru Jawa.
REPL kemampuan untuk dengan cepat menguji potongan kode secara interaktif adalah keuntungan besar. Tetapi meskipun alat IDE, seperti jendela "langsung" di Visual Studio, bahasa statis dapat ditiru sampai batas tertentu.
Perkakas tingkat lanjut - sebagai tambahan pada poin-poin di atas di mana bahasa statis semakin dekat dengan kenyamanan bahasa dinamis, editor modern mengambil keuntungan dari analisis statis sedemikian rupa sehingga bahasa dinamis mengalami kesulitan dalam mencocokkan. Misalnya editor dapat memberikan refactoring otomatis yang aman, sesuatu yang secara tegas mustahil dilakukan dalam bahasa yang dinamis.
Intinya: Secara historis memang benar, tetapi hari ini jawabannya kurang jelas.
T: Jadi: apa yang bisa dikatakan untuk produktivitas dengan pengetikan dinamis yang benar-benar merupakan keunggulan dari model tipe itu sendiri?
Agak sulit untuk memisahkan model pengetikan dinamis dari bahasa dinamis, tetapi sebagai contoh C # telah mengadopsi lebih banyak fitur yang lebih dinamis dari waktu ke waktu, meskipun itu sebagai intinya adalah bahasa statis. Ini benar-benar bukti manfaat dari model tipe dinamis. Contoh:
Refleksi
Refleksi pada dasarnya adalah fitur pengetikan dinamis. Anda memeriksa tipe objek pada saat runtime rater daripada waktu kompilasi. Ketika diperkenalkan itu agak disukai, tetapi dalam C # penggunaan refleksi semakin banyak di mana-mana, misalnya ASP.Net MVC banyak menggunakan refleksi.
Atribut
Atribut adalah contoh pengetikan dinamis. Anda dapat menambahkan atribut arbitrer ke kelas pada waktu kompilasi, dan kemudian Anda memeriksa saat runtime (melalui refleksi) dan memanipulasi objek berdasarkan itu. Sesuatu seperti MEP pada dasarnya adalah kerangka kerja ekstensi yang didasarkan pada model tipe dinamis.
Linq ke SQL, EF mv.
Berbagai transformer Linq memeriksa kueri sebagai objek runtime dan menghasilkan sql dengan cepat. Itu tidak menjadi lebih dinamis daripada memeriksa kode saat runtime. CodeDom adalah sisi lain dari koin, di mana kode dapat dihasilkan saat runtime
Roslyn
Roslyn pada dasarnya mengimplementasikan eval
, yang pernah dianggap sebagai fitur mendefinisikan bahasa yang benar-benar dinamis.
Dinamis
The dynamic
-jenis adalah fitur yang paling eksplisit dinamis dalam C #, dan diiklankan untuk membuat interaksi dengan objek-objek eksternal dan bahasa sederhana dan lebih produktif. Tetapi juga digunakan di Asp.net MVC untuk kenyamanan.
Manfaat dari semua fitur di atas menunjukkan bahwa model dinamis memiliki keunggulan yang pasti bahkan dalam bahasa statis dengan tipe parameter, tipe struktural, dan inferensi tipe.