Share via


Overzicht van dynamische taalruntime

De DYNAMIC Language Runtime (DLR) is een runtime-omgeving waarmee een set services voor dynamische talen wordt toegevoegd aan de Common Language Runtime (CLR). De DLR maakt het eenvoudiger om dynamische talen te ontwikkelen om op .NET uit te voeren en dynamische functies toe te voegen aan statisch getypte talen.

Dynamische talen kunnen het type van een object tijdens runtime identificeren, terwijl u in statisch getypte talen zoals C# en Visual Basic (wanneer u gebruikt Option Explicit On), u objecttypen op het ontwerptijd moet opgeven. Voorbeelden van dynamische talen zijn Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFus, Lua, Cobra en Groovy.

De meeste dynamische talen bieden de volgende voordelen voor ontwikkelaars:

  • De mogelijkheid om een snelle feedbacklus (REPL of read-evaluate-printlus) te gebruiken. Hiermee kunt u verschillende instructies invoeren en deze onmiddellijk uitvoeren om de resultaten te bekijken.
  • Ondersteuning voor zowel top-down-ontwikkeling als meer traditionele bottom-up ontwikkeling. Wanneer u bijvoorbeeld een top-down benadering gebruikt, kunt u functies aanroepen die nog niet zijn geïmplementeerd en vervolgens onderliggende implementaties toevoegen wanneer u ze nodig hebt.
  • Eenvoudiger herstructureren en codewijzigingen, omdat u geen statische typedeclaraties hoeft te wijzigen in de code.

Dynamische talen zijn uitstekende scripttalen. Klanten kunnen eenvoudig toepassingen uitbreiden die zijn gemaakt met behulp van dynamische talen met nieuwe opdrachten en functionaliteit. Dynamische talen worden ook vaak gebruikt voor het maken van websites en testmogelijkheden, het onderhouden van serverfarms, het ontwikkelen van verschillende hulpprogramma's en het uitvoeren van gegevenstransformaties.

Het doel van de DLR is om een systeem van dynamische talen uit te voeren op .NET en hen .NET-interoperabiliteit te bieden. De DLR voegt dynamische objecten toe aan C# en Visual Basic om dynamisch gedrag in deze talen te ondersteunen en hun samenwerking met dynamische talen mogelijk te maken.

De DLR helpt u ook bij het maken van bibliotheken die dynamische bewerkingen ondersteunen. Als u bijvoorbeeld een bibliotheek hebt die gebruikmaakt van XML- of JSON-objecten (JavaScript Object Notation), kunnen uw objecten worden weergegeven als dynamische objecten in talen die gebruikmaken van de DLR. Hierdoor kunnen bibliotheekgebruikers syntactisch eenvoudigere en natuurlijkere code schrijven voor het werken met objecten en het openen van objectleden.

U kunt bijvoorbeeld de volgende code gebruiken om een teller in XML in C# te verhogen.

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

Met de DLR kunt u in plaats daarvan de volgende code gebruiken voor dezelfde bewerking.

scriptobj.Count += 1;

Net als de CLR maakt de DLR deel uit van .NET. Het is beschikbaar voor download in de IronLanguages/dlr-opslagplaats op GitHub.

IronPython is een voorbeeld van een taal die is ontwikkeld met behulp van de DLR.

Primaire DLR-voordelen

De DLR biedt de volgende voordelen.

Vereenvoudigt het overzetten van dynamische talen naar .NET

Met de DLR kunnen taalikkers voorkomen dat lexicale analyses, parsers, semantische analyses, codegeneratoren en andere hulpprogramma's worden gemaakt die ze traditioneel zelf moesten maken. Als u de DLR wilt gebruiken, moet een taal expressiestructuren produceren die code op taalniveau vertegenwoordigen in een structuur in structuur, runtime-helperroutines en optionele dynamische objecten waarmee de IDynamicMetaObjectProvider interface wordt geïmplementeerd. De DLR en .NET automatiseren veel codeanalyse- en codegeneratietaken. Hierdoor kunnen taaluitvoerders zich concentreren op unieke taalfuncties.

Hiermee schakelt u dynamische functies in statisch getypte talen in

Bestaande .NET-talen zoals C# en Visual Basic kunnen dynamische objecten maken en deze samen met statisch getypte objecten gebruiken. C# en Visual Basic kunnen bijvoorbeeld dynamische objecten gebruiken voor HTML, Document Object Model (DOM) en weerspiegeling.

Biedt toekomstige voordelen van dlr en .NET

Talen die zijn geïmplementeerd met de DLR, kunnen profiteren van toekomstige DLR- en .NET-verbeteringen. Als .NET bijvoorbeeld een nieuwe versie publiceert met een verbeterde garbagecollector of een snellere laadtijd voor assembly's, krijgen talen die zijn geïmplementeerd met de DLR onmiddellijk hetzelfde voordeel. Als de DLR optimalisaties toevoegt, zoals betere compilatie, worden de prestaties ook verbeterd voor alle talen die zijn geïmplementeerd met behulp van de DLR.

Hiermee kunt u bibliotheken en objecten delen

De objecten en bibliotheken die in één taal zijn geïmplementeerd, kunnen door andere talen worden gebruikt. De DLR maakt ook interoperation mogelijk tussen statisch getypte en dynamische talen. C# kan bijvoorbeeld een dynamisch object declareren dat gebruikmaakt van een bibliotheek die in een dynamische taal is geschreven. Tegelijkertijd kunnen dynamische talen gebruikmaken van bibliotheken uit .NET Framework.

Biedt snelle dynamische verzending en aanroep

De DLR biedt een snelle uitvoering van dynamische bewerkingen door geavanceerde polymorfe caching te ondersteunen. De DLR maakt regels voor bindingsbewerkingen die gebruikmaken van objecten voor de benodigde runtime-implementaties en slaat deze regels vervolgens in de cache op om resourceuitputtende bindingberekeningen te voorkomen tijdens opeenvolgende uitvoeringen van dezelfde code op dezelfde typen objecten.

DLR-architectuur

De DLR voegt een set services toe aan de CLR voor betere ondersteuning van dynamische talen. Deze services omvatten het volgende:

  • Expressiestructuren. De DLR gebruikt expressiestructuren om taalsemantiek weer te geven. Voor dit doel heeft de DLR linq-expressiestructuren uitgebreid om controlestroom, toewijzing en andere taalmodelleringsknooppunten op te nemen. Zie Expression Trees (C#) of Expression Trees (Visual Basic) voor meer informatie.

  • Site opslaan in cache aanroepen. Een dynamische aanroepsite is een plaats in de code waar u een bewerking uitvoert zoals a + b of a.b() op dynamische objecten. De DLR slaat de kenmerken van a en b (meestal de typen van deze objecten) en informatie over de bewerking op. Als een dergelijke bewerking eerder is uitgevoerd, haalt de DLR alle benodigde informatie op uit de cache voor snelle verzending.

  • Dynamische objectinteroperabiliteit. De DLR biedt een set klassen en interfaces die dynamische objecten en bewerkingen vertegenwoordigen en kan worden gebruikt door taaluitvoerders en auteurs van dynamische bibliotheken. Deze klassen en interfaces omvatten IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjecten ExpandoObject.

De DLR maakt gebruik van binders in oproepsites om niet alleen te communiceren met .NET, maar ook met andere infrastructuren en services, zoals COM. Binders kapselen de semantiek van een taal in en geven aan hoe bewerkingen in een oproepsite moeten worden uitgevoerd met behulp van expressiestructuren. Hierdoor kunnen dynamische en statisch getypte talen die gebruikmaken van de DLR bibliotheken delen en toegang krijgen tot alle technologieën die de DLR ondersteunt.

DLR-documentatie

Zie de documentatie over de IronLanguages/dlr-opslagplaats op GitHub voor meer informatie over het gebruik van de open source-versie van de DLR om dynamisch gedrag toe te voegen aan een taal of over het inschakelen van het gebruik van een dynamische taal met .NET.

Zie ook