Dynamic Language Runtime
Dynamic Language Runtime (DLR) – projekt firmy Microsoft mający na celu stworzenie zestawu usług zbudowanych na bazie Common Language Runtime (CLR) wspomagających tworzenie i wykonywanie różnych dynamicznych języków programowania oraz ich integrację z platformą .NET Framework.
Usługi te to:
- Dynamiczny system typów, współdzielony pomiędzy wszystkie implementacje języków wykorzystujących DLR.
- Expression Trees, czyli dynamiczne drzewa wyrażeń reprezentujące semantykę danego języka.
- Call Site Caching, czyli mechanizm pamięci podręcznej przyspieszający operacje wykonywane na obiektach o dynamicznych typach danych, zazwyczaj poprzez zapamiętywanie cech tych obiektów (najczęściej ich typów danych).
- Dynamic Object Interoperability, to zestaw klas i interfejsów reprezentujących dynamiczny obiekt i operacje na nim, które mogą być użyte przez programistów implementujących kolejne dynamiczne języki programowania.
- API pozwalające na osadzanie (hosting) dynamicznych języków we własnych aplikacjach.
Główne zalety DLR:
- Uproszczenie tworzenia kolejnych implementacji dynamicznych języków programowania wykonywanych poprzez CLR.
- Rozszerzenie istniejących statycznie typowanych języków programowania, takich jak C#, czy Visual Basic .NET, o wybrane cechy dynamicznych języków programowania.
- Niezależność od środowiska uruchomieniowego CLR. Jeżeli w przyszłej wersji platformy .NET zostanie usprawniony np. garbage collector, wszystkie języki uruchamiane na tej platformie automatycznie będą mogły skorzystać z tego usprawnienia.
- Możliwość współdzielenia bibliotek i obiektów. Dzięki DLR każdy typ danych stworzony w dowolnym języku programowania wykonywanym za pomocą środowiska uruchomieniowego CLR jest ze sobą kompatybilny. Obiekt stworzony w języku IronPython może być wykorzystany w języku C# bez żadnych dodatkowych warstw pośredniczących oraz konwersji typów danych.
- DLR przyczyniło się do stworzenia na platformie .NET Framework szybkich implementacji mechanizmów typu dynamic dispatch oraz dynamic invocation, zapewniających wydajne wytkonywanie dynamicznych operacji poprzez zastosowanie polimorficznej pamięci podręcznej.
Mechanizmy zawarte w DLR zostały użyte do tej pory przy implementacjach języków IronPython oraz IronRuby. DLR jest również częścią platformy .NET Framework w wersji 4.0, oferując wsparcie dla wybranych możliwości dynamicznych języków programowania w sztandarowych, statycznie typowanych językach, takich jak C#, czy Visual Basic.NET.
Najnowsza wersja bibliotek DLR została przez firmę Microsoft przekazana w ręce społeczności i jest rozprowadzana na licencji Apache License, v2.0. DLR będzie również rozwijany niezależnie przez zespół odpowiedzialny za rozwój platformy .NET Framework, w celu zapewnienia wsparcia dla większej ilości możliwości, oferowanych przez dynamiczne języki programowania.
Przykład integracji dynamicznego języka IronPython oraz statycznie typowanego języka C#:
using System; using System.Linq; using IronPython.Hosting; using Microsoft.Scripting.Hosting; namespace CallingPythonLib { class Program { static void Main(string[] args) { // ustawienie ścieżki do bibliotek języka Python System.IO.Directory.SetCurrentDirectory(@"C:\Program Files (x86)\IronPython 2.7\Lib\"); ScriptRuntime py = Python.CreateRuntime(); // utworzenie obiektu reprezentującego typ danych zdefiniowany w języku Python dynamic random = py.UseFile("random.py"); int[] items = Enumerable.Range(1, 7).ToArray(); // wywołanie metody dynamicznego typu Random random.shuffle(items); foreach (int item in items) { Console.WriteLine(item); } } } }