Apa yang dimaksud dengan perolehan produktivitas dari pengetikan dinamis? [Tutup]


82

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. :-)


10
Apakah Anda mengharapkan "duo statis" menjadi lebih cepat atau lebih produktif daripada "duo dinamis"?
Steve314

Apa maksudmu dengan duo? Lagi pula: Saya dapat memikirkan beberapa alasan bahwa pengetikan statis lebih produktif daripada pengetikan dinamis: lebih banyak kompiler memeriksa kesalahan, penyelesaian kode, informasi lebih lanjut tentang maksud programmer dalam kode. Itu sebabnya saya bertanya tentang yang sebaliknya.
Hans-Peter Störr

11
Itu hanya lelucon. "Duo dinamis" adalah Batman dan Robin. Mereka tidak akan menyerang rasa takut yang hampir sama dengan dunia kriminal Kota Gotham jika mereka disebut "duo statis". Karena pengembang adalah manusia, hal-hal yang dangkal dapat membuat perbedaan terlepas dari apa arti istilah tersebut.
Steve314

Pertanyaan pertama saya adalah apakah saya tahu apa yang saya lakukan atau tidak. Jika saya melakukannya, maka saya dapat merancang hal-hal sebelumnya dan mengetik statis masuk akal. Jika tidak, maka saya harus mengubah banyak hal dengan cepat dan mengetik dinamis akan lebih mudah. Common Lisp adalah bahasa terbaik yang saya temukan ketika saya tidak tahu apa yang saya lakukan. (Peringatan: Saya hanya menggaruk Haskell, dan karenanya tidak memiliki perasaan yang baik untuk mengetik statis yang disimpulkan.)
David Thornley

2
Saya sepenuhnya setuju dengan John Skeet msmvps.com/blogs/jon_skeet/archive/2009/11/17/…
pengguna

Jawaban:


99

Saya benar-benar berpikir itu adalah panggilan yang cukup dekat. Baik pengetikan dinamis maupun pengetikan statis memiliki kelebihan.

Alasan pengetikan dinamis menjadi lebih produktif:

  • Ini lebih ringkas - Banyak kode boilerplate asing dapat dihapus jika semuanya diketik secara dinamis - deklarasi tipe, logika typecasting dll. Semua hal lain dianggap sama, kode yang lebih pendek sedikit lebih cepat untuk ditulis, tetapi yang lebih penting adalah lebih cepat untuk membaca dan mempertahankan (karena Anda tidak perlu mengarungi banyak halaman kode untuk memahami apa yang terjadi)
  • Lebih mudah untuk teknik "meretas" seperti mengetik bebek dan menambal monyet dapat memberi Anda hasil sangat cepat (meskipun mungkin membingungkan Anda nanti ...)
  • Lebih interaktif - pengetikan dinamis bisa dibilang lebih cocok untuk pemrograman interaktif, seperti REPL untuk prototyping cepat, debugging waktu nyata untuk menjalankan program yang sedang berjalan atau bahkan pengkodean langsung.
  • Test case dapat menangkap kesalahan runtime - dengan asumsi Anda menggunakan TDD atau setidaknya memiliki test suite yang baik, ini akan mengambil masalah pengetikan dalam kode Anda.
  • Polimorfisme yang lebih baik - bahasa dinamis berpotensi lebih besar untuk mendorong penciptaan fungsi dan abstraksi polimorfik, yang dapat mendorong produktivitas dan penggunaan kembali kode. Clojure misalnya memanfaatkan polimorfisme dinamis dalam banyak abstraksinya .
  • Prototipe - data prototipe / objek model dalam pandangan saya lebih kuat dan fleksibel daripada pusaka pewarisan yang diketik secara statis. Bahasa yang dinamis lebih memungkinkan atau mendorong pendekatan berbasis prototipe, Javascript menjadi contoh yang bagus.

Alasan pengetikan statis lebih produktif:

  • Desain yang lebih baik - dipaksa untuk memikirkan jenis-jenis nilai dalam perangkat lunak Anda di muka dapat mendorong Anda ke arah solusi yang lebih bersih dan lebih logis. (Saya katakan bisa - masih mungkin untuk merancang kode yang sangat buruk ...)
  • Pemeriksaan waktu kompilasi yang lebih baik - pengetikan statis dapat memungkinkan lebih banyak kesalahan ditangkap pada waktu kompilasi. Ini adalah keuntungan besar, dan bisa dibilang hal terbaik tentang bahasa yang diketik secara keseluruhan secara statis.
  • Penyelesaian otomatis - pengetikan statis juga dapat memberikan lebih banyak informasi ke IDE sehingga penyelesaian kode atau pencarian dokumentasi secara lebih efektif.
  • Mencegah peretasan - Anda harus tetap mengetikkan disiplin dalam kode Anda, yang kemungkinan besar akan menjadi keuntungan untuk pemeliharaan jangka panjang.
  • Ketik inferensi - dalam beberapa bahasa (misalnya Scala) ini bisa memberi Anda banyak manfaat keringkasan dari bahasa dinamis yang masih mempertahankan disiplin jenis.

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.


14
+1, jawaban yang sangat terperinci. Nilai titik "Pemeriksaan waktu kompilasi yang lebih baik" tidak dapat cukup ditekankan.
NoChance

8
Bersamaan dengan Type Inference, ada juga Haskell-style overloading, C ++ templates, generics dan mungkin beberapa fitur bahasa lainnya yang memberikan beberapa keuntungan dari Duck-typing dalam kerangka kerja statis-typing - selama objek menyediakan antarmuka yang dibutuhkan (itu "dukun seperti bebek") Anda dapat menggunakannya, hampir terlepas dari jenis objek yang nominal. "Hampir" adalah karena beberapa pendekatan memerlukan semacam "deklarasi jenis ini seperti deklarasi jenis bebek yang relevan" - misalnya deklarasi "kelas" di Haskell.
Steve314

45
Saya harus sangat tidak setuju dengan pernyataan Anda bahwa "kode pendek ... lebih cepat dibaca dan dipelihara." Ada langkah menengah, memahami kode. Saya harus menjaga kode orang lain baik di Delphi dan JavaScript, dan kode Delphi jauh lebih mudah dipahami karena lebih verbose. Dan terutama karena kode Delphi memiliki tipe deklarasi dan JavaScript tidak. Ketika berhadapan dengan sesuatu yang lebih kompleks daripada primitif, ketikkan deklarasi membuatnya sepele untuk melihat apa variabel Anda dan apa yang bisa mereka lakukan, yang merupakan pengetahuan penting untuk pekerjaan pemeliharaan.
Mason Wheeler

21
Saya mohon tidak setuju dengan sebagian besar alasan yang diberikan di sini. Ambil Haskell, yang mungkin memiliki sistem tipe paling ketat di luar sana. Ini memiliki REPL (sebenarnya setidaknya dua), ini fitur polimorfisme yang sangat kuat dengan melakukan pencocokan pola pada konstruktor dan itu adalah singkat seperti yang bisa diharapkan - lebih dari Javascript atau Python. Jadi saya kira beberapa alasan yang Anda sebutkan tidak disengaja daripada melekat pada bahasa yang diketik secara longgar.
Andrea

15
Saya tidak akan terlalu percaya pada "kasus uji". Anda tidak dapat membandingkannya dengan sistem tipe yang baik. Sistem tipe memberikan bukti bahwa fungsi Anda sudah akan dipanggil dengan setidaknya mengetikkan parameter yang benar, sementara kasus uji hanya dapat memberikan bukti empiris. Namun, bahkan bukti ini dikumpulkan dari latar buatan.
Ingo

56

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.


11
Ya, pengalaman saya sama. Skrip perl 100 baris tidak apa-apa, dan tanpa alat hebat seperti itu kita akan hilang. Tetapi proyek perl 100k garis perl kemungkinan besar akan menjadi mimpi buruk.
Ingo

3
... dan kemudian Anda memiliki JavaScript (tidak hanya dinamis tetapi juga diketik dengan lemah).
Den

16

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.


18
Sebaliknya jika Anda salah memasukkan program yang salah , kompiler segera memberi tahu Anda dan menyoroti garis yang buruk. ini meningkatkan produktivitas Anda, bila dibandingkan dengan melihat proses pengujian yang gagal dan debugging untuk menemukan kesalahan.
MarkJ

5
wadah umum dan contravariance eksplisit dimaksudkan untuk "menghalangi Anda" jika Anda melakukannya dengan salah. apa manfaat kompilasi kode yang akan gagal saat runtime?
M.Stramm

Biasanya pekerjaan dianggap 0% selesai sampai semua tes berhasil dijalankan. Hanya dengan begitu kemajuan Anda dapat dianggap lebih daripada tidak sama sekali. Dengan mengingat hal itu, saya pikir tidak ada gunanya mengukur produktivitas Anda pada sesuatu yang belum selesai.
Pijusn

-1 Tidak menjawab pertanyaan aktual ("peningkatan produktivitas", ingat?) Juga, Anda mungkin bahkan tidak ingin menulis "program yang valid yang ditolak oleh sistem tipe". Hanya karena Anda tidak dapat berarti Anda harus melakukannya. Dan mengapa Anda bahkan memiliki "program yang valid" yang ditolak oleh juru ketik? Apa, apakah Anda mengkode program Javascript dan tiba-tiba mencoba membuatnya kompilasi di Jawa?
Andres F.

Program-program yang valid yang ditolak oleh sistem tipe dapat membantu mempersingkat kode Anda sehingga menyebabkan lebih sedikit kesalahan yang tidak dapat diketahui sistem tipe (kode kurang = lebih sedikit kesalahan). Compiler / IDE yang menyoroti garis dapat dilakukan dalam bahasa dinamis dengan nilai-nilai tes (yaitu pengembangan yang didorong REPL) sehingga Anda dapat melihat nilai-nilai perantara, dan mereka dapat mengambil kesalahan yang tidak bisa dilakukan oleh sistem tipe Anda serta kesalahan ketik. Anda juga dapat menggunakan inferensi tipe statis untuk memberi Anda peringatan tipe.
aoeu256

15

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 readfungsi yang pada dasarnya kebalikan dari toString. Anda bisa mendapatkan Intatau Doubleatau jenis apa pun yang Anda inginkan (asalkan dalam kelas jenis tertentu). Anda bahkan dapat memiliki polimorfik konstanta , sehingga maxBounddapat menjadi maksimal Int, 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 dengan Word8(tipe int yang tidak ditandatangani) dan fungsi yang diharapkan Int.

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.


1
Ya, untuk beberapa alasan sistem angka sulit untuk diperbaiki. Dalam scala itu juga berantakan. Saya pikir sistem tipe dinamis menang dengan mudah menggunakan sistem tipe statis sederhana dalam hal kemudahan bekerja dengannya, tetapi kalah dari sistem yang lebih maju (seperti Scala, Haskell, ML dll, yang semuanya menggunakan varian sistem-F ).
Edgar Klerks

3
Jawaban Anda bermaksud baik, tetapi memiliki kesalahan. Pertama, itu tidak benar bahwa bahasa dinamis "tidak memiliki sistem tipe", sehingga tidak dapat menjadi alasan mereka "membuatnya lebih mudah untuk menulis kode generik". Mereka tidak membuatnya lebih mudah, seperti contoh tandingan Anda sendiri dengan pertunjukan Haskell (Anda menyanggah pernyataan Anda sendiri!). "Anda tidak pernah harus melawan sistem tipe" adalah salah: Anda melawannya setiap kali Anda harus memperbaiki bug yang disebabkan oleh tidak cukupnya pemeriksaan ketik statis. Akhirnya, secara eksplisit memaksa Intdikembalikan oleh daftar adalah sepele; contoh 1.0 + fromIntegral (length myList):, yaitu gunakan saja fromIntegral.
Andres F.

2
Akhirnya, "menulis kode dengan cepat"! = "Menjadi lebih produktif". Kode Anda harus berfungsi! Jika Anda menulis perangkat lunak kereta yang nantinya harus Anda gunakan untuk debugging dan memperbaiki, Anda tidak produktif.
Andres F.

"tanpa berpikir terlalu banyak" bendera merah untuk apa yang kebanyakan orang maksudkan ketika mereka berbicara tentang bahasa yang diketik secara dinamis menjadi "lebih produktif"
Ataraxia

Jika sistem tipe benar-benar meningkatkan produktivitas, di mana semua aplikasi yang berguna di Haskell atau Idris? Saya pikir hal-hal seperti betapa mudahnya untuk memahami kesalahan jenis, "patchability" (kemampuan untuk mengedit aplikasi Anda dengan cara yang tidak dapat diprediksi) dan 90% pengecekan kesalahan pada dokumen & inferensi tipe mungkin lebih penting.
aoeu256

7

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.


Saya benar-benar tidak menyukai jawaban ini, karena hampir semua poin tidak menjawab pertanyaan inti, "Apa keuntungan yang seharusnya diperoleh dari pengetikan dinamis ?" bukan bahasa yang dinamis .
pengasuh

@nanny dapatkah Anda menguraikan perbedaan yang dirasakan antara bahasa yang diketik dinamis dan bahasa dinamis? (itu salah satu hal yang kabur). Bisakah Anda memberikan contoh bahasa yang diketik secara dinamis yang bukan bahasa yang dinamis, bersama dengan definisi masing-masing yang jelas?

@nanny: Pertanyaannya sebenarnya tentang "bahasa yang diketik secara dinamis", bukan hanya "pengetikan dinamis".
JacquesB

@MichaelT Maaf saya tidak jelas. Pengetikan dinamis adalah salah satu aspek dari semua bahasa dinamis. Jawaban ini berbicara tentang aspek lain yang, secara historis, bahasa dinamis cenderung datang, tanpa benar-benar membahas bagian pengetikan dinamis.
pengasuh

1
@nanny: Saya pada dasarnya menjawab ini: "Saya sering mendengar klaim bahwa bahasa yang diketik secara dinamis lebih produktif daripada bahasa yang diketik secara statis. Apa alasan untuk klaim ini?" - Saya percaya alasan klaim ini historis dan terkait tidak hanya dengan pengetikan dinamis tetapi juga dengan fitur peningkatan produktivitas bahasa dinamis lainnya.
JacquesB

6

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.


"Aturannya adalah, semakin baik fitur bahasa Anda, semakin pendek kode Anda." Ini mungkin karena pendapat pada tingkat tertentu, tetapi saya tidak berpikir pernyataan ini akurat. Kode yang lebih pendek tidak menawarkan terlalu banyak keuntungan sendiri, selain melibatkan kurang mengetik pada waktu menulis, dan mungkin mengambil lebih sedikit ruang disk (yang merupakan faktor non dalam bahasa yang dikompilasi). Saya pikir tanda bahasa yang baik adalah menyampaikan sebanyak mungkin informasi tentang apa yang dilakukannya dengan cara yang sesingkat mungkin. Pengetikan dinamis tidak mendokumentasikan diri sendiri dan kehilangan perawatan karena itu
Ataraxia

Anda dapat menambahkan kode yang diketik secara dinamis dengan informasi seperti nilai default / argumen kata kunci, jenis yang didapat dari inferensi tipe, inferensi tipe dinamis dari kompiler JIT, atau hanya mencatat semua fungsi [melalui setiap fungsi atau kelas dalam program yang sedang berjalan dan menggantinya dengan versi fungsi yang mencatat argumen / hasil). Kemudian Anda dapat melihat log dari fungsi sebelumnya. Gagasan lain adalah menolak kode yang tidak memiliki anotasi jenis, kontrak run-time, atau sampel tes sesi REPL tetapi berikan pengembang pilihan untuk memilih salah satu dari ketiganya.
aoeu256

3

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)


0

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.


Secara umum, itu tidak benar bahwa Anda dapat menulis fitur dalam baris yang lebih sedikit menggunakan bahasa yang dinamis. Bahasa apa yang Anda bandingkan?
Andres F.

@AndresF. Oh, saya terutama menggunakan Python dan C ++.
yaobin

1
Oke, tetapi Anda tidak dapat menyamaratakan dinamis vs statis saat Anda benar-benar membandingkan Python dan C ++. C ++ bukan contoh yang representatif dari bahasa dengan pengetikan statis. Ada bahasa dengan ketikan statis yang sangat singkat, yang lebih atau kurang memungkinkan Anda untuk menulis program sesingkat dengan Python. Jadi, secara umum, pernyataan Anda salah.
Andres F.

Ya, tetapi bagaimana jika Anda mengedit program Anda saat masih berjalan? Masalah waktu berjalan hanya akan terjadi dan Anda dapat memperbaikinya di sana. Di Lisp, setiap kali Anda mendapatkan kesalahan, Anda hanya dapat memperbaiki program Anda dan kemudian melanjutkan menjalankannya ... Ya untuk jalur yang lebih kompleks ketik anotasi akan lebih baik [mungkin Anda bisa menggunakan pengetikan bertahap seperti mypy & lisp], tetapi jalur yang lebih rumit itu juga memiliki kemungkinan kesalahan non-tipe sehingga menghindari jalur yang rumit dalam bahasa apa pun mungkin merupakan ide yang baik.
aoeu256

-1

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: -

  1. Java JVM telah meningkat tanpa bisa dikenali.
  2. IDE modern akan meningkatkan produktivitas C ++, dan Java coders, tetapi membuat sedikit perbedaan pada bahasa scripting.
  3. C # akan dimasukkan dan mungkin berada di ball park yang sama dengan Jawa tetapi sedikit lebih baik.

Jadi pesannya adalah kecuali jika kinerja adalah masalah serius, bahasa dinamis akan meningkatkan produktivitas Anda.


2
Ketidakjelasan saya adalah apa yang sebenarnya dilakukan pengetikan dinamis untuk meningkatkan produktivitas Anda. Makalah ini menarik, tetapi ini tentang program yang sangat kecil, dan saya tidak yakin bagaimana ini membawa ke ribuan baris kode di sebagian besar program.
Hans-Peter Störr

5
Studi itu hanya menggunakan C, C ++ dan Java sebagai contoh bahasa statis, dan kemudian mencoba untuk menerapkan kesimpulan yang ditemukan pada bahasa pemrograman tradisional secara umum. Ketiga bahasa memiliki sintaks dasar yang sama, dengan kelemahan inheren, penurunan prduktivitas yang sama, membuat perbandingan tidak valid. Bukan karena bahasa statis tidak produktif, melainkan bahwa keluarga C tidak produktif. Seandainya mereka memasukkan dialek Pascal dalam pengujian mereka, kemungkinan besar mereka telah mencapai beberapa kesimpulan berbeda.
Mason Wheeler

@mason - hanya ada sedikit studi objektif aktual di bidang ini. Ini adalah salah satu dari sedikit studi nyata dengan angka aktual dll. Program "sampel" tidak sepele! Ini menggabungkan elemen penanganan kamus, algoritma kompleks dan volume data yang besar. Persentase tinggi upaya gagal dan terhenti mengkonfirmasi sifat tugas yang tidak sepele.
James Anderson

2
-1 Anda tidak banyak bicara tentang apa yang membuat bahasa yang diketik dinamis lebih produktif. Parameter dan kamus default dapat ditemukan dalam bahasa yang diketik statis seperti misalnya Scala.
Jonas

1
@ JamesAnderson Lebih buruk lagi, kertas yang Anda tautkan bahkan tidak mendukung pendapat Anda. Ini membandingkan "bahasa scripting" (sering dinamis) dengan " bahasa konvensional " (sering statis). Sekarang, katakan padaku, apa sebenarnya yang "konvensional" bahasa? Apakah Anda pikir itu sama dengan kumpulan bahasa dengan pengetikan statis? Lebih buruk lagi, kertas tidak yang lama. Pada tahun 2000, banyak bahasa hebat dengan pengetikan statis yang bisa dibilang lebih produktif daripada bahasa dinamis yang sudah ada.
Andres F.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.