Dela via


Översikt över körning av dynamiskt språk

DLR (Dynamic Language Runtime) är en körningsmiljö som lägger till en uppsättning tjänster för dynamiska språk till CLR (Common Language Runtime). DLR gör det enklare att utveckla dynamiska språk för körning på .NET och lägga till dynamiska funktioner i statiskt typade språk.

Dynamiska språk kan identifiera typen av ett objekt vid körning, medan du i statiskt skrivna språk som C# och Visual Basic (när du använder Option Explicit On) måste ange objekttyper vid designtillfället. Exempel på dynamiska språk är Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra och Groovy.

De flesta dynamiska språk ger följande fördelar för utvecklare:

  • Möjligheten att använda en snabb feedbackloop (REPL eller read-evaluate-print loop). På så sätt kan du ange flera instruktioner och omedelbart köra dem för att se resultatet.
  • Stöd för både utveckling uppifrån och ned och mer traditionell utveckling nedifrån och upp. När du till exempel använder en top-down-metod kan du anropa funktioner som ännu inte har implementerats och sedan lägga till underliggande implementeringar när du behöver dem.
  • Enklare refaktorisering och kodändringar eftersom du inte behöver ändra statiska typdeklarationer i hela koden.

Dynamiska språk är utmärkta skriptspråk. Kunder kan enkelt utöka program som skapats med hjälp av dynamiska språk med nya kommandon och funktioner. Dynamiska språk används också ofta för att skapa webbplatser och testselar, underhålla servergrupper, utveckla olika verktyg och utföra datatransformeringar.

Syftet med DLR är att göra det möjligt för ett system med dynamiska språk att köras på .NET och ge dem .NET-samverkan. DLR lägger till dynamiska objekt i C# och Visual Basic för att stödja dynamiskt beteende på dessa språk och aktivera deras samverkan med dynamiska språk.

DLR hjälper dig också att skapa bibliotek som stöder dynamiska åtgärder. Om du till exempel har ett bibliotek som använder XML- eller JavaScript Object Notation-objekt (JSON) kan dina objekt visas som dynamiska objekt för språk som använder DLR. På så sätt kan biblioteksanvändare skriva syntaktiskt enklare och mer naturlig kod för att arbeta med objekt och komma åt objektmedlemmar.

Du kan till exempel använda följande kod för att öka en räknare i XML i C#.

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

Genom att använda DLR kan du använda följande kod i stället för samma åtgärd.

scriptobj.Count += 1;

Liksom CLR är DLR en del av .NET. Den är tillgänglig för nedladdning på IronLanguages/dlr-lagringsplatsen på GitHub.

IronPython är ett exempel på ett språk som utvecklades med hjälp av DLR.

Primära DLR-fördelar

DLR ger följande fördelar.

Förenklar portning av dynamiska språk till .NET

DLR gör det möjligt för språkimplementerare att undvika att skapa lexikala analysverktyg, parsare, semantiska analysverktyg, kodgeneratorer och andra verktyg som de traditionellt var tvungna att skapa själva. För att kunna använda DLR måste ett språk skapa uttrycksträd som representerar kod på språknivå i en trädformad struktur, körningshjälprutiner och valfria dynamiska objekt som implementerar IDynamicMetaObjectProvider gränssnittet. DLR och .NET automatiserar många uppgifter för kodanalys och kodgenerering. Detta gör det möjligt för språkverktyg att koncentrera sig på unika språkfunktioner.

Aktiverar dynamiska funktioner i statiskt skrivna språk

Befintliga .NET-språk som C# och Visual Basic kan skapa dynamiska objekt och använda dem tillsammans med statiskt skrivna objekt. C# och Visual Basic kan till exempel använda dynamiska objekt för HTML, Dokumentobjektmodell (DOM) och reflektion.

Ger framtida fördelar med DLR och .NET

Språk som implementeras med hjälp av DLR kan dra nytta av framtida förbättringar av DLR och .NET. Om .NET till exempel släpper en ny version som har en förbättrad skräpinsamlare eller snabbare inläsningstid för sammansättning, får språk som implementeras med hjälp av DLR omedelbart samma fördel. Om DLR lägger till optimeringar, till exempel bättre kompilering, förbättras även prestandan för alla språk som implementeras med hjälp av DLR.

Möjliggör delning av bibliotek och objekt

Objekten och biblioteken som implementeras på ett språk kan användas av andra språk. DLR möjliggör också samverkan mellan statiskt typade och dynamiska språk. C# kan till exempel deklarera ett dynamiskt objekt som använder ett bibliotek som är skrivet på ett dynamiskt språk. Samtidigt kan dynamiska språk använda bibliotek från .NET Framework.

Ger snabb dynamisk sändning och anrop

DLR ger snabb körning av dynamiska åtgärder genom att stödja avancerad polymorf cachelagring. DLR skapar regler för bindningsåtgärder som använder objekt till nödvändiga körningsimplementeringar och cachelagrar sedan dessa regler för att undvika resursutmattande bindningsberäkningar under efterföljande körningar av samma kod på samma typer av objekt.

DLR-arkitektur

DLR lägger till en uppsättning tjänster till CLR för bättre stöd för dynamiska språk. Dessa tjänster omfattar följande:

  • Uttrycksträd. DLR använder uttrycksträd för att representera språksemantik. För det här ändamålet har DLR utökade LINQ-uttrycksträd för att inkludera kontrollflöde, tilldelning och andra språkmodelleringsnoder. Mer information finns i Uttrycksträd (C#) eller Uttrycksträd (Visual Basic).

  • Anropa webbplatscachelagring. En dynamisk anropswebbplats är en plats i koden där du utför en åtgärd som a + b eller a.b() på dynamiska objekt. DLR cachelagrar egenskaperna för a och b (vanligtvis typerna av dessa objekt) och information om åtgärden. Om en sådan åtgärd har utförts tidigare hämtar DLR all nödvändig information från cachen för snabb sändning.

  • Dynamisk objektsamverkans. DLR tillhandahåller en uppsättning klasser och gränssnitt som representerar dynamiska objekt och åtgärder och kan användas av språkimplementerare och författare till dynamiska bibliotek. Dessa klasser och gränssnitt är IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjectoch ExpandoObject.

DLR använder pärmar på anropsplatser för att kommunicera inte bara med .NET, utan med andra infrastrukturer och tjänster, till exempel COM. Binders kapslar in ett språks semantik och anger hur åtgärder ska utföras på en anropsplats med hjälp av uttrycksträd. Detta möjliggör dynamiska och statiskt skrivna språk som använder DLR för att dela bibliotek och få åtkomst till alla tekniker som DLR stöder.

DLR-dokumentation

Mer information om hur du använder den öppen källkod versionen av DLR för att lägga till dynamiskt beteende i ett språk eller om hur du aktiverar användning av ett dynamiskt språk med .NET finns i dokumentationen på lagringsplatsen IronLanguages/dlr på GitHub.

Se även