동적 언어 런타임 개요
DLR(동적 언어 런타임)은 CLR(공용 언어 런타임)에 동적 언어에 대한 서비스 집합을 추가하는 런타임 환경입니다. DLR을 사용하면 .NET에서 실행할 동적 언어를 쉽게 개발하고 정적으로 형식화된 언어에 동적 기능을 추가할 수 있습니다.
동적 언어는 런타임에 개체의 형식을 식별할 수 있지만 C# 및 Visual Basic과 같은 정적으로 형식화된 언어(Option Explicit On
사용하는 경우)에서는 디자인 타임에 개체 형식을 지정해야 합니다. 동적 언어의 예로는 Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra 및 Groovy가 있습니다.
대부분의 동적 언어는 개발자에게 다음과 같은 이점을 제공합니다.
- 빠른 피드백 루프(REPL, 또는 읽기-평가-출력 루프)를 사용할 수 있는 기능입니다. 이렇게 하면 여러 문을 입력하고 즉시 실행하여 결과를 볼 수 있습니다.
- 하향식 개발과 보다 전통적인 상향식 개발을 모두 지원합니다. 예를 들어 하향식 방법을 사용하는 경우 아직 구현되지 않은 함수를 호출한 다음 필요할 때 기본 구현을 추가할 수 있습니다.
- 코드 전체에서 정적 형식 선언을 변경할 필요가 없으므로 보다 쉽게 리팩터링하고 코드를 수정할 수 있습니다.
동적 언어는 뛰어난 스크립팅 언어를 만듭니다. 고객은 새 명령 및 기능과 함께 동적 언어를 사용하여 만든 애플리케이션을 쉽게 확장할 수 있습니다. 동적 언어는 웹 사이트 및 테스트 하네스를 만들고, 서버 팜을 유지 관리하고, 다양한 유틸리티를 개발하고, 데이터 변환을 수행하는 데도 자주 사용됩니다.
DLR의 목적은 .NET에서 동적 언어 시스템을 실행하고 .NET 상호 운용성을 제공하는 것입니다. DLR은 C# 및 Visual Basic에 동적 개체를 추가하여 이러한 언어의 동적 동작을 지원하고 동적 언어와의 상호 운용을 사용하도록 설정합니다.
또한 DLR을 사용하면 동적 작업을 지원하는 라이브러리를 만들 수 있습니다. 예를 들어, XML 또는 JSON(JavaScript Object Notation) 개체를 사용하는 라이브러리가 있는 경우, 이러한 개체는 DLR을 사용하는 언어에서는 동적 개체로 나타날 수 있습니다. 이렇게 하면 라이브러리 사용자가 개체를 사용하여 작동하고 개체 멤버에 액세스하기 위한 구문적으로 더 간단하고 자연스러운 코드를 작성할 수 있습니다.
예를 들어 다음 코드를 사용하여 C#의 XML에서 카운터를 증분할 수 있습니다.
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
DLR을 사용하면 동일한 작업에 다음 코드를 대신 사용할 수 있습니다.
scriptobj.Count += 1;
CLR과 마찬가지로 DLR은 .NET의 일부입니다. GitHub의 IronLanguages/dlr 리포지토리에서 다운로드할 수 있습니다.
IronPython DLR을 사용하여 개발된 언어의 예입니다.
기본 DLR 이점
DLR은 다음과 같은 이점을 제공합니다.
동적 언어를 .NET으로 이식 간소화
DLR을 사용하면 언어 구현자가 어휘 분석기, 파서, 의미 체계 분석기, 코드 생성기 및 기존에 직접 만들어야 했던 기타 도구를 만들지 않도록 할 수 있습니다. DLR을 사용하려면 언어가 트리 모양의 구조, 런타임 도우미 루틴 및 IDynamicMetaObjectProvider 인터페이스를 구현하는 선택적 동적 개체의 언어 수준 코드를 나타내는 식 트리생성해야 합니다. DLR 및 .NET은 많은 코드 분석 및 코드 생성 작업을 자동화합니다. 이를 통해 언어 구현자는 고유한 언어 기능에 집중할 수 있습니다.
정적으로 형식화된 언어로 동적 기능을 사용하도록 설정
C# 및 Visual Basic과 같은 기존 .NET 언어는 동적 개체를 만들고 정적으로 형식화된 개체와 함께 사용할 수 있습니다. 예를 들어 C# 및 Visual Basic은 HTML, DOM(문서 개체 모델) 및 리플렉션에 동적 개체를 사용할 수 있습니다.
DLR 및 .NET의 향후 이점 제공
DLR을 사용하여 구현된 언어는 향후 DLR 및 .NET 개선의 이점을 얻을 수 있습니다. 예를 들어 .NET이 향상된 가비지 수집기 또는 더 빠른 어셈블리 로드 시간이 있는 새 버전을 릴리스하는 경우 DLR을 사용하여 구현된 언어는 즉시 동일한 이점을 얻습니다. DLR이 더 나은 컴파일과 같은 최적화를 추가하는 경우 DLR을 사용하여 구현된 모든 언어의 성능도 향상됩니다.
라이브러리와 개체 공유를 활성화합니다.
한 언어로 구현된 개체 및 라이브러리는 다른 언어에서 사용할 수 있습니다. 또한 DLR을 사용하면 정적으로 형식화된 언어와 동적 언어 간의 상호 운용이 가능합니다. 예를 들어 C#은 동적 언어로 작성된 라이브러리를 사용하는 동적 개체를 선언할 수 있습니다. 동시에 동적 언어는 .NET Framework의 라이브러리를 사용할 수 있습니다.
빠른 동적 디스패치 및 호출 제공
DLR은 고급 다형 캐싱을 지원하여 동적 작업의 빠른 실행을 제공합니다. DLR은 필요한 런타임 구현에 개체를 사용하는 바인딩 작업에 대한 규칙을 만든 다음, 동일한 유형의 개체에서 동일한 코드를 연속으로 실행하는 동안 리소스 소모 바인딩 계산을 방지하기 위해 이러한 규칙을 캐시합니다.
DLR 아키텍처
DLR은 동적 언어를 더 잘 지원하기 위해 CLR에 서비스 집합을 추가합니다. 이러한 서비스에는 다음이 포함됩니다.
식 트리 DLR은 식 트리를 사용하여 언어 의미 체계를 나타냅니다. 이를 위해 DLR은 제어 흐름, 할당 및 기타 언어 모델링 노드를 포함하도록 LINQ 식 트리를 확장했습니다. 자세한 내용은 식 트리(C#) 또는 식 트리(Visual Basic)참조하세요.
콜 사이트 캐싱. 동적 호출 사이트는 동적 개체에 대해
a + b
또는a.b()
같은 작업을 수행하는 코드 내의 위치입니다. DLR은a
및b
(일반적으로 이러한 개체의 형식)의 특성과 작업에 대한 정보를 캐시합니다. 이러한 작업이 이전에 수행된 경우 DLR은 빠른 디스패치를 위해 캐시에서 필요한 모든 정보를 검색합니다.동적 개체 상호 운용성. DLR은 동적 개체 및 작업을 나타내고 동적 라이브러리의 언어 구현자 및 작성자가 사용할 수 있는 클래스 및 인터페이스 집합을 제공합니다. 이러한 클래스 및 인터페이스에는 IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject및 ExpandoObject포함됩니다.
DLR은 호출 사이트에서 바인더를 사용하여 .NET뿐만 아니라 COM과 같은 다른 인프라 및 서비스와 통신합니다. 바인더는 언어의 의미 체계를 캡슐화하고 식 트리를 사용하여 호출 사이트에서 작업을 수행하는 방법을 지정합니다. 이를 통해 DLR을 사용하는 동적 및 정적으로 형식화된 언어가 라이브러리를 공유하고 DLR이 지원하는 모든 기술에 액세스할 수 있습니다.
DLR 설명서
DLR의 오픈 소스 버전을 사용하여 언어에 동적 동작을 추가하는 방법 또는 .NET에서 동적 언어를 사용하도록 설정하는 방법에 대한 자세한 내용은 GitHub의 IronLanguages/dlr 리포지토리에 대한 설명서를 참조하세요.
더 보기
.NET