Dinamik ve statik diller arasındaki mimari farklar


22

Statik dillerde (C # veya Java gibi) ve dinamik dillerde (Ruby veya Python gibi) oluşturulacak uygulamaları tasarlarken büyük mimari farklılıklar var mı?

Biri için diğeri için kötü olan bir tür için iyi bir seçim olabilecek tasarım olanakları nelerdir? Birinde diğerinde olmayan bir türle elde edilebilecek yararlı özellikler var mı (tabii ki tasarım ve mimaride)?

Ayrıca, dinamik özel tasarım desenleri var mı?


1
Bu mimari farklılıklar ne olursa olsun, dinamik diller - IronRuby ve IronPython - kolayca. Net'in statik dillerini tamamlar.
IABstract

3
Emin değilim, ancak metaprogramlama dinamik dillerde daha kolaysa (Ruby'de Java'ya göre, en son baktığımda daha kolay görünüyordu), bunun mimari kararlar üzerinde bir etkisi olabilir. Ne tür bir etki olduğundan emin değilim, çünkü bu dinamik dillerde bu kadar büyük bir şey üzerinde hiç çalışmadım.
SinirliFormsDesigner ile

Yanıtlar:


14

Birkaç şeyi açıklığa kavuşturalım:

  1. Etkileşimli komut dosyası oluşturma ve statik diller birbirini dışlamaz. F # ve Haskell'de REPL arayüzleri var.
  2. Bazı optimizasyonlar olmasına rağmen, dinamik diller ve yüksek performans birbirini dışlayan değil. JavaScript, günümüzde çoğu tarayıcıda oldukça hızlı çalışıyor.
  3. Dinamik dillerde bile, türleri belgelemeniz, hatırlamanız ve düşünmeniz gerekir.
  4. Tür çıkarımı popülaritesinin artması nedeniyle, birçok statik dilin artık türleri çok sık göstermesi gerekmez. Derleyici, güçlü tür çıkarımı olan statik dillerde, türlerin kodunuzdan ne olduğunu anlar ve böylece çoğu zaman tür tanımlarını ihlal eden bir şey yapıp yapmadığınızı söyler. Sözdizimi söz konusu olduğunda, bu her iki dünyanın da en iyisini sağlar.
  5. OOP ve dinamik diller birbirini dışlayan değil. PHP artık sınıfları ve hatta mirası destekliyor.

Tüm bu şaşırtıcı benzerlikler bir yana, gelişim sürecini etkileyen bazı pratik farklılıklar var:

  1. Dinamik diller , küçük ortamlarda veri aktarmada ilginç yöntemler sağlar .
  2. Statik diller, birçok türün gerçekleştirilmesini imkansız hale getirerek yapmanız gereken test miktarını azaltmanıza izin verir.
  3. Aynı şekilde, statik diller F # 'daki ölçü birimleri gibi ilginç doğrulama ve otomatik dönüştürme özelliklerine izin verir .
  4. Aşırı ele alındığında, statik diller, kod sözleşmelerine ve olası doğrulamalara , sonsuz döngülere, boş referanslara, geçersiz liste boyutları veya endeksleri, aralık hataları ve diğer mantıksal geçersiz durumlar gibi şeyleri önleyebilir ve belgeleyebilen resmi doğrulamalara izin verir tanımlayabileceğiniz
  5. Daha da ileri giderek, daha iyi performans sağlayan bu statik kısıtlamalara dayanarak CPU optimizasyonları yapılabilir.

Statik yazmadan asla yapılamayacak bir tür program da vardır : Tekillik , donanım süreci sınırlaması olmayan bir işletim sistemi. Kod sözleşmelerini destekleyen az miktarda C, bazı C # ve Spec # adında bir lehçeyle yazılmıştır.

Çöp toplayan bir dilde yazılmış olmasına rağmen, bu işletim sistemindeki çok görevli ve işlemler arası iletişim performansı , aslında tüm işlemlerin bir bellek alanında gerçekleştirilmesi nedeniyle ve resmi doğrulama optimizasyonları nedeniyle, orada bulunan herhangi bir şeyden daha iyidir. yukarıda bahsedilen. Bunu statik yazmadan yapamazsınız, çünkü programların sistemin geri kalanını tehlikeye atamaması için iletişim nesnelerinin statik olarak doğrulanabilir olması gerekir.

Yine de çoğu zaman mimarlar aynı görünmelidir. Statik diller, programların birçok durumda mantıklı olmasını kolaylaştırabilir; çünkü türler iyi tanımlanmıştır, ancak iyi yazılmış bir dinamik dil programı, en azından geliştiricilerin kafasında iyi tanımlanmış olan türlere de sahip olacaktır.


Singularity, gerçek zamanlı olarak farkında olan maksimum gecikme garantisi sağlayabilir mi?
Eonil

@Eonil Benim alanım değil, ama gerçek zamanlı olarak zor olup olmadığını sorduğunu düşünüyorum. Sanmıyorum, çünkü her yerde çöp toplama kullanıyor. Tekillik, bildiğim kadarıyla bir süredir güncellenmedi, ancak belki birileri gerçek zamanlı çöp toplayıcıya benzer bir şey yaptı.
Rei Miyasaka,

Teşekkürler. Sadece kontrol etmek istedim. Bazı gerçek zamanlı GC uygulamaları olduğunu duydum, ancak bunların endüstride pratik olarak nasıl kullanıldığını duymadım…
Eonil

2

Önemli bir mimari fark var. Performans.

Donanım bütçenize, beklenen iş yüküne ve servis seviyesi sözleşmelerine bağlı olarak, gereksinimleri dinamik bir dille karşılamak mümkün olmayabilir.

Çoğu zaman, dinamik dillerin sağladığı geliştirme hızı ve esneklik, cpu ve bellek tüketimindeki yavaş tepki sürelerini yavaşlatır. Ancak bütçe veya performans kısıtlamaları olan daha büyük sistemler için, dinamik bir dilin genel giderleri yüksek olabilir.


1

Bu çizgiler boyunca hiç düşünmedim. Öyleyse bir Google ne zaman Peter Norvig'in blogu en iyi hitlerden biriydi. Bazı tasarım modellerinin dinamik dillerde uygulanması C ++ gibi geleneksel nesne yönelimli dillerden daha kolay olduğunu söylüyor. Dinamik dillerde uygulamanın daha kolay olduğunu belirttiğinden tasarım / mimaride de farklılıklar olması gerektiğini düşünüyorum. Daha fazla çalıştıkça cevaba daha fazlasını eklemeye çalışacağım.


1

Statik dillerde (C # veya Java gibi) ve dinamik dillerde (Ruby veya Python gibi) oluşturulacak uygulamaları tasarlarken büyük mimari farklılıklar var mı?

Yok hayır.

Dinamik diller için süslü çerçeveler yazmak biraz daha kolaydır. Ama bu bir uygulama meselesi değil.

Biri için diğeri için kötü olan bir tür için iyi bir seçim olabilecek tasarım olanakları nelerdir?

Yok, gerçekten.

Her iki dilde de iyi şeyler yazabilirsiniz.

Birinde diğerinde olmayan bir türle elde edilebilecek yararlı özellikler var mı (tabii ki tasarım ve mimaride)?

Yok hayır.

Aradaki fark, dinamik dillerin "yazma, çalıştırma, düzeltme" olmasıdır. Hızlı bir şekilde deneyebilir ve düzeltebilirsiniz.

Statik diller "yazma, derleme, derleme, çalıştırma, düzeltme" dir. Bu kadar kolay deney yapamazsın.

Bunun dışında, yeteneklerinde neredeyse aynılar.

Dinamik özel tasarım desenleri var mı?

Olabilir. Python eval()ve execfile()işlevleri - bir şekilde - statik bir dilde kullanımı zor (ancak imkansız değil) bir dinamik dil özelliğini işaret eder. Aynı işlem alanında kod derlemek ve yürütmek için çok daha fazla kod satırı olacaktır.

Dinamik dile özgü değil. Sadece daha kolay.


2
"Kolayca deney yapamazsınız." - Doğru, derleyicinin hata bulmanıza yardımcı olduğu gerçeği, yorumlanmış dillerle bir kullanıcı bu kod satırını uygulayana kadar bir hata bulamayabilirsiniz.
Doug T.

4
@Doug T .: "derleyici hataları bulmanıza yardımcı olur". Ara sıra. Sık sık değil. İlginç hatalar hiçbir zaman bir derleyici tarafından bulunamaz. Ünite testi bunun için.
S.Lott

2
@ S.Lott Dinamik dillerde yazılmış API'lerin biraz daha fazla belge gerektirdiğini biliyorum. Statik bir dilde, yöntem imzası size hangi tür argümanların gerekli olduğunu söyler. Dinamik bir dilde, kolayca söyleyemezsiniz - API belgelerinin size hangi nesnelerin beklendiğini söylemesi gerekir.
bölme

1
@quanticle: Bu gerçekten mimari değil, değil mi?
S.Lott

2
"Kolayca deney yapamazsınız." - F # ve Haskell her ikisi de statik dildir ve tam teşekküllü REPL'lere sahiptir ve nadiren sizden bir tanımlayıcı veya ifadenin türünü sorarlar.
Rei Miyasaka
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.