Microsoft Roslyn 대 CodeDom


110

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

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

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

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

답변:


240

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

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

Roslyn은 완전히 다른 동물입니다. C #의 C #과 VB의 VB (현재 제공되는 csc.exe 및 vbc.exe의 버전은 네이티브 코드로 작성 됨)를 사용하여 처음부터 C # 및 VB 컴파일러를 모두 다시 작성했습니다. 관리 코드에서 빌드 할 때의 이점은 사용자가 실제 컴파일러를 .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 언어 도구를 빌드 할 수있는 프레임 워크를 제공하여 전체 언어 도구 공간을 처리하고 있습니다.


2
@Dustin : Roslyn이 다른 언어를 지원할까요? 예를 들어 JavaScript (.NET)?
Diego Barros 2013

@Dustin : 조직에서 코드 품질을 강화할 수있는 완전한 IDE 환경을 구축하는 데 적합합니다. 수동 코드 검토를 완전히 대체하지는 않지만 품질이 크게 향상되는 것을 확인했습니다. 곧!
Jerric Lyns 존

누군가가 CodeDom을 사용하는 코드를 Roslyn의 SyntaxFactory를 사용하는 코드로 변환하는 Roslyn 기반 도구를 이미 만들었다면 좋을 것입니다. )
Emyr

43

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

Roslyn을 사용하면 즉시 코드를 완전히 검사하고 빌드 할 수 있습니다. 여기에는 소스 코드의 일부, 전체 구조에 대한 자세한 정보 등을보고 검사 할 수있는 기능이 포함됩니다. Roslyn에 전달한 소스의 전체 구문 트리를 살펴보고 자세한 분석을 수행 할 수 있습니다. 또는 그것에 변형.

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


12

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

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

Roslyn과 함께 진행 중입니다.

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

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

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


8

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

CodeDom은 "컴파일러 만 사용"하는 반면 Roslyn은 "(하위) 부분에 대한 전체 액세스 권한이있는 서비스로서의 컴파일러"입니다. Roslyn을 사용하면 "컴파일러 내부"에 있으며 컴파일러 관점에서 코드가 어떻게 보이는지 확인할 수 있습니다. 현재 불가능한 방식으로 변경할 수 있습니다.

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

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

최신 정보

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


1
실제로 Roslyn을 사용하여 추가 키워드로 C #을 확장 할 수 있다는 것은 사실이 아닙니다.
Dustin Campbell

감사합니다 ... 정정되었습니다 ... 비록 첫 번째 릴리스에서는 아니었지만 이것이 가능할 것이라는 점이 예쁩니다 ...
Yahia

2
@DustinCampbell, 코드 생성으로 인해 의사 키워드가 유발 한 컴파일러 오류를 처리했다면 어떨까요?
Rodrick Chapman 2011

3
컴파일러에 전달하기 전에 다시 작성해야합니다. 먼저 특수 키워드로 코드를 구문 분석하십시오. 코드가 구문 분석되고 파서가 머리 나 꼬리를 만들 수없는 경우가 아니면 잘못된 키워드가 결과 트리에 SkippedTokenTrivia로 표시됩니다. 그런 다음 건너 뛴 키워드를 감지하고 유효한 코드 (예 : AOP 위빙)로 트리를 다시 작성합니다. 마지막으로 새 트리를 컴파일러에 전달합니다. 이것은 확실히 해킹이며 향후 버전의 Roslyn에서 작동한다고 보장되지는 않습니다. 예를 들어 파서는 향후 릴리스에서 손상된 코드에 대해 동일한 트리를 생성하지 않을 수 있습니다.
더스틴 캠벨

@DustinCampbell :하지만 Roslyn 결승전에서 AOP 직조를 허용하는 것이 있습니까? 내 Mono.Cecil INPC 위빙은 그대로 잘 작동하지만 쓸 수 있다면public notifying string Name {get;set;} 훨씬 더 멋질 것입니다
TDaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.