Saya sering mendengar klaim bahwa bahasa yang diketik secara dinamis lebih produktif daripada bahasa yang diketik secara statis. Apa alasan untuk klaim ini? Bukankah itu hanya perkakas dengan konsep-konsep modern seperti konvensi atas konfigurasi, penggunaan pemrograman fungsional, model pemrograman canggih dan penggunaan abstraksi yang konsisten? Memang ada lebih sedikit kekacauan karena (misalnya di Jawa) sering deklarasi tipe redundan tidak diperlukan, tetapi Anda juga dapat menghilangkan sebagian besar deklarasi tipe dalam bahasa yang diketik secara statis yang menggunakan inferensi tipe, tanpa kehilangan keunggulan lain dari pengetikan statis. Dan semua ini tersedia untuk bahasa yang diketik secara statis modern seperti Scala juga.
Jadi: apa yang bisa dikatakan untuk produktivitas dengan pengetikan dinamis yang benar-benar merupakan keuntungan dari model tipe itu sendiri?
Klarifikasi: Saya lebih tertarik pada proyek-proyek besar / menengah daripada di peretasan cepat. :-)
sumber
Jawaban:
Saya benar-benar berpikir itu adalah panggilan yang cukup dekat. Baik pengetikan dinamis maupun pengetikan statis memiliki kelebihan.
Alasan pengetikan dinamis menjadi lebih produktif:
Alasan pengetikan statis lebih produktif:
Rata-rata kesimpulan saya (setelah bertahun-tahun pengalaman di kedua sisi pagar) adalah bahwa pengetikan dinamis bisa lebih produktif dalam jangka pendek, tetapi pada akhirnya menjadi sulit untuk dipertahankan kecuali Anda memiliki ruang tes yang sangat baik dan disiplin pengujian.
Di sisi lain, saya sebenarnya lebih suka pendekatan yang diketik secara statis secara keseluruhan, karena saya pikir manfaat kebenaran dan dukungan alat memberi Anda produktivitas yang lebih baik dalam jangka panjang.
sumber
Dengan bahasa dinamis Anda dapat menulis kode jelek lebih cepat daripada saat menggunakan bahasa yang diketik.
Setelah Anda dengan cepat membuat tumpukan besar barang dinamis, Anda dapat dengan aman pindah ke proyek lain tanpa harus peduli dengan pemeliharaan jangka panjang.
Ini keuntungan produktivitas :)
Saya bercanda, tetapi setelah terlibat dalam proyek yang menggunakan 'bahasa dinamis', saya merasa takut dengan jumlah tes, dokumentasi, dan konvensi yang tidak perlu yang harus Anda tangani jika Anda ingin memiliki produk yang berfungsi.
Dan dengan kegembiraan banyak kesalahan runtime yang bisa ditangkap saat kompilasi.
Oh, saya juga lupa berteriak-teriak tentang semua peretasan dan voodoo yang memungkinkan Anda memperkenalkan meta-pemrograman dalam kode Anda!
Jadi peningkatan produktivitas mungkin menjadi mitos untuk proyek menengah / besar selama masa pakainya.
sumber
Ada pandangan teoretis untuk masalah ini juga: Sistem tipe statis pada dasarnya adalah pembuktian teorema khusus yang hanya menerima program ketika dapat membuktikan kebenaran-jenisnya. Semua sistem tipe statis menolak beberapa program yang valid karena tidak ada sistem tipe statis yang dapat didekati cukup kuat untuk membuktikan semua program jenis-benar yang mungkin.
Orang bisa berargumen bahwa program-program yang tidak dapat dibuktikan dengan typechecker statis adalah hacks dan / atau gaya buruk, tetapi jika Anda sudah mendapatkan program yang valid dan typechecker tidak menerimanya, itu tentu saja mengganggu produktivitas Anda dalam jangka pendek.
Beberapa kasus di mana Anda mungkin melihat pemeriksa tipe menghalangi dengan wadah generik dan co-contravariance dalam argumen dan kembali tipe.
sumber
Satu keuntungan yang saya temukan dengan sebagian besar bahasa dinamis adalah mereka membuatnya lebih mudah untuk menulis kode yang lebih umum. Jauh lebih mudah untuk menulis pada tingkat abstraksi yang lebih tinggi ketika Anda tidak harus melawan sistem tipe untuk melakukannya.
Anda tidak perlu terlalu memikirkannya - menulis kode yang melakukan sesuatu nontrivial dengan objek apa pun di Jawa itu sulit dan mungkin memerlukan refleksi yang pada dasarnya diketik secara dinamis; dengan sesuatu seperti JavaScript, menulis fungsi yang melakukan sesuatu yang menarik untuk semua objek adalah sifat kedua. Contoh yang sempurna adalah fungsi yang baru-baru ini saya tulis yang mengambil objek dan mengganti semua metode dengan yang melakukan hal yang sama tetapi juga menjalankan suatu peristiwa. Saya tidak tahu bagaimana mendekati sesuatu seperti ini di Jawa. Namun, saya tidak yakin berapa banyak dari ini disebabkan oleh sistem tipe dan berapa banyak disebabkan oleh perbedaan bahasa lainnya.
Namun, saya baru saja mulai menggunakan Haskell. Haskell memungkinkan saya menulis kode abstrak dan generik semudah bahasa apa pun yang diketik secara dinamis yang saya gunakan. Contoh Java / JavaScript saya di atas tidak masuk akal di Haskell karena tidak memiliki objek, metode, peristiwa atau bahkan banyak mutasi, tetapi jenis kode generik lainnya sangat mudah untuk ditulis.
Faktanya, Haskell dapat menulis beberapa kode umum yang tidak dapat diketik secara dinamis oleh bahasa yang diketik; contoh sempurna adalah
read
fungsi yang pada dasarnya kebalikan daritoString
. Anda bisa mendapatkanInt
atauDouble
atau jenis apa pun yang Anda inginkan (asalkan dalam kelas jenis tertentu). Anda bahkan dapat memiliki polimorfik konstanta , sehinggamaxBound
dapat menjadi maksimalInt
,Double
,Char
... dll., Semua tergantung pada jenis apa yang seharusnya menjadi.Teori saya sekarang adalah bahwa perolehan produktivitas dari menggunakan bahasa dinamis selalu dibandingkan dengan bahasa seperti Java dengan sistem tipe kurang mampu, lebih bertele-tele dan kurang fleksibel.
Namun, bahkan sistem tipe Haskell memiliki beberapa masalah menjengkelkan yang tidak akan Anda miliki dalam bahasa yang diketik secara dinamis. Yang terbesar yang membuat saya kesal adalah cara menangani angka; misalnya, Anda harus dipusingkan dengan sistem tipe untuk menggunakan
length
(dari daftar) sebagai ganda, sesuatu yang Anda tidak akan memiliki masalah dengan tanpa sistem tipe. Hal menjengkelkan lain yang saya temui adalah bekerja denganWord8
(tipe int yang tidak ditandatangani) dan fungsi yang diharapkanInt
.Jadi, pada akhirnya, tidak memiliki sistem tipe membuatnya lebih mudah untuk menulis kode generik tanpa berpikir terlalu banyak dan juga menghindari perangkap yang menjengkelkan dari sistem tipe. Anda tidak perlu melawan sistem tipe dalam bahasa yang dinamis, tetapi Anda juga tidak bisa mengandalkannya.
sumber
Int
dikembalikan oleh daftar adalah sepele; contoh1.0 + fromIntegral (length myList)
:, yaitu gunakan sajafromIntegral
.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.
sumber
Seluruh fitur bahasa modern begitu besar, sehingga pengetikan statis vs dinamis tidak membawa banyak beban.
Aturannya adalah, semakin baik fitur bahasa Anda, semakin pendek kode Anda. Itu cukup sederhana. Java menunjukkan bagaimana pengetikan statis bisa sangat salah, yang memberi banyak lawannya makan. Fitur bahasa yang dirancang dengan buruk umumnya datang dengan biaya, dan pengetikan statis di Java pertama adalah fitur wajib (jika tidak, kebanyakan orang mungkin tidak akan menggunakannya) dan kedua dieksekusi dengan buruk.
Inilah sebabnya mengapa dalam perbandingan sebagian besar bahasa dinamis bersinar, meskipun saya berpendapat bahwa PHP tidak benar-benar membuat hidup Anda lebih baik secara keseluruhan (setidaknya sampai saat ini), karena banyak kebiasaan lain yang tidak terkait dengan sistem ketik.
Di sisi lain, Anda memiliki banyak bahasa dengan sistem tipe ekspresif yang tidak menghalangi Anda dan bahkan tidak wajib. Dan beberapa dari mereka bahkan memungkinkan menyematkan kode yang tidak diketik, setiap kali Anda perlu melarikan diri dari sistem tipe.
Secara pribadi, saya menggunakan haXe, yang merupakan bahasa dengan inferensi tipe, subtipe nominal dan struktural, kode untyped opsional, tipe fungsi kelas pertama, tipe data aljabar, dan makro leksikal (tidak cukup matang tetapi sangat kuat), sambil menghindari sintaksis misterius. Setelah menggunakan haXe selama sekitar 3 tahun sekarang, saya sampai pada kesimpulan sederhana:
Pemrograman menjadi jauh lebih mudah, ketika bahasa Anda tidak mengunci Anda ke dalam pilihan agama tentang paradigma tetapi mencoba untuk menjadi alat yang baik. Ada sejumlah bahasa statis dan dinamis dan bahasa campuran , yang berhasil pada saat itu. Beberapa di antaranya mudah dipelajari, paling sulit dikuasai.
Kekuatan mereka datang dari cara fitur individu mereka dapat disusun untuk dengan mudah menciptakan solusi sederhana untuk masalah yang kompleks. Ini menghalangi ortogonalitas tertentu yang hanya dapat dicapai melalui keseimbangan inklusi atau penghilangan semua fitur bahasa yang dieksplorasi sejauh ini. Jika Anda mencoba menambahkan pengetikan statis ke Ruby, Anda akan melumpuhkannya, jika Anda mencoba mengambilnya dari Haskell, Anda akan menghancurkannya. Berbeda dengan itu: jika Anda mengambilnya dari C, orang tidak akan memperhatikan dan jika Anda mengambilnya dari Jawa, beberapa mungkin akan berterima kasih.
Dari pengalaman pribadi saya, saya bisa memberi tahu Anda ini: Saya suka Ruby. Itu memperluas cakrawala saya dan cara saya merancang sistem. IMHO harus digunakan untuk mengajar orang pemrograman sejak awal. Itu tidak mengganggu, kuat, ringkas, menyenangkan. Saya mengerti mengapa seseorang yang berasal dari bahasa ortodoks akan menikmatinya.
Namun dalam jangka panjang, pengetikan statis memungkinkan untuk menunda pekerjaan ke penganalisa statis dan dengan inferensi tipe ini pada dasarnya tanpa biaya. Hasilnya adalah kode yang lebih mudah dipelihara dan sering berjalan lebih cepat.
Tetapi sekali lagi, mengetik statis saja tidak dapat melakukan apa pun. Ini masalah kombinasi. Saya pikir di suatu tempat antara F #, Scala, Nemerle, OCaml atau haXe Anda dapat menemukan optimum Anda sendiri. Tapi itu pada akhirnya tergantung pada Anda, karena bahasa tersebut seharusnya memungkinkan Anda untuk menanamkan pikiran Anda tanpa usaha, alih-alih memaksa Anda untuk menekuknya. Lagi pula, tidak ada yang menghasilkan lebih banyak perolehan produktivitas, selain jika pemrograman itu menyenangkan.
sumber
Secara pribadi, satu-satunya alasan pengetikan dinamis akan membantu adalah jika Anda adalah pengetik yang benar-benar lambat atau Anda membangun fungsi / metode / whatevers raksasa yang sulit dinavigasi. Anda juga harus masuk ke masalah pengujian seluruh unit. Tipe dinamis memerlukan (kecuali jika Anda suka menulis kode rusak) pengujian unit yang kuat (Untuk memastikan bahwa tipe dinamis Anda tidak meledak secara tiba-tiba (mis. Sebagian besar variabel adalah bebek, tetapi kadang-kadang dcuk tidak sengaja)). Statika akan berusaha lebih keras untuk mencegah hal ini (Dan ya, Anda dapat membuat argumen untuk tes unit yang kuat)
sumber
Saya pikir pertama-tama Anda perlu mendefinisikan "produktivitas". Apa yang dimaksud dengan dan termasuk "produktivitas"?
Jika dengan "lebih produktif" maksud Anda menulis lebih sedikit baris kode untuk mengimplementasikan fitur yang sama, maka ya, bahasa pemrograman pengetikan dinamis lebih "produktif" daripada bahasa pengetikan statis.
Namun, jika Anda juga mempertimbangkan waktu yang dihabiskan untuk debugging dan memperbaiki bug, maka bahasa pengetikan dinamis mungkin tidak seproduktif itu, karena bahasa pengetikan dinamis cenderung mendorong pengecekan kesalahan untuk menjalankan waktu sementara, sebaliknya, bahasa pengetik statis dapat melakukan beberapa pengecekan kesalahan dalam waktu kompilasi. Seperti yang umum diterima bahwa, biasanya, semakin banyak bug ditemukan, semakin mahal untuk memperbaiki bug itu. Oleh karena itu, kode pengetikan dinamis dapat menghasilkan produktivitas yang secara umum sama atau bahkan mungkin lebih rendah daripada kode pengetikan statis.
sumber
Keuntungan besar dari pengetikan dinamis adalah produktivitas.
Python, Ruby, dll. Memiliki banyak pemacu produktivitas lain selain pengetikan dinamis (parameter default, kamus seperti tipe bawaan, dll.) Efek kumulatif pada produktivitas pemrogram sangat mengesankan.
Hukuman dalam hal kecepatan (atau kurangnya!) Dan konsumsi sumber daya tidak seburuk yang Anda harapkan dan dalam kebanyakan kasus lebih dari dikompensasi oleh kecepatan dan fleksibilitas pengembangan.
Ada makalah (sangat tua!) Pada subjek di sini. Ini adalah salah satu dari sedikit studi yang dilakukan dengan benar pada produktivitas programmer dan banyak kesimpulan masih valid.
Apa yang akan (mungkin) berbeda adalah penelitian yang akan dilakukan hari ini: -
Jadi pesannya adalah kecuali jika kinerja adalah masalah serius, bahasa dinamis akan meningkatkan produktivitas Anda.
sumber