Statik ve dinamik olarak yazılan diller farklı iş türleri için farklı araçlar olarak görülebilir mi?


9

Evet, benzer sorular yöneltildi, ancak her zaman 'hangisinin daha iyi olduğunu' bulmak amacıyla.

Soruyorum çünkü öncelikle JavaScript'te bir geliştirici olarak geldim ve statik olarak yazılmış dillerde yazılmış kapsamlı bir deneyimim yok.

Buna rağmen, daha düşük kod seviyelerinde zorlu işlemleri (C derleyici düzeyinde statik vs dinamik ile ilgisi olduğunu varsayıyorum) ele almak için C öğreniminde kesinlikle değer görüyorum, ama kafamı sarmaya çalıştığım şey Java veya C # ile Python gibi bir şey yapmanın çok daha mantıklı olduğu performans dışındaki şeyleri içeren belirli proje bağlamlarının (belki de bazı dinamik veri yoğun işlem türleri) olup olmadığıdır.


5
Cevap Evet". Her dil türü - aslında her dil - güçlü ve zayıf yönleri vardır ve bu nedenle bazı görevler için diğerlerinden daha uygundur.
ChrisF

C'yi örnek olarak kullanmanız ilginçtir, çünkü bir tür en zayıf yazılan dildir ve hala statik olarak yazılmış olarak adlandırırsınız. C, tip sistemi nedeniyle hızlı değil, tip kontrolleri derleme zamanında gerçekleşiyor. C hızlıdır, çünkü kendinizi ayağa vurmanızı önlemek için çok az güvenlik önlemi veya kontrolü vardır. çünkü yerel ikili dosyaları derler.
sara

Yanıtlar:


10

Evet kesinlikle.
Dinamik yazmanın, her şeyi tek bir tür olarak ele almak istediğiniz durumlarda kesin avantajları vardır. Serileştirme / serileştirme klasik örneklerden biridir. Bu nedenle dinamik olarak yazılan komut dosyası dillerinde çok fazla Web programlama yapılır: bunlar, her türlü veriyi dizelere ve dizelerden dönüştürmeyi içeren bir görev için çok uygundur.

Uygulama programlama için ise statik diller çok daha iyi çalışır çünkü her şeyi tek bir tür olarak ele almaya çalışmak çoğu zaman bir gereklilik değildir . Sıklıkla, kendisi olarak temsil edilen ve diğer türlere çok sık dönüştürülmeyen verilerle verimli veri yapılarına sahip olmak istersiniz. Bu, dinamik yazmanın özelliklerini bir avantaj yerine bir dezavantaj haline getirir, bu yüzden uygulamalar neredeyse tamamen statik olarak yazılan dillerde yazılır.


3
@Erik: Bunu bile söyleyeceğimden emin değilim. Geliştirme sırasında işler değişir. Gereksinimler değişebilir veya bir gereksinimi doğru şekilde uygulamadığınızı ve kodun güncellenmesi gerektiğini fark edersiniz. Bir şeyi değiştirebilmeniz ve ortaya çıkan derleyici hatalarını kullanmanız, değiştirilmesi gereken diğer her şeyi nerede bulacağınızı göstermek için , bu tekniğin mevcut olmadığı dillerde kaybettiğiniz kolaylık ve geliştirme hızına büyük bir destek sağlar . Dinamik dillerde geliştirilen karmaşık uygulamaları görmemenizin nedenlerinden biri de budur.
Mason Wheeler

9
@Mason Wheeler: Çok iyi cevap + 1 Statik tip kontrolünün derleyicinin kontrol tipinin doğruluğunu kontrol ederek hataları bulmasına da yardımcı olacağını ekliyorum. Örneğin, dün 200 satırlık bir Ruby programında hata ayıkladım ve tür ile ilgili olarak yalnızca programı çalıştırarak algılayabildiğim iki hata vardı. 100000 satırlık bir projede neler olduğunu düşünmek istemiyorum. Bu nedenle dinamik yazma, daha fazla esneklik sağlar, bu da tanımladığınız bağlamlarda iyi olur, belirli hataları derleme zamanında bulamazsınız. Yani statik olarak yazılmış sadece verimlilikle değil, doğrulukla da ilgilidir.
Giorgio

1
@MasonWheeler İki yıl ve daha sonra pazarlık ettiğimden çok daha fazla C # ve Java, şimdi birkaç şeye katılmıyorum. Karmaşık web uygulamaları tamamen dinamik dillerle yapılır. Derleme ve çalışma süresi hemen görünür olan değişiklikleri yapabileceğinizde anlamsızdır. Ve türler üzerindeki tüm huzursuzluğun, prosedürel bir dilde, verilerin ilk etapta sürekli el değiştirmemesi gereken OOP tarafından yönlendirilmesi gereken bir dilde olduğundan çok daha anlamlı olduğu fikrini geliştirdim.
Erik Reppen

1
@Erik: * wince * Öncelikle, Java tarafından bir kavram olarak statik yazmayı değerlendirmek, Pinto'nun bir kavram olarak arabaları değerlendirmek gibidir. İkincisi, değişikliklerin "hemen görülebilir" olduğu her şey, tanım gereği, çok karmaşık bir program değildir, çünkü modern donanımda bile, karmaşık programlar, bir derleyici veya yorumlayıcı olsun, kodu hazırlamak için oldukça fazla zaman alır ( veya bir JIT derleyicisi) hazırlanabilir. En etkileyici web uygulamaları bile çok karmaşık bir veritabanının desteklediği çok basit programlar olma eğilimindedir, ki bu tamamen farklı bir konudur.
Mason Wheeler

1
Karmaşık soyutlamalar yapabilme, statik ve dinamik tip sisteme dik ve aynı zamanda hıza diktir. Orada inanılmaz derecede güçlü (bazen de gizemli olsa da) soyutlamalara izin veren statik tip sistemler var. Anında görünen değişikliklere sahip olmak da yazı sisteminden bağımsızdır: kesinlikle statik olarak yazılan diller için tercümanlar oluşturabilirsiniz.
Rufflewind

4

Baktığım gibi, eğer statik olarak yazılan bir dilde doğal olarak çalışabiliyorsanız, statik yazım gitmenin yoludur. Genel olarak, bir yazı sisteminin amacı, tanımlanmamış anlambilim gibi işlemler gerçekleştirmenizi önlemektir (string) "hello" + (bool) true. Bu işlemleri gerçekleştirmenizi önleyen ekstra güvenlik seviyesine sahip olmak, kapsamlı birim testleri olmadan bile kodunuzdaki hataları önlemenin iyi bir yolu olabilir . Yani, tür güvenliği, kodunuzun anlamsal doğruluğuna başka bir güven sağlar.

Ancak yazım sistemlerini doğru yapmak çok zordur. Orada inanmıyorum olan bu yazının yazıldığı anda doğada mükemmel bir tip sistemi. ("Mükemmel yazım sistemi" ile, ayrıntılı kod ek açıklamaları gerektirmeyen, yanlış pozitif yazım hataları üretmeyen ve yazım hatalarının programcının anlaması kolay olan katı bir yazım sistemini kastediyorum.) Ayrıca, var olan gerçekten iyi tip sistemleri anlamak zor. Haskell'i öğrenirken, (bana) doğru kod gibi görünen şeyi yazmaya çalışırken aldığım belirsiz tür hataların sayısını söyleyemem. Genellikle kod aslında doğru değildi (bu tür sistem lehine bir nokta), ama çok şey aldıtemel sorunları düzeltebilmem için derleyiciden gelen hata mesajlarını anlamak. OO dillerinde, sonunda kendinizi "bu argüman , kovaryant değil , girdi tipiyle çelişkili olmalı !" Yazım sistemleri düşündüğünüzden daha zor olabilir.

Değerli olduğu için, iyi tip sistemlerle gelmenin zorluğunun, Gilad Bracha'yı Newspeak'te takılabilir tip sistem desteği eklemeye motive eden şeyin bir parçası olduğunu anlıyorum .


WRT birim testleri, tamamen katılıyorum. Her zaman "iyi birim testleriniz varsa, sizin için tür doğruluğunu doğrulayabilirler" diyen insanlar görürsünüz. Bu bana her zaman Paul Graham'ın (dinamik yazmanın her zaman iyi bir şey olduğuna inanan) nasıl derlediğini derleyen bir dilin derleyicinin işini manuel olarak yapmasını sağlayan bir kusurlu dil olduğunu hatırlattı. Sorta durmanızı ve düşünmenizi sağlar ...
Mason Wheeler

Dinamik olarak yazılan dillerin 'tehlikeleri' ile ilgili endişelerin birçoğunun, bunları nasıl yazdığımızı hesaba katmadığını düşünüyorum. Python ve JS'nin çoğu konsol tarzı olarak yazılabilir. Vida derleme ve çalışma zamanı, hemen şimdi deneyebilir ve ne olduğunu görebilirsiniz. Ancak çok iyi bir noktaya geldiğinizi düşünüyorum. IE6 veya 7 beklenmedik bir şey yaparken, istemci tarafı web geliştirmede tüm sözde iyi tarayıcı satıcılarının korkunç bir kod üzerinde kafa karıştırıcı bir geçiş yaptığında hiçbir şey beni daha da çirkin yapmaz, ki bu sadece, iyi değil ... daha tipik bir şekilde emme.
Erik Reppen

@ mason-wheeler uyumsuzluğu türleri trival hatalarıdır ve dinamik diller türleri kontrol etmez, sadece çalışma zamanındadır. Deneyimlerim, çoğu statik dilin birim testleri kapsamı aynıdır, derleyicinin önceden orada türleri kontrol etmesini sağlamaktan herhangi bir test kaybetmezler ve dinamik diller türleri kontrol etmek için özel testler eklemek zorunda değildir , çalışma zamanı sistemi türlerinizi kontrol eder, birim testiniz yönteminizi kapsarsa bunları yakalar.
jbtule

4

Farklı araçlar, ama performanstan değil. Her şey karmaşıklık ile ilgili .

Dinamik diller genellikle maksimum esnekliği hedefler ve doğrulama eksikliği ve bir çeşit garanti getirir. Daha sonra, küçük ölçekli programlarda çok güçlüdür, ancak büyük ölçekli programları (karmaşıklık) sürdürmek neredeyse imkansız hale gelir.

Statik diller genellikle maksimum doğrulamayı hedefler. İlk hedefleri genellikle hataları (veya hataları) mümkün olduğunca erken yakalamaktır. Doğrulama için birçok garanti verilir. Daha sonra öğrenmek ve başlamak daha zordur, ancak programlar büyüdükçe, çok daha az maliyetle daha iyi program doğrulaması sağlar (kodlama çabaları).

Sonuç olarak, dinamik diller genellikle dinamik web sayfaları, web tarayıcı DSL (tarayıcı uygulamaları için değil!) Veya kabuk komut dosyaları gibi küçük (çok küçük) programlara uyar. Statik diller, sistem programlamaları veya diğer şeyler için daha uygundur.

Yukarıdaki açıklamalar tamamen dinamik veya statik dillerle ilgili bir şeydir. Çoğu gerçek hayat dili aralarındadır ve çeşitli özellikler gösterir.

Daha fazla ayrıntı için buraya bakın: https://softwareengineering.stackexchange.com/a/105417/17428


1
"dinamik diller genellikle küçük (çok küçük) programlara uyar": Deneyimlerime göre dinamik dilleri orta ölçekli uygulamalar için de kullanabilirsiniz (ve elbette, bunları büyük uygulamalar için başarıyla kullanan insanlar da vardır). Kod tabanı büyüdükçe, statik diller tarafından sağlanan statik denetimlerden daha fazla kazanç sağlayabileceğinizi kabul ediyorum.
Giorgio

2
@Giorgio Pekala, bunun nedeni statik doğrulama maddelerine bağımlı olduğumdur. Benim için çok tatlı ve tam anlamıyla küçük ölçekte bile onlarsız yaşayamam: p
Eonil

Statik dillerin avantajlarını görüyorum (ve cevabınızı iptal ettim). Son zamanlarda Python ve Common Lisp kullanıyorum ve pratikte temiz bir tasarım kullanırsanız ve özellikle Python'da yeterli testler yazıyorsanız iyi sonuçlar elde ettiğinizi itiraf ediyorum. Bu diller, daha sonra kolayca üretim kodunuza dönüştürülebilecek bir prototip oluşturmak için çok etkili olabilir. Ancak, evet, daha karmaşık projeler için alabildiğim kadar çok yardım almak istiyorum, bu yüzden statik bir dili tercih ediyorum.
Giorgio

1

Şu anda statik yazı dillerinde (C # ve F #) program yapıyorum, ancak dinamik dillerde (Smalltalk, Ruby) programlamayı seviyorum. İnsanların bir türle diğeriyle ilişkili oldukları ve türlerle ilgili olarak uyguladığınız zamandan daha fazla olan dil hakkında daha fazla artıları ve eksileri vardır. Örneğin, dinamik diller genellikle daha temiz, daha özlü bir sözdizimine sahiptir, ancak tür çıkarım sistemlerine sahip F # ve OCaml, herhangi bir dinamik dil kadar temiz bir sözdizimine sahiptir. Ve statik yazarak, gerçek otomatik yeniden düzenlemelere ve otomatik tamamlamaya sahipsiniz, ancak Smalltalk, bir veritabanındaki tüm kaynak koduyla ve her bir yöntem ayrı olarak derlendi, gerçekten ciddi otomatik yeniden düzenlemelere sahip ilk dildi ve harika çalıştı. Nihayetinde, günümüzün modern dinamik ve statik dilleri, tür sisteminizin en önemli yönü olan tür güvenli,


Statik yazmanın, bir dili az çok esnek yapan şeyin denkleminin sadece küçük bir parçası olduğundan şüphelendim. Ayrıca fark etmeye başladığım şey, birçok geliştiricinin, aşırı yük operatörleri gibi saçma derecede tehlikeli şeyler yapmaktan ziyade, onları yönetmek için rahat bir ray seti tercih etmesidir. VS bazen yavruları tekmelemek istiyor ama kesinlikle F # 'ı merak ettim ve bu konuda söyledikleriniz beni daha da merak ediyor. Bu örtülü olarak daha kapsayıcı bir tür için döküm sadece C # şey daha bir şey olduğunu varsayalım.
Erik Reppen

@erik, Oh evet yazarak ima daha var: F # Türü çıkarımı
jbtule

-1

Şimdi 2015, sohbete bazı ilginç snippet'ler ekliyor:

  1. Kurumsal arka uç dünyasının önemli kısımları, Java yerine Python (dinamik) kullanmayı düşünüyor veya kullanmaya başlıyor (katı statik)
  2. Kurumsal ön uç Dünya TypeScipt dayalı angularjs v2 gibi şeyler görmektir: Bir Yazılan Javascript uzantısı.

Bu yüzden arka uç çocuklar, katı yazmanın gereksiz düz ceketinden bıkmışken, ön uç çocuklar dinamik yazmanın kaosundan bıkmışlar.

Oldukça ironik: Ortada buluşacaklar mı, yoksa son teslim tarihinin sonik patlamasıyla birbirlerini geçip geçmeyeceklerini merak ediyorum ...? ;)


Herhangi bir kanıt sağlamadığınız sürece, en kötü durumda arka uç dünyasının Go'ya geçiş yaptığını iddia ediyorum , ancak tanrı herhangi bir dinamik senaryoyu yasakladı. Statik bir programlama dilinin her zaman çok fazla töreni olduğu efsanesi, daha güçlü çıkarım sistemleri ve sağlam REPL uygulamaları ile uzun süredir tartışılıyor
Den

Büyük ölçeklerde kullanımda dinamik olarak yazılmış çok sayıda arka uç var. Django özellikle gazetecilikte çok popüler ve NYT, Guardian ve Washington Post için arka uçları yönetiyor. Walmart Düğüm üzerinde çalışıyor. Tek efsane, statik tipler olmadan ölçek için yazamayacağınız fikridir. Ve karşılaştığım bazı Java eski kod tabanı felaketleri düşünerek biraz zaman geçirdikten sonra, bunu yapmakta rahat olan insanların statik veya dinamik ile çalışıp çalışmadığı için daha iyi olduğunu düşünüyorum.
Erik Reppen

Gerçekten de, büyük bir Java projem yerine, büyük kurumsal projemde yetenekli bir Python ekibim olmasını tercih ederim.
Cornel Masson

Gerçekten de, büyük kurumsal projemde kötü bir Java projesinden daha yetenekli bir Python ekibim olmasını tercih ederim. Açıklığa kavuşturmak için: Yukarıdaki cevabı müşteri tabanımda, endüstri ağımda ve genel araştırmamda gördüğüm eğilimler üzerine bir gözlem olarak yayınladım. Geleneksel olarak sıkı arka uç, daha az sıkılık, geleneksel olarak daha gevşek ön uç, daha fazla kucaklıyor. "Doğru" (eğer varsa) hakkında bir fikir bile yok - neden indirildiğimden emin değilim. Belki ironi kaybolur ...
Cornel Masson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.