Programming

Microsoft Roslyn과 CodeDom

procodes 2020. 8. 6. 22:26
반응형

Microsoft Roslyn과 CodeDom


A로부터 보도 자료 새로운 관한 인포 월드에 어제 마이크로 소프트 로슬린 :

이러한 종류의 "해체 된"컴파일러의 가장 분명한 장점은 전체 컴파일-실행 프로세스가 .Net 애플리케이션 내에서 호출 될 수 있다는 것입니다. Hejlsberg는 C # 컴파일러에 문자열로 몇 가지 코드 스 니펫을 전달한 C # 프로그램을 시연했습니다. 컴파일러는 결과 IL 어셈블리 코드를 개체로 반환 한 다음 실행을 위해 CLR (공용 언어 런타임)에 전달했습니다. oil! Roslyn을 통해 C #은 런타임에 코드를 생성하고 호출하는 동적 언어 기능을 얻습니다.

.NET 4가 출시 된 이후로이 작업을 수행 할 수있었습니다.이 작업은 CSharpCodeProvider.CompileAssemblyFromSource얼마 전에 작성된 ASP.Net 프로젝트에서 실제로 사용하고 있습니다. 사용자가 텍스트 상자에 코드를 입력하고 어셈블리 / 네임 스페이스를 선택할 수 있습니다. Windows Azure에서 실시간 환경 코드 테스트를 위해 해당 코드의 출력을 즉시 참조하여 실행하고 표시합니다.

인가 CodeDom의 / 로슬린에 precurser 부분은? Roslyn의 특별한 이점은 무엇입니까 CodeDom?


면책 조항 : 저는 Roslyn 팀에서 Microsoft를 위해 일합니다.

CodeDom은 Roslyn의 선구자이지만 거의 관련이 없습니다. 기본적으로 CodeDom은 .NET 1.0에 추가 된 코드를 생성하는 간단하고 (어떤) 언어에 구애받지 않는 방식으로 디자이너 (La WinForms)를 지원합니다. CodeDom은 C #, VB 및 기타 언어로 코드를 생성 할 수있는 통합 모델을 제공하려는 시도 였기 때문에 지원하는 모든 언어에 대한 충실도가 부족합니다 (이 때문에 CodeDom으로 switch 문을 만들 수 없습니다). CSharpCodeProvider.CompileAssemblyFromSource는 단순히 csc.exe 실행을 둘러싼 래퍼입니다.

Roslyn은 완전히 다른 동물입니다. 관리 코드를 사용하여 처음부터 C # 및 VB 컴파일러를 다시 작성합니다 (C #의 C # 및 VB의 VB (오늘날 제공되는 csc.exe 및 vbc.exe 버전은 기본 코드로 작성 됨)). 관리 코드로 빌드하면 사용자가 실제 컴파일러를 .NET 응용 프로그램의 라이브러리로 참조 할 수 있다는 장점이 있습니다 (래퍼 필요 없음).

컴파일러 파이프 라인의 각 구성 요소를 구축하는 동안 공개 API를 맨 위에 공개했습니다.

  • 파서-> 구문 트리 API
  • 심볼 테이블 / 메타 데이터 가져 오기-> 심볼 API
  • 바인더-> 바인딩 및 흐름 분석 API
  • IL 이미 터-> API 방출

Roslyn은 정교한 C # 및 VB 소스 코드 생성기로 사용될 수 있지만 CodeDom과의 유사성이 끝나는 곳입니다. Roslyn Compiler API는 코드 구문 분석, 의미 분석 수행, 동적 코드 컴파일 및 평가 등에 사용될 수 있습니다.

컴파일러 외에도 Roslyn 팀은 공용 컴파일러 API 위에 Visual Studio C # 및 VB IDE 기능 다시 빌드하고 있습니다. 따라서 컴파일러 API는 IntelliSense 및 Extract Method 리팩토링과 같은 Visual Studio 디자인 타임 도구를 빌드 할 수있을 정도로 풍부합니다. 또한 컴파일러 위의 계층에서 Roslyn은 더 높은 수준의 분석 또는 데이터 변환을위한 서비스를 제공합니다. 예를 들어 C # 및 VB 형식 규칙을 사용하여 코드를 형식화하거나 솔루션 내에서 특정 기호에 대한 모든 참조를 찾는 서비스가 있습니다.

정말, 그냥 거기에없는 하나 된 CodeDom 이상 로슬린의 특별한 장점은. CodeDom은 매우 구체적인 코드 생성 요구를 충족 시켰지만 Roslyn은 생각할 수있는 거의 모든 종류의 C # 또는 VB 언어 도구를 빌드 할 수있는 프레임 워크를 제공하여 전체 언어 도구 공간을 처리하고 있습니다.


CodeDom을 사용하면 컴파일 할 수 있지만 코드 자체에 대한 정보 (컴파일러 오류 제외)를 실제로 얻을 수는 없습니다. 기본적으로 "컴파일"이라고 말하고 "성공했습니다"또는 "실패했습니다. 여기에 몇 가지 오류가 있습니다"라고 말하는 블랙 박스입니다.

Roslyn을 사용하면 코드를 완벽하게 검사하고 작성할 수 있습니다. 여기에는 소스 코드 내에서 주석을 보거나 검사 할 수있는 기능, 전체 구조에 대한 자세한 정보 등이 포함됩니다. Roslyn에 전달한 소스의 전체 구문 트리를 통해 상세 분석을 수행 할 수 있습니다. 또는 그것에 변형.

완전하고 풍부한 구문 정보가 주어지면 엄청난 양의 추가 제어와 유연성을 갖게됩니다. 예를 들어, C # 코드 블록을 복사하여 VB.NET 코드로 붙여 넣는 샘플이 작동하는 방식입니다. Roslyn을 사용하면 컴파일 이상의 작업을 수행 할 수 있습니다. 코드 자체를 깔끔하게 조작 할 수도 있습니다. 이는 도구가 메타 정보 (예 : 주석)를 포함한 전체 구문을 이해하고 직접 작업 할 수 있기 때문에 리팩토링과 같은 작업을 매우 간단하게 수행 할 수 있기 때문에 많은 도구를 생성하기가 훨씬 더 간단 해집니다.


내가 볼 한 가지 큰 차이점 : CodeDom을 사용하면 C # 또는 VB.NET을 컴파일 할 때마다 프로세스에서 발생합니다. CSC.exe 또는 VBC.exe는 실제 작업자입니다.

아키텍처, 확장 성, 격리 등 (Azure 언급) 측면에서 서비스를 구축하려는 경우 이는 그리 좋지 않습니다.

Roslyn과 함께 진행 중입니다.

이것이 "서비스로서의 컴파일러"라고 불리는 이유 중 하나라고 생각합니다.

또한 CodeDom은 비교적 열악한 API이며 많은 기능을 그리워하며 대부분 Visual Studio UI 디자이너 자동 코드 생성을 지원하도록 설계 되었기 때문에 실제로 최신 버전이 아닙니다. 컴파일러를 작성하는 사람들이 Roslyn을 작성했을 때 Roslyn이 훨씬 더 잘할 것이라고 생각합니다. 나는 그것이 차이를 만들 수 있기를 바랍니다.

추신 : CSC.exe 및 VBC.exe와의 한 가지 주목할만한 차이점 : Roslyn은 순수한 .NET 인 것 같습니다 ( CCI 사용 ).


Roslyn은 전체 프로세스를 훨씬 세밀하게 제어 할 수 있습니다. 예를 들어 문자열을 분석하고 추가 코드 (분석을 기반으로하는 컴파일 프로세스 내에서 즉시)를 생성 할 수 있습니다.

CodeDom은 "컴파일러 만 사용"하고 Roslyn은 "(하위) 부분에 대한 전체 액세스 권한을 가진 서비스로서의 컴파일러"... Roslyn을 사용하면 "컴파일러 내부"이고 컴파일러 관점에서 코드의 모양을 볼 수 있습니다 현재 불가능한 방식으로 사물을 변경할 수 있습니다.

예를 들어 Roslyn을 사용하여 현재 AOP 구현 상태보다 훨씬 편리하고 훨씬 나은 C #을 확장 할 수 있습니다.

현재 Roslyn 상태 및 다양한 수준의 액세스 및 제어에 대한 개요는 http://msdn.microsoft.com/en-us/hh500769를 참조하십시오 .

최신 정보

Microsoft는 추가 기능과 많은 API 변경 / 추가를 통해 새로운 CTP를 제공했습니다. 자세한 내용은 여기를 참조 하십시오 .

참고 URL : https://stackoverflow.com/questions/7852926/microsoft-roslyn-vs-codedom

반응형