Bahasa bertipe dinamis versus bahasa bertipe statis

205

Apa kelebihan dan keterbatasan bahasa tipe dinamis dibandingkan dengan bahasa tipe statis?

Lihat juga : ada apa dengan cinta bahasa dinamis (utas yang jauh lebih argumentatif ...)

cvs
sumber
10
Pertanyaan ini terlalu subyektif.
Jason Dagit
7
Saya tidak akan menyebutnya subyektif, tetapi umpan api. Tetapi ada beberapa fakta obyektif tentang hal itu.
Vinko Vrsalovic
2
Setuju: terlalu subjektif. Sangat menarik untuk membandingkan dan membedakan kedua pendekatan tersebut, tetapi berbahaya di ambang kiamat forum.
Daniel Spiewak
17
Bahasa dinamis sangat bagus untuk pengembangan aplikasi demo / throwaway yang cepat karena jika Anda membuat kesalahan ketik yang mana, halaman web masih memuat Anda mungkin hanya memiliki beberapa elemen data yang salah di sini atau di sana. Saya tidak bisa membayangkan situasi lain di mana kemampuan untuk salah ketik variabel Anda tanpa mendapatkan kesalahan kompilator dipandang sebagai "keuntungan".
Alex R
4
Kesalahan seperti itu biasanya akan membuat JavaScript berhenti, yang saya anggap sebagai hal yang sangat baik. Paling tidak itu akan membuang kesalahan yang juga saya temukan berharga. Untuk beberapa alasan, selalu lelaki dari paradigma pengetikan statis yang ingin mengubur kesalahan javascriptnya dengan pernyataan coba-coba yang kosong. Ini merupakan fenomena dalam pengalaman saya. Apa itu? Bagaimanapun juga, ini tidak seperti kita tidak mendapatkan umpan balik ketika kita menjalankan kode kita.
Erik Reppen

Jawaban:

139

Kemampuan interpreter untuk menyimpulkan konversi tipe dan tipe membuat waktu pengembangan lebih cepat, tetapi juga dapat memicu kegagalan runtime yang Anda tidak bisa dapatkan dalam bahasa yang diketik secara statis di mana Anda menangkapnya pada waktu kompilasi. Tetapi yang mana yang lebih baik (atau bahkan jika itu selalu benar) sedang hangat dibicarakan di masyarakat akhir-akhir ini (dan sejak lama).

Cara yang baik untuk masalah ini adalah dari Pengetikan Statis Bila Mungkin, Pengetikan Dinamik Saat Dibutuhkan: Akhir Perang Dingin Antara Bahasa Pemrograman oleh Erik Meijer dan Peter Drayton di Microsoft:

Pendukung pengetikan statis berpendapat bahwa keuntungan pengetikan statis meliputi deteksi kesalahan pemrograman lebih awal (misalnya mencegah penambahan bilangan bulat ke boolean), dokumentasi yang lebih baik dalam bentuk tanda tangan jenis (misalnya memasukkan jumlah dan jenis argumen saat menyelesaikan nama), lebih lanjut peluang untuk optimisasi kompiler (misalnya mengganti panggilan virtual dengan panggilan langsung ketika tipe persis penerima dikenal secara statis), peningkatan efisiensi runtime (mis. tidak semua nilai perlu membawa tipe dinamis), dan pengalaman pengembang waktu desain yang lebih baik (misalnya mengetahui jenis penerima, IDE dapat menyajikan menu drop-down dari semua anggota yang berlaku). Fanatik pengetikan statis mencoba membuat kami percaya bahwa "program yang diketik dengan baik tidak dapat salah". Meskipun ini tentu terdengar mengesankan, itu adalah pernyataan yang agak kosong. Pengecekan tipe statis adalah abstraksi waktu kompilasi dari perilaku runtime program Anda, dan karenanya hanya sebagian suara dan tidak lengkap. Ini berarti bahwa program-program masih dapat salah karena properti yang tidak dilacak oleh pemeriksa tipe, dan bahwa ada program-program yang sementara mereka tidak dapat salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis menjadi kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. Pengecekan tipe statis adalah abstraksi waktu kompilasi dari perilaku runtime program Anda, dan karenanya hanya sebagian suara dan tidak lengkap. Ini berarti bahwa program-program masih dapat salah karena properti yang tidak dilacak oleh pemeriksa tipe, dan bahwa ada program-program yang sementara mereka tidak dapat salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. Pengecekan tipe statis adalah abstraksi waktu kompilasi dari perilaku runtime program Anda, dan karenanya hanya sebagian suara dan tidak lengkap. Ini berarti bahwa program-program masih dapat salah karena properti yang tidak dilacak oleh pemeriksa tipe, dan bahwa ada program-program yang sementara mereka tidak dapat salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. dan karenanya hanya sebagian suara dan tidak lengkap. Ini berarti bahwa program-program masih dapat salah karena properti yang tidak dilacak oleh pemeriksa tipe, dan bahwa ada program-program yang sementara mereka tidak dapat salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis menjadi kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. dan karenanya hanya sebagian suara dan tidak lengkap. Ini berarti bahwa program-program masih dapat salah karena properti yang tidak dilacak oleh pemeriksa tipe, dan bahwa ada program-program yang sementara mereka tidak dapat salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis menjadi kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. dan bahwa ada program-program yang walaupun tidak bisa salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis menjadi kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama. dan bahwa ada program-program yang walaupun tidak bisa salah tidak dapat diperiksa jenisnya. Dorongan untuk membuat pengetikan statis menjadi kurang parsial dan lebih lengkap menyebabkan sistem tipe menjadi terlalu rumit dan eksotik seperti yang disaksikan oleh konsep seperti "tipe hantu" [11] dan "tipe goyah" [10]. Ini seperti mencoba lari maraton dengan bola dan rantai yang diikatkan ke kaki Anda dan dengan penuh kemenangan berteriak bahwa Anda hampir berhasil meskipun Anda keluar dengan jaminan setelah mil pertama.

Pendukung bahasa yang diketik secara dinamis berpendapat bahwa pengetikan statis terlalu kaku, dan kelembutan bahasa yang dinamis membuat mereka cocok untuk membuat prototipe sistem dengan perubahan atau persyaratan yang tidak diketahui, atau yang berinteraksi dengan sistem lain yang berubah secara tak terduga (integrasi data dan aplikasi). Tentu saja, bahasa yang diketik secara dinamis sangat diperlukan untuk berurusan dengan perilaku program yang benar-benar dinamis seperti intersepsi metode, pemuatan dinamis, kode seluler, refleksi runtime, dll. Dalam induk semua makalah tentang skrip [16], John Ousterhout berpendapat bahwa sistem yang diketik secara statis bahasa pemrograman membuat kode kurang dapat digunakan kembali, lebih bertele-tele, tidak lebih aman, dan kurang ekspresif daripada bahasa scripting yang diketik secara dinamis. Argumen ini secara parroted oleh banyak pendukung bahasa scripting yang diketik secara dinamis. Kami berpendapat bahwa ini adalah kesalahan dan jatuh ke dalam kategori yang sama dengan berargumen bahwa esensi dari pemrograman deklaratif adalah menghilangkan tugas. Atau seperti yang dikatakan John Hughes [8], adalah mustahil secara logis untuk membuat bahasa lebih kuat dengan menghilangkan fitur. Mempertahankan fakta bahwa menunda semua pengecekan tipe untuk runtime adalah hal yang baik, memainkan taktik burung unta dengan fakta bahwa kesalahan harus ditangkap sedini mungkin dalam proses pengembangan. itu adalah ketidakmungkinan logis untuk membuat bahasa lebih kuat dengan menghilangkan fitur. Mempertahankan fakta bahwa menunda semua pengecekan tipe untuk runtime adalah hal yang baik, memainkan taktik burung unta dengan fakta bahwa kesalahan harus ditangkap sedini mungkin dalam proses pengembangan. itu adalah ketidakmungkinan logis untuk membuat bahasa lebih kuat dengan menghilangkan fitur. Mempertahankan fakta bahwa menunda semua pengecekan tipe untuk runtime adalah hal yang baik, memainkan taktik burung unta dengan fakta bahwa kesalahan harus ditangkap sedini mungkin dalam proses pengembangan.

Vinko Vrsalovic
sumber
37
"Metode intersepsi, pemuatan dinamis, kode seluler, refleksi runtime" semua bisa dilakukan di Jawa, hanya untuk catatan.
Will Hartung
13
Jenis hantu tidak "terlalu rumit".
Jon Harrop
12
Tautan ke makalah Meijer rusak pada 5/16/2010.
jchadhowell
5
@jchadhowell, Anda dapat menemukannya di sini research.microsoft.com/en-us/um/people/emeijer/Papers/…
Srinivas Reddy Thatiparthy
4
@VinkoVrsalovic Bahasa statis dengan inferensi tipe dan polimorfisme cukup baik untuk pembuatan prototipe cepat. Mereka menawarkan kenyamanan yang sama dengan bahasa dinamis dan keamanan bahasa statis.
Edgar Klerks
119

Sistem tipe statis berupaya menghilangkan kesalahan tertentu secara statis, memeriksa program tanpa menjalankannya, dan berusaha membuktikan kesehatannya dalam beberapa hal. Beberapa jenis sistem dapat menangkap lebih banyak kesalahan daripada yang lain. Sebagai contoh, C # dapat menghilangkan pengecualian null pointer ketika digunakan dengan benar, sedangkan Java tidak memiliki kekuatan seperti itu. Twelf memiliki sistem tipe yang benar-benar menjamin bahwa bukti akan berakhir , "menyelesaikan" masalah yang terputus - putus .

Namun, tidak ada sistem tipe yang sempurna. Untuk mengeliminasi kelas kesalahan tertentu, mereka juga harus menolak program tertentu yang benar-benar valid yang melanggar aturan. Inilah sebabnya mengapa Twelf tidak benar-benar menyelesaikan masalah penghentian, itu hanya menghindarinya dengan membuang sejumlah besar bukti valid sempurna yang kebetulan berakhir dengan cara yang aneh. Demikian juga, sistem tipe Java menolak PersistentVectorimplementasi Clojure karena penggunaan array yang heterogen. Ini bekerja saat runtime, tetapi sistem tipe tidak dapat memverifikasinya.

Karena alasan itu, kebanyakan sistem tipe menyediakan "lolos", cara untuk menimpa pemeriksa statis. Untuk sebagian besar bahasa, ini mengambil bentuk casting, meskipun beberapa (seperti C # dan Haskell) memiliki seluruh mode yang ditandai sebagai "tidak aman".

Secara subyektif, saya suka mengetik statis. Diterapkan dengan benar (petunjuk: bukan Java), sistem tipe statis dapat sangat membantu dalam menghilangkan kesalahan sebelum mereka merusak sistem produksi. Bahasa yang diketik secara dinamis cenderung memerlukan lebih banyak pengujian unit, yang membosankan di saat terbaik. Juga, bahasa yang diketik secara statis dapat memiliki fitur tertentu yang tidak mungkin atau tidak aman dalam sistem tipe dinamis ( konversi implisit muncul dalam pikiran). Ini semua masalah persyaratan dan selera subjektif. Saya tidak akan lagi membangun Eclipse berikutnya di Ruby daripada saya akan mencoba untuk menulis skrip cadangan di Majelis atau menambal kernel menggunakan Java.

Oh, dan orang-orang yang mengatakan bahwa " x mengetik adalah 10 kali lebih produktif daripada y mengetik" hanya meniup asap. Mengetik dinamis mungkin "terasa" lebih cepat dalam banyak kasus, tetapi kehilangan kekuatan begitu Anda benar-benar mencoba untuk membuat aplikasi mewah Anda berjalan . Demikian juga, pengetikan statis mungkin tampak sebagai jaring pengaman yang sempurna, tetapi dengan melihat beberapa definisi tipe generik yang lebih rumit di Jawa membuat sebagian besar pengembang bergegas mencari penutup mata. Bahkan dengan sistem tipe dan produktivitas, tidak ada peluru perak.

Catatan akhir: jangan khawatir tentang kinerja saat membandingkan statis dengan pengetikan dinamis. JIT modern seperti V8 dan TraceMonkey semakin mendekati kinerja bahasa statis. Juga, fakta bahwa Java benar-benar mengkompilasi ke bahasa perantara yang secara inheren dinamis harus menjadi petunjuk bahwa untuk sebagian besar kasus, pengetikan dinamis bukanlah pembunuh kinerja besar yang dilakukan sebagian orang.

Daniel Spiewak
sumber
5
Tentang kinerja. Dalam kasus umum itu tidak akan membuat banyak perbedaan, tetapi dalam matematika tegangan tinggi dan semacamnya, ada perbedaan nyata. Tes telah membuktikan panggilan fungsi, dalam kasus ipy vs C #, berbeda dengan seribu siklus. Hanya karena yang pertama harus yakin ada metode.
Dykam
29
dapatkah Anda menguraikan pada titik "C # dapat menghilangkan pengecualian null pointer bila digunakan dengan benar, sedangkan Java tidak memiliki kekuatan seperti itu." ? Contoh atau kutipan akan sangat dihargai.
Srinivas Reddy Thatiparthy
13
"beberapa definisi tipe generik yang lebih rumit di Jawa mengirimkan sebagian besar pengembang berlarian mencari penutup mata" - jika ini adalah contoh kasus terburuk Anda, Anda jelas belum menggunakan C ++ ;-)
bacar
3
"Juga, fakta bahwa Java benar-benar mengkompilasi ke bahasa menengah yang secara inheren dinamis harus menjadi petunjuk bahwa untuk kebanyakan kasus, pengetikan dinamis bukanlah pembunuh kinerja besar yang membuat beberapa orang menjadi seperti itu." - ketika contoh bahasa Anda dengan "kinerja yang baik" adalah Java, Anda mungkin ingin mempertimbangkan kembali.
Yakk - Adam Nevraumont
" Java mengkompilasi ke perantara dinamis yang inheren " - yang merindukan intinya. Pemeriksaan statis telah dilakukan sebelumnya dan oleh karena itu tidak ada pemeriksaan run time tambahan untuk itu diperlukan karena kompiler memilih instruksi seperti daddkarena dia tahu sebelumnya bahwa operan adalah doubles.
Michael Beer
45

Yah, keduanya sangat, sangat sangat sangat disalahpahami dan juga dua hal yang sama sekali berbeda. yang tidak saling eksklusif .

Tipe statis adalah batasan tata bahasa. Bahasa yang diketik secara statis bisa dikatakan bebas konteks. Kebenaran yang sederhana adalah bahwa menjadi tidak nyaman untuk mengekspresikan bahasa secara waras dalam konteks tata bahasa gratis yang tidak memperlakukan semua datanya hanya sebagai vektor bit. Sistem tipe statis adalah bagian dari tata bahasa bahasa jika ada, mereka hanya membatasi itu lebih dari konteks tata bahasa bebas bisa, dengan demikian pemeriksaan tata bahasa terjadi dalam dua lintasan lebih dari sumbernya. Tipe statis sesuai dengan gagasan matematika tentang teori tipe, teori tipe dalam matematika hanya membatasi legalitas beberapa ekspresi. Seperti, saya tidak bisa mengatakan 3 + [4,7]dalam matematika, ini karena teori tipe itu.

Tipe statis dengan demikian bukan cara untuk 'mencegah kesalahan' dari perspektif teoritis, mereka adalah batasan tata bahasa. Memang, asalkan +, 3 dan interval memiliki definisi teoritis set yang biasa, jika kita menghapus tipe sistem 3 + [4,7]memiliki hasil yang didefinisikan dengan cukup baik itu adalah set. 'runtime type error' secara teoritis tidak ada, penggunaan praktis sistem tipe ini adalah untuk mencegah operasi yang bagi manusia tidak masuk akal. Operasi masih hanya pergeseran dan manipulasi bit saja.

Yang menarik dari hal ini adalah bahwa sistem tipe tidak dapat memutuskan apakah operasi seperti itu akan terjadi atau tidak apakah itu akan diizinkan untuk dijalankan. Seperti di, tepatnya mempartisi himpunan semua program yang mungkin pada mereka yang akan memiliki 'kesalahan ketik', dan yang tidak. Itu hanya dapat melakukan dua hal:

1: buktikan bahwa kesalahan tipe akan terjadi dalam suatu program
2: buktikan bahwa mereka tidak akan terjadi dalam suatu program

Ini mungkin terlihat seperti saya menentang diri saya sendiri. Tetapi apa yang dilakukan oleh pemeriksa tipe C atau Java adalah ia menolak sebuah program sebagai 'ungrammatical', atau seperti yang disebutnya 'type error' jika tidak dapat berhasil pada 2. Itu tidak dapat membuktikan mereka tidak akan terjadi, itu tidak berarti bahwa mereka tidak akan terjadi, itu hanya berarti tidak dapat membuktikannya. Mungkin saja suatu program yang tidak memiliki kesalahan ketik ditolak hanya karena tidak dapat dibuktikan oleh kompiler. Contoh sederhana adalahif(1) a = 3; else a = "string";, tentu saja karena selalu benar, cabang-lain tidak akan pernah dieksekusi dalam program, dan tidak akan terjadi kesalahan tipe. Tapi itu tidak bisa membuktikan kasus ini secara umum, jadi itu ditolak. Ini adalah kelemahan utama dari banyak bahasa yang diketik secara statis, dalam melindungi Anda dari diri Anda sendiri, Anda tentu juga dilindungi jika Anda tidak membutuhkannya.

Tetapi, bertentangan dengan kepercayaan umum, ada juga bahasa yang diketik secara statis yang bekerja berdasarkan prinsip 1. Mereka hanya menolak semua program yang mereka dapat membuktikannya akan menyebabkan kesalahan ketik, dan melewati semua program yang mereka tidak bisa. Jadi mungkin saja mereka memungkinkan program yang memiliki kesalahan ketik di dalamnya, contoh yang baik adalah Typed Racket, ini hibrida antara pengetikan dinamis dan statis. Dan beberapa orang akan berpendapat bahwa Anda mendapatkan yang terbaik dari kedua dunia dalam sistem ini.

Keuntungan lain dari pengetikan statis adalah bahwa tipe diketahui pada waktu kompilasi, dan dengan demikian kompiler dapat menggunakannya. Jika kita di Jawa melakukan "string" + "string"atau 3 + 3, kedua +token dalam teks pada akhirnya mewakili operasi dan datum yang sama sekali berbeda, kompiler tahu mana yang harus dipilih dari jenisnya saja.

Sekarang, saya akan membuat pernyataan yang sangat kontroversial di sini, tetapi ingatlah: 'pengetikan dinamis' tidak ada .

Suara yang sangat kontroversial, tapi itu benar, bahasa dinamis diketik adalah dari perspektif teoritis untyped . Mereka hanya bahasa yang diketik secara statis dengan hanya satu jenis. Atau sederhananya, mereka adalah bahasa yang memang secara tata bahasa dihasilkan oleh konteks tata bahasa gratis dalam praktiknya.

Mengapa mereka tidak memiliki tipe? Karena setiap operasi didefinisikan dan diizinkan pada setiap operan, apa sebenarnya 'kesalahan tipe runtime'? Ini dari contoh teoretis murni efek samping . Jika melakukan print("string")yang mencetak string adalah operasi, maka begitu juga length(3), yang pertama memiliki efek samping dari penulisan stringke output standar, yang terakhir hanya error: function 'length' expects array as argument., itu saja. Dari sudut pandang teoretis tidak ada bahasa yang diketik secara dinamis. Mereka tidak diketik

Baiklah, keuntungan nyata dari bahasa 'yang diketik secara dinamis' adalah kekuatan ekspresif, sistem tipe tidak lain adalah batasan kekuatan ekspresif. Dan secara umum, bahasa dengan sistem tipe memang akan memiliki hasil yang pasti untuk semua operasi yang tidak diizinkan jika sistem tipe hanya diabaikan, hasilnya tidak akan masuk akal bagi manusia. Banyak bahasa kehilangan kelengkapan Turing mereka setelah menerapkan sistem tipe.

Kerugian yang jelas adalah kenyataan bahwa operasi dapat terjadi yang akan menghasilkan hasil yang tidak masuk akal bagi manusia. Untuk mencegah hal ini, bahasa yang diketik secara dinamis biasanya mendefinisikan ulang operasi-operasi itu, daripada menghasilkan hasil yang tidak masuk akal itu mereka mendefinisikannya kembali untuk memiliki efek samping dari menulis kesalahan, dan mungkin menghentikan program sama sekali. Ini bukan 'kesalahan' sama sekali, pada kenyataannya, spesifikasi bahasa biasanya menyiratkan ini, ini adalah perilaku bahasa sebanyak mencetak string dari perspektif teoritis. Ketik sistem dengan demikian memaksa pemrogram untuk alasan tentang aliran kode untuk memastikan bahwa ini tidak terjadi. Atau memang, alasan sehingga tidakterjadi juga bisa berguna di beberapa titik untuk debugging, menunjukkan bahwa itu sama sekali bukan 'kesalahan' tetapi properti bahasa yang didefinisikan dengan baik. Akibatnya, satu-satunya sisa 'pengetikan dinamis' yang dimiliki sebagian besar bahasa adalah menjaga terhadap pembagian dengan nol. Inilah yang dimaksud dengan pengetikan dinamis, tidak ada tipe, tidak ada tipe lebih dari nol adalah tipe yang berbeda dari semua angka lainnya. Apa yang orang sebut 'tipe' hanyalah properti lain dari datum, seperti panjang array, atau karakter pertama string. Dan banyak bahasa yang diketik secara dinamis juga memungkinkan Anda untuk menulis hal-hal seperti "error: the first character of this string should be a 'z'".

Hal lain adalah bahwa bahasa yang diketik secara dinamis memiliki tipe yang tersedia saat runtime dan biasanya dapat memeriksa dan mengatasinya serta memutuskan darinya. Tentu saja, secara teori itu tidak berbeda dengan mengakses karakter pertama dari array dan melihat apa itu. Bahkan, Anda dapat membuat C dinamis Anda sendiri, cukup gunakan hanya satu jenis seperti long panjang int dan gunakan 8 bit pertama untuk menyimpan 'tipe' Anda dan tulis fungsi yang sesuai yang memeriksa dan melakukan penambahan float atau integer. Anda memiliki bahasa yang diketik secara statis dengan satu jenis, atau bahasa yang dinamis.

Dalam praktiknya semua ini menunjukkan, bahasa yang diketik secara statis umumnya digunakan dalam konteks penulisan perangkat lunak komersial, sedangkan bahasa yang diketik secara dinamis cenderung digunakan dalam konteks memecahkan beberapa masalah dan mengotomatisasi beberapa tugas. Menulis kode dalam bahasa yang diketik secara statis hanya memakan waktu lama dan rumit karena Anda tidak dapat melakukan hal-hal yang Anda tahu akan baik-baik saja tetapi sistem tipe masih melindungi Anda dari kesalahan yang tidak Anda lakukan. Banyak coders bahkan tidak menyadari bahwa mereka melakukan ini karena itu ada di sistem mereka tetapi ketika Anda membuat kode dalam bahasa statis, Anda sering mengatasi kenyataan bahwa sistem tipe tidak akan membiarkan Anda melakukan hal-hal yang tidak dapat salah, karena itu tidak dapat membuktikan bahwa itu tidak akan salah.

Seperti yang saya perhatikan, 'diketik secara statis' secara umum berarti kasus 2, bersalah sampai terbukti tidak bersalah. Tetapi beberapa bahasa, yang tidak mendapatkan sistem tipenya dari teori tipe sama sekali menggunakan aturan 1: Innocent sampai terbukti bersalah, yang mungkin merupakan hibrida ideal. Jadi, mungkin Typed Racket adalah untuk Anda.

Juga, well, untuk contoh yang lebih absurd dan ekstrem, saya saat ini menerapkan bahasa di mana 'tipe' benar-benar karakter pertama dari array, mereka adalah data, data dari 'tipe', 'tipe', yang merupakan dirinya sendiri. tipe dan datum, satu-satunya datum yang memiliki dirinya sebagai tipe. Tipe tidak terbatas atau dibatasi secara statis tetapi tipe baru dapat dihasilkan berdasarkan informasi runtime.

Zorf
sumber
1
"Banyak bahasa kehilangan kelengkapan Turing mereka setelah menerapkan sistem tipe." tidak berlaku untuk bahasa pemrograman biasa, kan? dari apa yang saya baca, bahasa reguler tidak turing-lengkap
Răzvan Flavius ​​Panda
1
@ RăzvanPanda: Lajla mungkin merujuk pada variasi pada kalkulus lambda yang diketik atau beberapa bahasa pemrograman yang mereka gunakan pada pembuktian teorema. Banyak dari mereka hanya bisa mengekspresikan program yang dijamin berhenti dan karena itu Turing tidak lengkap. Bahasa pemrograman fungsional praktis berdasarkan pada sistem tipe ini mengatasi batasan ini dengan memperluas kalkulus inti dengan tipe rekursif.
hugomg
1
"Kedengarannya sangat kontroversial, tapi itu benar, bahasa yang diketik secara dinamis berasal dari perspektif teoretis tanpa huruf." - ... dan, dalam sekejap, saya tahu Anda tidak tahu apa yang Anda bicarakan. Pengetikan dinamis hanya berarti bahwa jenis-jenis itu milik nilai-nilai, bukan pengidentifikasi. Itu membuat program lebih sulit untuk dibuktikan, tetapi tidak selalu mustahil. Polimorfisme inlining dan parametrik telah mengarah pada pengembangan optimasi tautan-waktu; yang memecahkan jenis masalah yang sama yang menyusun bahasa optimal yang diketik secara dinamis memiliki: yang mengetahui semua input dan output yang mungkin.
DeftlyHacked
25

Mungkin "manfaat" tunggal terbesar dari pengetikan dinamis adalah kurva pembelajaran yang lebih dangkal. Tidak ada sistem tipe untuk dipelajari dan tidak ada sintaksis non-sepele untuk kasus sudut seperti batasan tipe. Hal itu membuat pengetikan dinamis dapat diakses oleh lebih banyak orang dan layak bagi banyak orang yang tidak terjangkau oleh sistem tipe statis. Akibatnya, pengetikan dinamis telah menarik dalam konteks pendidikan (misalnya Skema / Python di MIT) dan bahasa khusus domain untuk non-programer (misalnya Mathematica ). Bahasa-bahasa yang dinamis juga tertangkap di ceruk-ceruk di mana mereka memiliki sedikit atau tidak ada persaingan (misalnya Javascript).

Bahasa yang diketik secara dinamis paling ringkas (mis. Perl, APL, J, K, Mathematica ) adalah spesifik domain dan dapat secara signifikan lebih ringkas daripada bahasa yang diketik secara umum untuk tujuan statis yang paling singkat (mis. OCaml ) di ceruk tempat mereka dirancang untuk .

Kerugian utama dari pengetikan dinamis adalah:

  • Jenis kesalahan run-time.

  • Bisa sangat sulit atau bahkan secara praktis tidak mungkin untuk mencapai tingkat kebenaran yang sama dan membutuhkan pengujian yang jauh lebih banyak.

  • Tidak ada dokumentasi yang diverifikasi oleh kompiler.

  • Kinerja buruk (biasanya pada saat run-time tetapi kadang-kadang pada waktu kompilasi sebagai gantinya, misalnya Skema Stalin) dan kinerja yang tidak dapat diprediksi karena bergantung pada optimisasi canggih.

Secara pribadi, saya dibesarkan dalam bahasa yang dinamis tetapi tidak akan menyentuh mereka dengan tiang 40 'sebagai profesional kecuali tidak ada pilihan lain yang layak.

Jon Harrop
sumber
2
Saya akan mengatakan hambatan yang lebih rendah untuk masuk tetapi penguasaan tidak kurang dari kurva belajar.
Erik Reppen
Bukankah kurva belajar lebih sedikit karena Anda tidak memiliki sistem tipe untuk dipelajari?
Jon Harrop
Masih ada sistem tipe. Anda dapat membuat perkiraan yang masuk akal tentang apa yang terjadi ketika Anda menambahkan bool dan string, tetapi sering kali banyak membantu untuk mengetahui beberapa detail aktual tentang bagaimana jenis-jenis dipaksa dalam bahasa yang diketik secara dinamis. Itulah yang tidak didapatkan oleh banyak orang yang ketat saja. Kami sebenarnya mempelajari hal ini.
Erik Reppen
@ErikReppen: Kami menggunakan definisi "tipe sistem" yang berbeda. Saya merujuk tidak harus belajar sistem tipe statis, misalnya tipe data aljabar, generik. "Jenis" yang Anda maksudkan hanyalah data. Fakta bahwa beberapa fungsi menolak beberapa data saat dijalankan adalah universal.
Jon Harrop
12

Dari Artima's Typing: Strong vs Weak, Static vs Dynamic article:

pengetikan yang kuat mencegah operasi pencampuran antara tipe yang tidak cocok. Untuk mencampur jenis, Anda harus menggunakan konversi eksplisit

pengetikan lemah berarti Anda dapat mencampur jenis tanpa konversi eksplisit

Dalam makalah Pascal Costanza, Pengetikan Dinamis vs Statis - Analisis Berbasis Pola (PDF), ia mengklaim bahwa dalam beberapa kasus, pengetikan statis lebih rentan kesalahan daripada pengetikan dinamis. Beberapa bahasa yang diketik secara statis memaksa Anda untuk meniru secara manual pengetikan dinamis untuk melakukan "Hal yang Benar". Ini dibahas di Lambda the Ultimate .

Mark Cidade
sumber
1
"pengetikan statis lebih rentan terhadap kesalahan daripada pengetikan dinamis" - Ya, ya, dan GANDA ya! Saya sudah memiliki banyak pengalaman dalam kedua jenis bahasa, dan dalam setiap kasus bahasa dinamis "hanya bekerja" sementara statis membutuhkan 2x waktu debugging (Lihat C ++ dan Delphi). Hal ini sering disebabkan oleh masalah tipe, terutama meneruskan data antara modul dan fungsi dengan tipe gila. Meskipun ada semua jenis bug teoritis yang dapat menyebabkan bahasa dinamis, dalam praktiknya, SANGAT jarang saya mengalami bug yang disebabkan oleh tipe paksaan kecuali Anda seorang programmer yang buruk menyalahgunakan tipe dinamis.
dallin
7
Saya membaca draft makalah Costanza beberapa tahun yang lalu. Di mana-mana ia menulis "statis" yang ia maksudkan secara khusus "Jawa". Saya memberinya lusinan contoh balasan dalam bahasa seperti OCaml yang membantah klaimnya, tetapi ia tetap melanjutkan dan menerbitkannya. Dengan tampilan kertas itu, dia masih menerbitkan omong kosong yang sama. Misalnya, dalam makalah itu ia mengklaim "C # umumnya merupakan salinan Java yang buruk". Itu tidak punya tempat dalam makalah ilmiah ...
Jon Harrop
@ Ingat pengalaman saya adalah kebalikannya: harus memprogram banyak dalam C, C ++, Java, Python, Perl dan sejenisnya, saya tidak akan pernah memulai sesuatu yang lebih besar dari program tweak kecil dalam bahasa yang diketik secara dinamis kecuali dipaksakan. Dalam Python, saya masih menggigil ketika memikirkan proyek WSGI: panggilan balik yang harus saya overeritr dilewatkan dalam referensi objek, dan kode itu tampaknya berfungsi dengan baik, ketika itu crash karena ternyata kadang-kadang itu bukan objek tetapi beberapa tipe elemen. sedang berlalu. Bahasa yang membuatnya semudah ini untuk membuat hal-hal buggy seperti itu sangat berbahaya.
Michael Beer
@MichaelBeer Anda juga bisa mengatakan bahasa seperti C / C ++ yang memungkinkan Anda langsung mengelola memori langsung berbahaya! Saya sudah pasti bergulat dengan kesalahan memori selama berjam-jam. Proyek-proyek Jawa besar juga bukan piknik. Dalam bahasa apa pun, Anda harus memahami bahaya bahasa dan praktik yang baik. Proyek terburuk absolut yang pernah saya kerjakan adalah tim proyek PHP dengan struktur kecil, tetapi saya juga bekerja pada proyek dengan bahasa dinamis yang merupakan impian ketika mereka menggunakan kerangka kerja yang baik dan praktik pemrograman yang baik.
dallin
@dallin Setuju, setiap bahasa punya jebakan. Tetapi kekurangan yang saya maksudkan melekat pada bahasa yang diketik secara dinamis, kemungkinan untuk memanipulasi memori secara langsung bukanlah properti bawaan dari bahasa yang diketik secara statis. Anda dapat membayangkan bahasa yang diketik secara dinamis yang memungkinkan Anda memanipulasi mem secara langsung. Saya setuju bahwa C ++ adalah desaster lurus, dengan penemu bahasa itu sendiri percaya tidak ada satu orang pun di planet ini yang dapat mengetahui semua bagian bahasa. Namun, ini tidak dapat disalahkan pada C ++ yang diketik secara statis, tetapi monster yang telah tumbuh sejak 30 tahun ...
Michael Beer
3

Itu tergantung pada konteksnya. Ada banyak manfaat yang sesuai untuk sistem mengetik dinamis serta untuk mengetik kuat. Saya berpendapat bahwa aliran bahasa jenis dinamis lebih cepat. Bahasa dinamis tidak dibatasi dengan atribut kelas dan pemikiran kompilator tentang apa yang terjadi dalam kode. Anda memiliki sedikit kebebasan. Selain itu, bahasa dinamis biasanya lebih ekspresif dan menghasilkan lebih sedikit kode yang baik. Meskipun demikian, ini lebih rawan kesalahan yang juga dipertanyakan dan lebih tergantung pada penutup unit test. Ini prototipe mudah dengan bahasa dinamis tetapi pemeliharaan dapat menjadi mimpi buruk.

Keuntungan utama dari sistem yang diketik statis adalah dukungan IDE dan tentunya penganalisa kode statis. Anda menjadi lebih percaya diri terhadap kode setelah setiap perubahan kode. Pemeliharaannya tenang dengan alat-alat seperti itu.

AndrewG
sumber
0

Ada banyak hal berbeda tentang bahasa statis dan dinamis. Bagi saya, perbedaan utama adalah bahwa dalam bahasa dinamis variabel tidak memiliki tipe tetap; sebagai gantinya, tipe terkait dengan nilai. Karena itu, kode pasti yang dijalankan tidak ditentukan hingga runtime.

Pada implementasi awal atau naif ini adalah hambatan kinerja yang sangat besar, tetapi JIT modern mendekati dengan yang terbaik yang bisa Anda dapatkan dengan mengoptimalkan kompiler statis. (dalam beberapa kasus pinggiran, bahkan lebih baik dari itu).

Javier
sumber
0

Ini semua tentang alat yang tepat untuk pekerjaan itu. Tidak ada yang lebih baik 100% dari waktu. Kedua sistem diciptakan oleh manusia dan memiliki kekurangan. Maaf, tapi kami payah dan membuat barang yang sempurna.

Saya suka pengetikan dinamis karena itu keluar dari jalan saya, tapi ya kesalahan runtime dapat muncul yang tidak saya rencanakan. Sedangkan pengetikan statis dapat memperbaiki kesalahan yang disebutkan di atas, tetapi menggerakkan programmer pemula (dalam bahasa yang diketik) gila mencoba untuk melemparkan antara char konstan dan string.

JJ
sumber
-3

Pengetikan Statis: Bahasa seperti Java dan Scala diketik secara statis.

Variabel harus didefinisikan dan diinisialisasi sebelum digunakan dalam kode.

misalnya int x; x = 10;

System.out.println (x);

Pengetikan Dinamis: Perl adalah bahasa pengetik dinamis.

Variabel tidak perlu diinisialisasi sebelum digunakan dalam kode.

y = 10; gunakan variabel ini di bagian akhir kode

Prakhyat
sumber
5
Ini tidak ada hubungannya dengan sistem tipe.
Thiago Negri