C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[24982] Roslyn 빌드구조
빌더(TWx) [builder] 6553 읽음    2014-12-08 22:54
닷넷에 베타적인 분도 있는 것 같고해서 Roslyn 컴파일러 구조는 생략하고, 빌드구조만 간략하게 짚어 봅니다.

Roslyn 어셈블리 모듈은 MS가 delayed digital sign 방식으로 strong name 키를 사용하고 있기 때문에 clr 인증확인 기능을
끄지 않고 빌드된 컴파일러 어셈블리 모듈들이 로드될 수 있도록 하기 위해 간단한 FakeSign 유틸리티를 만들어서 컴파일러 빌드에
이용하고 있습니다.  빌드된 닷넷 어셈블리 파일의 CLR 관련 헤더 부분의 특정 플래그를 수정해서 인증된 것 처럼 하기 위한 거고
Development cycle 동안에나 필요한 부분 입니다. (따라서 FakeSign이 가장 먼저 빌드 되게 됩니다).

xml 형식의 .csprj 프로젝트 파일은 MS Build 엔진에 의해서 파싱되어 컴파일 빌드 과정을 밟게 되는데... .csprj 프로젝트 파일 들은
Roslyn 소스코드에 있는 VSL.Imports.targets 파일을 임포트하고 있고, 여기서 FakeSign 관련 빌드테스크를 정의 하고 있기 때문에
MS Build 엔진이 FakeSign을 실행해서 컴파일된 어셈블리 모듈 바이너리 파일들을 수정하게 됩니다. Roslyn 프로젝트 파일들을
빌드하면, MS Build 엔진이 먼저 컴파일 해 놓은 FakeSign을 실행해서 빌드된 바이너리를 modify 하는 셈이죠.

NuGet도 빌드 스크립트에 의한 것은 마찬가지 입니다. 다만 목적이 Roslyn 소스코드를 빌드 하기 위해 Dependency가 걸리는
툴셋을 다운 받고 빌드환경을 셋업해주는 역할을 하게 됩니다.

csc/vbc는 MS Build 엔진과 상관 없이 command line의 독립된 standalone 버전 컴파일러일 뿐이고...
csc2/vbc2는 VsPackage 모듈과 스크립트에 정의 되어있는 빌드 테스크 형태로 MS Build 엔진에 의해서 실행되게 됩니다.
실행된 csc2/vbc2는 VBCSCompiler.exe가 실행되어 있지 않으면 실행을 시키고, 이미 실행되어 있으면 파이프 구조를 이용해서
VBCSCompiler.exe에 컴파일 요청을 하게 됩니다. 일단 실행되면...일정시간 동안 데몬 처럼 상주하고 있으면서 다음 컴파일 요청
이 있으면 작업을 처리하는 구조이죠.

이런 식으로 VBCSCompiler.exe를 일종의 데몬처럼 사용하면 빌드할때 마다 매번 닷넷 런타임을 매번 셋업할 필요가 없기 때문에
빌드성능 향상을 위해 Roslyn 컴파일러 팀에서 이런 구조를 사용하게 된 거죠. (빌드성능을 향상하기 위해 닷넷의 특성을 고려)

Tools 디렉토리에 있는 CSharpSyntaxGenerator 같은 거는 xml 형식의 스크립트를 입력으로 받아 C# 소스코드를 만들어 내는데
파스트리에서 사용되는 토큰노드의 명세는 Development cycle 과정에서 자주 바뀔수 있는 부분이라, 번거롭게 매번 소스코드를
직접 건드리지 않고 토큰명세를 xml로 형식정의 해서 사용할 수 있도록 하고 있는데, 컴파일러 빌드과정의 편의를 위한 목적 이외에
별다른 의미는 없습니다. (xml 내용을 파싱해서 C# 소스코드를 생성하는 일종의 간단한 간이 파서라고나 할까요)

컴파일러 팀에서 컴파일러를 API화 해 놓은 것은 코드리펙토링, 자동픽스, 인텔리전스 기능 등... 컴파일러 툴을 IDE 친화적으로
만들기 위한 거지, 이 자체가 클라우드와 관련이 있는 것은 아닙니다. (Visual Studio Online과 Azure 시스템과의 연계는 별개의
것임) 컴파일러 툴 체인을 API화 해놓지 않으면... IDE 개발팀에서 코드리펙토링, 자동픽스, 인텔리전스 같은 기능을 구현하기 위해
파서를 별도로 구현해야 하는데 번거로운 일이죠. 컴파일러 툴 체인을 API화 해 놓았으니 더 파워풀한 리펙토링 툴을 제공하는
서드파티 업체도 많이 등장하지 않을까 싶네요. 사용자가 API를 이용해서 직접 필요한 기능을 구현해서 IDE에 Integrate 할수도
있을 테고요. 컴일러 툴 체인이 제공하는 API를 이용하면 IDE에서 별짓을? 다 해볼수 있기는 한데 여기서 다루기는 그렇네요.

Roslyn 컴파일러 툴 체인을 수정해서 변경된 코드리펙토링, 자동픽스, 인텔리전스 기능 등이... IDE 환경에서 어떤 식으로 반응
하는지 전체를 테스트 하기 위해선 Roslyn을 별도의 레지스트리 Hive를 생성해서 VsPackage 형태로 second Visual Studio IDE
Instance에 올려서 디버깅 해야 하기 때문에... MS Build 엔진, 빌드 스크립, 빌드 태스크, VsPackage 아키텍쳐도 같이 이해를
하고 있어야 합니다.

바빠서 이만...
bugfree [bugfree]   2014-12-15 21:45 X
IDE 에디터에서 한라인 한라인 수정할때마다
소스 전체를 다시 컴파일해서 리백토링 결과를
보여주는 식이면 오버헤드가 많이 걸리지 않을까요?
빌더(TWx) [builder]   2014-12-18 12:06 X
Roslyn 컴파일러 툴 체인 소스구조를 살펴보면... 불필요하게 boxing/unboxing이 일어나지 않게 generic 패턴(C++ 에서 Template)을 사용하고 있고... syntax tree, compilation, symbol, semantic model 등 컴파일러 툴 체인에서 사용되는 자료구조 형태를 퍼포먼스를 위해 Immutable 디자인 패턴을 객체에 적용해서 사용하고 있습니다. 그로인해 멀티쓰레딩 환경에서 사용될 때 Lock이 필요 없도록 구현하고 있습니다.
빌더(TWx) [builder]   2014-12-18 12:13 X
소스 전체를 다시 컴파일 하는 구조가 아닙니다.

소스코드 에디터가 Roslyn 컴파일러 툴체인과 연계되어.. 에디터에서 어떤 수정이 일어날 때 incremental parsing, incremental symbol tree update 구조로 동작해서 변경된 부분만 처리를 하게 됩니다. 컴파일러 툴 체인에서 토큰노드(Syntax Node)레벨에로 작업을 처리할 수 있게 인터페이스를 제공하고 있기 때문에 토큰노드 하나만 바꿔주는 것으로 코드레펙토링이 일어나게 하는 것도 가능합니다.
빌더(TWx) [builder]   2014-12-18 12:21 X
예를 들어서... 어떤 'if' 문장을 다른 'if'문장으로 코드리펙토링한다고 할 때...

var root = await document.GetSyntaxRootAsync();
var newRoot = root.ReplaceNode(ifStatement, newIfStatement);
document.WithSyntaxRoot(newRoot);

위와 같이 async, await 구조를 이용해서 IDE 메인 쓰레드에 영향을 주지않고 비동기적으로 간단하게 코드리펙토링 기능을 구현할 수 있죠.
bugfree [bugfree]   2014-12-20 21:38 X
윈폼으로 구이 짤때하고 코드가 많이 다른거 같습니다
로스린 소스보니 마치 C++11 보는거 같은 느낌이네요
빌더(TWx) [builder]   2014-12-21 14:39 X
처음에 C#이 만들어 졌을 때... 'J++'이란 이름을 달고 나왔었죠,
'이거 자바를 그대로 베낀거 아냐?'라는 얘기가 많이 돌 정도로 syntax 구조도 비슷했고.. 그로인해 당시 sun 이란 회사와 소송까지 갔었죠.
J++에서 C#으로 이름이 바뀐 지금에 와서 보면... C++ concept을 많이 차용하고 있는 모습 입니다.
bugfree [bugfree]   2014-12-23 10:14 X
아하 그렇군요. 어쩐지 java랑 c++을 섞어논거 같은 느낌이.
이거저거 만저보다 세컨드 IDE 올리는데 까진 성공했는데
세컨드 IDE에서 C# 코드를 올리면 IDE가 예외를 발생하면서
다운되는데 뭘더 추가로 설치해줘야 하는게 있는건지요
bugfree [bugfree]   2014-12-24 22:53 X
에러없이 빌드되고 컴파일도 잘됩니다
세컨드 ide에 로스린도 잘올라가는데요
c#파일 로드하면 ide가 예외나면서 다운됩니다
이문제로 세컨드에 로스린 올려서 디버깅을 하는걸
못하고 헤매고 있습니다. 해결방법이 없을까요
빌더(TWx) [builder]   2014-12-25 11:57 X
second IDE instance가 실생된 것으로 보면... Roslyn VsPackage가 정상적으로 로드되었고, 컴파일/빌드에는 별문제가 없는 것으로 보입니다.
직접 상황을 볼수 없어 단정적으로 얘기하긴 힘들지만... C#소스파일을 로드할 때 second IDE에서 문제가 발생한다는 것으로 볼때...
Portable assembly(Windows Store용 Application)를 지원하기 위해.. Roslyn 컴파일러 팀에서 기존의 MEF(IDE를 확장하기 위해 사용되는 프레임웍)이외에 또 다른 레이어의 MEF 구조를 두고 있는데... 아마도 이 부분과 관련해서 Language Service가 정상적으로 바인됭 되고 있지 못해서 일어나는 문제가 아닐까 싶은데요...
빌더(TWx) [builder]   2014-12-25 12:19 X
이렇게 한번 해보세요.

1.
Visual Studio 2015 Preview IDE를 종료하고, Task Manager로 확인해서 VBCSCompiler.exe가 실행되어 있으면 Kill 합니다.

2.
Command Prompt 창을 열어서...
C:/>echo %USERPROFILE%
엔터치면... 'C:/users/user_name' 과 같은 식으로 표시가 될 겁니다. (user_name은 컴퓨터 마다 다른 부분)

3.
윈도우즈 탐색기를 열고... 'C:/Users\user_name/AppData/Roaming/Microsoft/VisualStudio' 디렉토리로 가서
'14.0'이란 서브디렉토리는 그대로 두고(Visual Studio 2015는 14.0으로 표시됨)...
'14.0Roslyn' 서브디렉토리만 삭제 하세요.

4.
regedit.exe 를 실행해서...
HKEY_CURRENT_USER/Software/Microsoft/VisualStudio 로 갑니다.
'14.0', 14.0_Config'은 원래의 Visual Studio 2015 Preview가 사용하는 Registry Hive니까 그대로 두고...
'14.0Roslyn', '14.0Roslyn_Config', '14.0Roslyn_Config_xxxx'등의 Roslyn 관련 레지스트리 엔트리들만 모두 삭제 하세요.
(VS2010 부터인가 vs가 사용하는 Registry 구조가 바꼈습니다.)
빌더(TWx) [builder]   2014-12-25 12:27 X
5.
Roslyn Solution을 Clear하고 'Rebuild Solution'한 후에... Roslyn VsPackage를 다시 로드해보세요.

컴상황을 직접 볼수 없어 단정할 수는 없지만, 언급한 대로 Language Service의 바인딩이 정상적으로 이루어지지 않아서 일어나는 문제일 수도 있으니까 위와 같이 한번 해보세요.

Mery Christmas ...

bugfree [bugfree]   2014-12-25 18:04 X
말씀해주신 방법으로 해결했습니다
대단히 감사합니다. 메리크리스마스 ^^

+ -

관련 글 리스트
24982 Roslyn 빌드구조 빌더(TWx) 6553 2014/12/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.