Dinamikus nyelvi futtatókörnyezet áttekintése

A dinamikus nyelvi futtatókörnyezeti (DLR) olyan futtatókörnyezet, amely dinamikus nyelvekhez készült szolgáltatásokat ad hozzá a közös nyelvi futtatókörnyezethez (CLR). A DLR megkönnyíti a dinamikus nyelvek fejlesztését a .NET való futtatáshoz, valamint dinamikus funkciók hozzáadását a statikusan beírt nyelvekhez.

A dinamikus nyelvek futásidőben azonosíthatják az objektumok típusát, míg statikusan beírt nyelvekben, például a C# és a Visual Basic (Option Explicit On használatakor) a tervezéskor meg kell adnia az objektumtípusokat. Dinamikus nyelvek például a Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra és Groovy.

A legtöbb dinamikus nyelv a következő előnyöket nyújtja a fejlesztők számára:

  • A gyors visszacsatolási ciklus (REPL vagy read-evaluate-print loop) használatának képessége. Ez lehetővé teszi, hogy több utasítást adjon meg, és azonnal végrehajtsa őket az eredmények megtekintéséhez.
  • A felülről lefelé irányuló és a hagyományosabb alulról felfelé irányuló fejlesztés támogatása. Ha például felülről lefelé irányuló megközelítést használ, meghívhatja a még nem implementált függvényeket, majd szükség esetén hozzáadhat mögöttes implementációkat.
  • Egyszerűbb újrabontás és kódmódosítások, mert nem kell módosítania a statikus típusdeklarációkat a kódban.

A dinamikus nyelvek kiváló szkriptnyelvek. Az ügyfelek egyszerűen bővíthetik a dinamikus nyelvek használatával létrehozott alkalmazásokat új parancsokkal és funkciókkal. A dinamikus nyelveket gyakran használják webhelyek létrehozására és biztonsági övek tesztelésére, kiszolgálófarmok karbantartására, különböző segédprogramok fejlesztésére és adatátalakításokra.

A DLR célja, hogy lehetővé tegye a dinamikus nyelvek rendszerének .NET való futtatását, és .NET interoperabilitást biztosít számukra. A DLR dinamikus objektumokat ad hozzá a C#-hoz és Visual Basic a dinamikus viselkedés támogatásához ezeken a nyelveken, és lehetővé teszi a dinamikus nyelvekkel való együttműködésüket.

A DLR segít a dinamikus műveleteket támogató kódtárak létrehozásában is. Ha például xml vagy JavaScript Object Notation (JSON) objektumokat használó tára van, az objektumok dinamikus objektumként jelenhetnek meg a DLR-t használó nyelvek számára. Ez lehetővé teszi, hogy a kódtár felhasználói szintaktikailag egyszerűbb és természetesebb kódot írjanak az objektumokkal való működéshez és az objektumtagokhoz való hozzáféréshez.

Előfordulhat például, hogy a következő kóddal növeli a számlálót XML-ben C# nyelven.

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

A DLR használatával az alábbi kódot használhatja ugyanahhoz a művelethez.

scriptobj.Count += 1;

A CLR-hez hasonlóan a DLR is a .NET része. Letölthető a IronLanguages/dlr adattárból GitHub.

IronPython egy példa egy nyelvre, amelyet a DLR használatával fejlesztettek ki.

Elsődleges DLR-előnyök

A DLR a következő előnyöket biztosítja.

A dinamikus nyelvek .NET rendszerhez való átültetését leegyszerűsíti

A DLR lehetővé teszi a nyelvi implementátorok számára, hogy elkerüljék a lexikális elemzők, elemzők, szemantikai elemzők, kódgenerátorok és más eszközök létrehozását, amelyeket hagyományosan maguknak kellett létrehozniuk. A DLR használatához a nyelvnek kifejezésfákat kell létrehoznia, amelyek a fa alakú szerkezet nyelvszintű kódját, a futásidejű segédprogramokat és az IDynamicMetaObjectProvider interfészt implementáló opcionális dinamikus objektumokat jelölik. A DLR és a .NET számos kódelemzési és kódgenerálási feladatot automatizálnak. Ez lehetővé teszi, hogy a nyelv implementálói az egyedi nyelvi funkciókra összpontosítsanak.

Dinamikus funkciók engedélyezése statikusan gépelt nyelvekben

A meglévő .NET nyelvek, például a C# és a Visual Basic dinamikus objektumokat hozhatnak létre, és statikusan beírt objektumokkal együtt használhatják őket. A C# és a Visual Basic például dinamikus objektumokat használhat a HTML, a Dokumentumobjektum-modell (DOM) és a tükröződés számára.

A DLR és a .NET jövőbeli előnyeit biztosítja

A DLR használatával implementált nyelvek kihasználhatják a DLR jövőbeli előnyeit és .NET fejlesztéseket. Ha például a .NET olyan új verziót ad ki, amely továbbfejlesztett szemétgyűjtővel vagy gyorsabb összetevő-betöltési idővel rendelkezik, a DLR segítségével implementált nyelvek azonnal ugyanazt az előnyt élvezik. Ha a DLR optimalizálásokat, például jobb fordítást ad hozzá, a teljesítmény a DLR használatával implementált összes nyelv esetében is javul.

Tárak és objektumok megosztásának engedélyezése

Az egy nyelven implementált objektumokat és kódtárakat más nyelvek is használhatják. A DLR lehetővé teszi a statikusan beírt és a dinamikus nyelvek közötti interoperációt is. A C# például deklarálhat egy dinamikus nyelven írt kódtárat használó dinamikus objektumot. A dinamikus nyelvek ugyanakkor a .NET-keretrendszer kódtárait is használhatják.

Gyors dinamikus kézbesítést és meghívást biztosít

A DLR a fejlett polimorf gyorsítótárazás támogatásával biztosítja a dinamikus műveletek gyors végrehajtását. A DLR szabályokat hoz létre olyan kötési műveletekhez, amelyek objektumokat használnak a szükséges futtatókörnyezeti implementációkhoz, majd gyorsítótárazza ezeket a szabályokat, hogy elkerülje az erőforrás-kimerítő kötési számításokat ugyanazon kód ugyanazon típusú objektumok egymást követő végrehajtása során.

DLR-architektúra

A DLR szolgáltatáskészletet ad hozzá a CLR-hez a dinamikus nyelvek jobb támogatása érdekében. Ezek a szolgáltatások a következők:

  • Kifejezésfák. A DLR kifejezésfákkal jelöli a nyelvi szemantikát. Erre a célra a DLR kiterjesztett LINQ-kifejezésfákkal rendelkezik, hogy a vezérlőfolyamatokat, hozzárendeléseket és más nyelvmodellező csomópontokat is magában foglalja. További információ: Expression Trees (C#) vagy Expression Trees (Visual Basic).

  • Híváswebhely gyorsítótárazása. A dinamikus hívási hely a kód azon helye, ahol egy műveletet hajt végre, például a + b vagy a.b() dinamikus objektumokon. A DLR gyorsítótárazza a a és a b jellemzőit (általában az ilyen objektumok típusait), valamint a művelettel kapcsolatos információkat. Ha korábban már végrehajtottak ilyen műveletet, a DLR lekéri az összes szükséges információt a gyorsítótárból a gyors kézbesítéshez.

  • Dinamikus objektum-együttműködés. A DLR olyan osztályokat és interfészeket biztosít, amelyek dinamikus objektumokat és műveleteket képviselnek, és amelyeket a nyelv implementálói és a dinamikus kódtárak szerzői használhatnak. Ezek az osztályok és felületek közé tartozik a IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjectés ExpandoObject.

A DLR kötőanyagokat használ a híváshelyeken, hogy ne csak .NET, hanem más infrastruktúrákkal és szolgáltatásokkal, például a COM-val is kommunikáljon. A kötőanyagok beágyaznak egy nyelv szemantikáját, és megadják, hogyan hajthat végre műveleteket a hívási helyeken kifejezésfák használatával. Ez lehetővé teszi a DLR-t használó dinamikus és statikusan gépelt nyelvek számára a kódtárak megosztását és a DLR által támogatott összes technológia elérését.

A DLR dokumentációja

A DLR nyílt forráskód verziójának a dinamikus viselkedés nyelvhez való hozzáadásáról, illetve a dinamikus nyelv .NET való használatának engedélyezéséről a IronLanguages/dlr adattár dokumentációjában talál további információt a GitHub.

Lásd még: