S: Dinamik olarak yazılmış dillerin statik olarak yazılmış dillerden daha verimli olduğu iddiasını sık sık duydum. Bu iddianın sebepleri nelerdir? "
Bunun tarihsel nedenleri var. Birkaç on yıl öncesine kadar giderseniz, dinamik diller tartışılmaz bir şekilde statik dillerden çok daha verimlidir (aynı zamanda önemli ölçüde daha yavaş). Her ikisini de biliyorsanız Perl açıkça C'den çok daha üretkendir ve eldeki göreve de izin verir. Ancak zamanla diller birbirlerinden çok fazla ödünç aldılar ve yeni diller (hem üretkenlik hem de performans açısından) açığı daraltmakta.
İşte dikkat etmeniz gereken bazı noktalar:
Çöp toplama : Çöp toplama büyük bir verimlilik artışıdır. Java’nın GC’yle ilk ana statik dil olduğunu düşünüyorum. Bundan önce, statik temelde manuel bellek yönetimi anlamına geliyordu. (Not: Burada ve aşağıda sadece genel dilleri düşünüyorum. Yaptığım herhangi bir noktaya karşı örnekler verecek birçok deneysel ve niş dil var.)
Bellek güvenliği : Kendinizi ayağınızdan vurmaktan endişe duymanıza gerek kalmaması verimlilik artışıdır. Java gibi statik dilleri "yönetilen" önce, statik genellikle doğrudan bellek erişimi anlamına geliyordu. Hata ayıklama aynı zamanda verimliliğin bir parçasıdır ve güvensiz bellek erişimi gerçekten belirsiz hatalara yol açabilir.
Hantal tip sistemler. Statik dillerde parametreleştirilmiş tiplerin (şablonlar veya jenerikler gibi) kullanılmasından önce, statik tip sistemlerin sınırlamaları genellikle bir yük olmuştur. Örneğin, Java’da, koleksiyondan bir öğe seçtiğiniz her seferde açıkça aşağıya inmeniz gerekiyordu. Yani alçıda sözdizimsel yükü var ve hiçbir tür güvenlik yok. Her yerde bulunan koleksiyonların programlamada ne olduğu göz önüne alındığında, bu önemli bir dezavantajdı.
Her şeyin türünü bildirmek zorunda olmak çok fazla gereksiz yazım olmakla birlikte, modern tür çıkarımı ile bu önemli ölçüde azaltılabilir.
Büyük standart kütüphane. Python, büyük standart kütüphanesi nedeniyle ünlü "piller" olarak ilan edildi. Bu, minimalist bir standart kütüphaneye sahip olan C ile karşılaştırıldığında. Ancak Java ve .net gibi platformlarda geniş bir standart kütüphane standart hale geliyor ve Scala ve F # gibi daha yeni diller bunu "ücretsiz" miras alıyor.
Birinci sınıf veri yapıları. Perl ve Python gibi dinamik diller, ortak işlemler için uygun sözdizimsel kısayolları olan listeler ve haritalar gibi birinci sınıf veri yapılarına sahiptir. Bununla karşılaştırıldığında, C'nin sabit boyutlu diziler dışında yerleşik koleksiyonları yoktur.
Kapanışlar ve lambda sözdizimi - dinamik diller tipik olarak en başından beri olmuştur, fakat statik diller en son Java'yı benimsemiştir.
Kod pasajlarını etkileşimli olarak hızlı bir şekilde test etme yeteneği REPL'in büyük bir nimet olduğunu. Ancak IDE araçları, Visual Studio'daki "acil" pencere gibi, statik diller de bunu bir dereceye kadar taklit edebilir.
Gelişmiş takımlar - statik dillerin dinamik dillerin kolaylığına daha fazla yaklaştığı yukarıdaki noktalara ek olarak, modern editörler dinamik dillerin zor bir zaman eşleşmesine sahip olacak şekilde statik analizden yararlanmaktadır. Örneğin editörler, dinamik bir dilde kesinlikle imkansız konuşan bir şey olan güvenli otomatik yeniden yapılandırmalar sağlayabilir.
Alt satır: Tarihsel olarak doğruydu, ancak bugün cevap daha az kesinti.
S: Öyleyse, dinamik modelleme ile verimlilik için ne söylenebilir?
Dinamik yazım modelini dinamik dilden ayırmak biraz zordur, ancak bir örnek olarak C #, çekirdeği statik bir dil olmasına rağmen, zaman içinde daha dinamik özellikler benimsemiştir. Bu gerçekten dinamik tip modelinin faydasının bir kanıtı. Örnekler:
Yansıma
Yansıma, temel olarak dinamik bir yazma özelliğidir. Nesne türlerini çalışma zamanı raterinde derleme süresinden daha fazla denetlersiniz. Sunulduğu zaman kaşlarını çattı, ama C # 'da yansıma kullanımı gittikçe daha yaygın hale geldi, örneğin ASP.Net MVC yansıması yoğun olarak kullanıyor.
Nitelikler
Nitelikler, dinamik yazma örneğidir. Derleme zamanında bir sınıfa rasgele özellikler ekleyebilir ve sonra çalışma zamanında (yansıtma yoluyla) denetleyebilir ve nesneleri temel alarak işleyebilirsiniz. MEP gibi bir şey temelde bir dinamik tip modeline dayanan bir uzatma çerçevesidir.
Linq to SQL, EF mv.
Çeşitli Linq transformatörleri, sorguları çalışma zamanı nesneleri olarak inceler ve anında sql üretir. Çalışma zamanında kodu denetlemekten daha dinamik olmaz. CodeDom, madalyonun diğer tarafında, çalışma zamanında kodun üretilebileceği yerdir
Roslyn
Roslyn bir eval
zamanlar gerçekten dinamik bir dilin tanımlayıcı özelliği olarak görülen temelde uygular .
Dinamikdynamic
tipi C # en açık dinamik bir özelliğidir ve dış nesneler ve daha basit ve daha üretken dillerle etkileşimi kılmayı bildirilir. Fakat aynı zamanda Asp.net MVC'de kolaylık sağlamak için de kullanılır.
Yukarıdaki özelliklerin tümünün avantajı, dinamik modelin, parametreli hale getirilmiş tipler, yapısal tipler ve tip çıkarımı olan statik bir dilde bile kesin avantajlara sahip olduğunu göstermektedir .