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);
}
}
}
}