Ya, pertanyaan serupa telah diajukan tetapi selalu dengan tujuan mencari tahu 'mana yang lebih baik.'
Saya bertanya karena saya muncul sebagai dev terutama dalam JavaScript dan tidak benar-benar memiliki pengalaman menulis dalam bahasa yang diketik secara statis.
Terlepas dari ini, saya pasti melihat nilai dalam belajar C untuk menangani operasi yang menuntut pada tingkat kode yang lebih rendah (yang saya asumsikan memiliki banyak kaitan dengan statis vs dinamis pada tingkat kompiler), tetapi apa yang saya coba untuk membungkus kepala saya sekitar apakah ada konteks proyek tertentu (mungkin jenis operasi dinamis data intensif tertentu?) yang melibatkan hal-hal selain kinerja di mana lebih masuk akal untuk menggunakan Java atau C # vs. sesuatu seperti Python.
sumber
Jawaban:
Iya tentu saja.
Pengetikan dinamis memiliki keunggulan yang pasti dalam kasus di mana Anda ingin dapat memperlakukan semuanya sebagai satu jenis tunggal. Serialisasi / deserialisasi adalah salah satu contoh klasik. Inilah sebabnya mengapa begitu banyak pemrograman Web dilakukan dalam bahasa scripting yang diketik secara dinamis: mereka sangat cocok untuk tugas yang melibatkan banyak konversi semua jenis data ke dan dari string.
Untuk pemrograman aplikasi, di sisi lain, bahasa statis bekerja jauh lebih baik karena mencoba memperlakukan segala sesuatu sebagai satu jenis tunggal tidak sering menjadi persyaratan. Anda sering ingin memiliki struktur data yang efisien dengan data direpresentasikan sebagai dirinya sendiri dan tidak sering dikonversi ke tipe lain. Ini membuat fitur pengetikan dinamis menjadi kelemahan alih-alih manfaat, itulah sebabnya aplikasi hampir secara eksklusif ditulis dalam bahasa yang diketik secara statis.
sumber
Cara saya melihatnya adalah, jika Anda dapat bekerja secara alami dalam bahasa yang diketik secara statis, maka mengetik statis adalah cara yang harus dilakukan. Secara umum, tujuan dari sistem tipe adalah untuk mencegah Anda melakukan operasi dengan semantik yang tidak ditentukan - seperti
(string) "hello" + (bool) true
. Memiliki tingkat keamanan ekstra yang mencegah Anda melakukan operasi ini dapat menjadi cara yang baik untuk mencegah bug dalam kode Anda, bahkan tanpa tes unit yang ekstensif. Yaitu, tipe-safety memberikan tingkat kepercayaan lain pada kebenaran semantik dari kode Anda.Tetapi sistem tipe sangat sulit untuk diperbaiki. Saya tidak percaya ada adalah sistem jenis yang sempurna di alam pada saat penulisan ini. (Dengan "sistem tipe sempurna", maksud saya sistem tipe ketat, yang tidak memerlukan anotasi kode verbose, yang tidak menghasilkan kesalahan tipe positif palsu, dan kesalahan jenisnya mudah dipahami oleh pemrogram.) Selanjutnya, dapat sulit untuk memahami sistem tipe yang benar-benar baik yang ada. Ketika saya belajar Haskell, saya tidak bisa memberi tahu Anda jumlah kesalahan jenis tidak jelas yang saya dapatkan ketika mencoba untuk menulis apa yang tampak (bagi saya) seperti kode yang benar. Biasanya kode itu sebenarnya tidak benar (yang merupakan titik yang mendukung sistem tipe), tetapi butuh banyakpekerjaan untuk memahami pesan kesalahan dari kompiler, sehingga saya bisa memperbaiki masalah yang mendasarinya. Dalam bahasa OO, Anda mungkin akhirnya berpikir "argumen ini harus bertentangan dengan tipe input, bukan kovarian!", Atau (lebih mungkin) kembali ke typecast untuk melarikan diri dari batasan sistem tipe. Sistem tipe bisa menjadi jauh lebih rumit daripada yang Anda pikirkan.
Untuk apa nilainya, menurut pemahaman saya bahwa kesulitan dalam menghasilkan sistem tipe yang baik adalah bagian dari apa yang memotivasi Gilad Bracha untuk memasukkan dukungan sistem tipe pluggable di Newspeak.
sumber
Mereka adalah alat yang berbeda, tetapi tidak berdasarkan kinerja. Ini semua tentang kompleksitas .
Bahasa dinamis biasanya bertujuan fleksibilitas maksimum, dan itu membawa kurang validasi dan semacam jaminan. Kemudian, ini sangat kuat dalam program skala kecil, tetapi menjadi hampir tidak mungkin untuk mempertahankan program skala besar (kompleksitas).
Bahasa statis biasanya bertujuan validasi maksimum. Tujuan pertama mereka biasanya menangkap kesalahan (atau bug) sedini mungkin. Banyak jaminan dibuat untuk validasi. Maka lebih sulit untuk belajar dan memulai, tetapi ketika program semakin besar, ini memberikan validasi program yang lebih baik dengan biaya yang jauh lebih rendah (upaya pengkodean).
Akibatnya, bahasa dinamis biasanya cocok untuk program kecil (maksud saya sangat kecil) seperti halaman web dinamis, DSL browser web (bukan untuk aplikasi browser!) Atau skrip shell. Bahasa statis lebih cocok untuk program sistem atau hal lainnya.
Deskripsi di atas adalah sesuatu tentang bahasa yang sangat murni dinamis atau statis. Sebagian besar bahasa kehidupan nyata ada di antaranya, dan menunjukkan berbagai karakteristik.
Lihat di sini untuk detail lebih lanjut: https://softwareengineering.stackexchange.com/a/105417/17428
sumber
Saat ini saya memprogram dalam bahasa jenis statis (C # dan F #), tetapi saya menikmati pemrograman dalam bahasa dinamis (Smalltalk, Ruby). Ada banyak pro dan kontra yang diasosiasikan orang dengan satu jenis vs jenis lain yang lebih banyak tentang bahasa daripada saat Anda menerapkan jenis. Sebagai contoh, bahasa dinamis biasanya memiliki sintaksis yang lebih bersih dan lebih ringkas, namun F # dan OCaml dengan sistem inferensi tipenya memiliki sintaks sebersih bahasa dinamis apa pun. Dan dengan pengetikan statis, Anda memiliki refactor otomatis nyata dan autocomplete, tetapi Smalltalk, dengan seluruh kode sumbernya dalam database dan setiap metode dikompilasi secara terpisah, adalah bahasa pertama yang benar-benar memiliki refactoring otomatis yang serius, dan itu bekerja dengan baik. Pada akhirnya, bahasa modern yang dinamis dan statis saat ini adalah tipe aman, yang merupakan aspek paling penting dari sistem tipe Anda,
sumber
Sekarang tahun 2015, yang menambahkan beberapa cuplikan menarik ke percakapan:
Jadi para backend bosan dengan jaket lurus pengetikan yang tidak perlu, sementara frontend bosan dengan kekacauan pengetikan dinamis.
Cukup ironis: Saya ingin tahu apakah mereka akan bertemu di tengah, atau bergegas melewati satu sama lain dengan ledakan sonik dari tenggat waktu yang berlalu ...? ;)
sumber