Dinamik dil çalışma zamanına genel bakış

Dinamik dil çalışma zamanı (DLR), ortak dil çalışma zamanına (CLR) dinamik diller için bir hizmet kümesi ekleyen bir çalışma zamanı ortamıdır. DLR, .NET üzerinde çalışacak dinamik diller geliştirmeyi ve statik olarak yazılan dillere dinamik özellikler eklemeyi kolaylaştırır.

Dinamik diller çalışma zamanında bir nesnenin türünü tanımlayabilirken, C# ve Visual Basic gibi statik olarak yazılan dillerde (kullandığınızda Option Explicit On), tasarım zamanında nesne türlerini belirtmeniz gerekir. Dinamik dillere örnek olarak Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra ve Groovy verilebilir.

Çoğu dinamik dil, geliştiriciler için aşağıdaki avantajları sağlar:

  • Hızlı geri bildirim döngüsü (REPL veya read-evaluate-print döngüsü) kullanma olanağı. Bu, birkaç deyim girmenize ve sonuçları görmek için bunları hemen yürütmenize olanak tanır.
  • Hem yukarıdan aşağıya geliştirme hem de daha geleneksel aşağıdan yukarı geliştirme desteği. Örneğin, yukarıdan aşağıya bir yaklaşım kullandığınızda, henüz uygulanmamış işlevleri çağırabilir ve sonra ihtiyacınız olduğunda temel alınan uygulamaları ekleyebilirsiniz.
  • Kodun tamamında statik tür bildirimlerini değiştirmeniz gerekmeyen, daha kolay yeniden düzenleme ve kod değişiklikleri.

Dinamik diller mükemmel betik oluşturma dilleridir. Müşteriler, dinamik dilleri kullanarak oluşturulan uygulamaları yeni komutlar ve işlevlerle kolayca genişletebilir. Dinamik diller ayrıca web siteleri ve test koşumları oluşturmak, sunucu gruplarında bakım yapmak, çeşitli yardımcı programlar geliştirmek ve veri dönüştürmeleri gerçekleştirmek için de sıklıkla kullanılır.

DLR'nin amacı dinamik dillerden oluşan bir sistemin .NET üzerinde çalışmasını sağlamak ve onlara .NET birlikte çalışabilirliği sağlamaktır. DLR, bu dillerde dinamik davranışı desteklemek ve bunların dinamik dillerle birlikte çalışmasını sağlamak için C# ve Visual Basic'e dinamik nesneler ekler.

DLR, dinamik işlemleri destekleyen kitaplıklar oluşturmanıza da yardımcı olur. Örneğin, XML veya JavaScript Nesne Gösterimi (JSON) nesneleri kullanan bir kitaplığınız varsa, nesneleriniz DLR kullanan dillerde dinamik nesneler olarak görünebilir. Bu, kitaplık kullanıcılarının nesnelerle çalışmak ve nesne üyelerine erişmek için daha basit ve daha doğal kodlar yazmasına olanak tanır.

Örneğin, C# dilinde XML'de bir sayacı artırmak için aşağıdaki kodu kullanabilirsiniz.

Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

DLR kullanarak, aynı işlem için bunun yerine aşağıdaki kodu kullanabilirsiniz.

scriptobj.Count += 1;

CLR gibi DLR de .NET'in bir parçasıdır. GitHub'daki IronLanguages/dlr deposundan indirilebilir.

IronPython , DLR kullanılarak geliştirilen bir dil örneğidir.

Birincil DLR avantajları

DLR aşağıdaki avantajları sağlar.

Dinamik dilleri .NET'e taşımayı kolaylaştırır

DLR, dil uygulayıcılarının sözcük temelli çözümleyiciler, ayrıştırıcılar, semantik çözümleyiciler, kod oluşturucular ve geleneksel olarak kendilerinin oluşturması gereken diğer araçlar oluşturmaktan kaçınmasına olanak tanır. DLR'yi kullanmak için bir dilin, ağaç şeklindeki bir yapıda dil düzeyinde kodu, çalışma zamanı yardımcı yordamlarını ve arabirimi uygulayan isteğe bağlı dinamik nesneleri temsil eden ifade ağaçları üretmesi IDynamicMetaObjectProvider gerekir. DLR ve .NET birçok kod analizi ve kod oluşturma görevini otomatikleştirir. Bu, dil uygulayıcılarının benzersiz dil özelliklerine odaklanmasını sağlar.

Statik olarak yazılan dillerde dinamik özellikleri etkinleştirir

C# ve Visual Basic gibi mevcut .NET dilleri dinamik nesneler oluşturabilir ve bunları statik olarak yazılan nesnelerle birlikte kullanabilir. Örneğin, C# ve Visual Basic HTML, Belge Nesne Modeli (DOM) ve yansıma için dinamik nesneler kullanabilir.

DLR ve .NET'in gelecekteki avantajlarını sağlar

DLR kullanılarak uygulanan diller, gelecekteki DLR ve .NET geliştirmelerinden yararlanabilir. Örneğin, .NET iyileştirilmiş çöp toplayıcısı veya daha hızlı derleme yükleme süresine sahip yeni bir sürüm yayınlarsa, DLR kullanılarak uygulanan diller hemen aynı avantajı elde eder. DLR daha iyi derleme gibi iyileştirmeler eklerse, DLR kullanılarak uygulanan tüm diller için performans da artar.

Kitaplıkların ve nesnelerin paylaşımını etkinleştirir

Bir dilde uygulanan nesneler ve kitaplıklar diğer diller tarafından kullanılabilir. DLR, statik olarak yazılan ve dinamik diller arasında birlikte çalışma olanağı da sağlar. Örneğin, C# dinamik dilde yazılmış bir kitaplık kullanan dinamik bir nesne bildirebilir. Aynı zamanda, dinamik diller .NET Framework'ten kitaplıkları kullanabilir.

Hızlı dinamik gönderim ve çağırma sağlar

DLR, gelişmiş polimorfik önbelleğe almayı destekleyerek dinamik işlemlerin hızlı yürütülmesini sağlar. DLR, nesneleri gerekli çalışma zamanı uygulamalarına kullanan bağlama işlemleri için kurallar oluşturur ve ardından aynı kodun aynı nesne türleri üzerinde ardışık yürütmeleri sırasında kaynak tüketen bağlama hesaplamalarını önlemek için bu kuralları önbelleğe alır.

DLR mimarisi

DLR, dinamik dilleri daha iyi desteklemek için CLR'ye bir hizmet kümesi ekler. Bu hizmetler aşağıdakileri içerir:

  • İfade ağaçları. DLR, dil semantiğini temsil etmek için ifade ağaçlarını kullanır. Bu amaçla DLR, denetim akışı, atama ve diğer dil modelleme düğümlerini içerecek şekilde LINQ ifade ağaçlarını genişletmiştir. Daha fazla bilgi için bkz . İfade Ağaçları (C#) veya İfade Ağaçları (Visual Basic).

  • Arama sitesi önbelleğe alma. Dinamik çağrı sitesi, kodda veya dinamik a + ba.b() nesneler üzerinde bir işlem gerçekleştirdiğiniz yerdir. DLR, ve b özelliklerinin a (genellikle bu nesnelerin türleri) ve işlem hakkındaki bilgileri önbelleğe alır. Böyle bir işlem daha önce gerçekleştirildiyse, DLR hızlı dağıtım için önbellekten gerekli tüm bilgileri alır.

  • Dinamik nesne birlikte çalışabilirliği. DLR, dinamik nesneleri ve işlemleri temsil eden bir dizi sınıf ve arabirim sağlar ve dinamik kitaplıkların dil uygulayıcıları ve yazarları tarafından kullanılabilir. Bu sınıflar ve arabirimler arasında IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjectve ExpandoObjectbulunur.

DLR, arama sitelerindeki bağlayıcıları kullanarak yalnızca .NET ile değil, COM gibi diğer altyapılar ve hizmetlerle de iletişim kurar. Bağlayıcılar bir dilin semantiğini kapsüller ve ifade ağaçlarını kullanarak bir çağrı sitesinde işlemlerin nasıl gerçekleştirileceğini belirtir. Bu, kitaplıkları paylaşmak ve DLR'nin desteklediği tüm teknolojilere erişim kazanmak için DLR kullanan dinamik ve statik olarak yazılan dilleri etkinleştirir.

DLR belgeleri

DLR'nin açık kaynak sürümünü kullanarak bir dile dinamik davranış ekleme veya .NET ile dinamik dil kullanımını etkinleştirme hakkında daha fazla bilgi için GitHub'da IronLanguages/dlr deposundaki belgelere bakın.

Ayrıca bkz.