저자: 한동훈(
traxacun@unitel.co.kr)
마이크로소프트에서 공유 소스(Shared Source) 프로그램을 발표했고, 그 일환으로 CLI에 대한 소스를 공개했습니다.
사실은 소스가 공개된지 매우 오래되었지만 국내에서는 별로 소개되는 일은 없는 것 같습니다. 관심밖일까요? 아니면 너무 어렵기 때문일까요?
어쨌거나 한동안은 IL 코드와 MOF(Managed Object File)에 대해서 살펴보고, COFF를 다시 살펴보았으며, CLI 소스와 자바의 소스 코드를 비교하는 즐거운 시간을 가졌던 것은 사실입니다.
C#은 자바의 아류일 뿐이다라고 치부하는 사람들도 있지만, C#과 자바 모두 각자의 길을 가고 있다고 생각되고, 다른 점들은 다른 것이라 생각합니다.
메소드나 클래스 이름이 비슷하다고 해서 둘이 비슷하다거나 같다고 하는 것은 곤란하다고 생각하는 쪽입니다.
이제 본론으로 들어가죠. Shared Source CLI는
http://msdn.microsoft.com/net/sscli에서 직접 다운 받을 수 있습니다. 압축을 풀 때는 주의할 점이 있는데 윈도우 환경에서는 WinZip을 사용하거나 윈도우용 tar, gzip 패키지를 사용하라는 것입니다. 일부 압축 프로그램들은 tar 파일 형태의 디렉터리 정보를 잘못 읽어오기 때문에 원래 구조대로 압축이 풀리지 않는 문제점이 있었습니다. 저는 CygWin(
http://www.cygwin.com)을 사용해서 압축을 풀었습니다.(사실은 리눅스와 윈도우 모두 GCC를 사용하기 위해 CygWin을 쓰고 있었거든요)
압축을 모두 풀고나면 sscli라는 디렉터리가 생기고, 대략 70MB 정도를 차지합니다. 이것은 윈도우와 FreeBSD에서 완전히 사용할 수 있습니다. 음, 저도 닷넷이 윈도우에서만 실행되고 FreeBSD는 옮기는 중이라고 알고 있었는데 그건 아닌듯 합니다.
그리고 컴파일을 할 수 있도록 환경 설정을 하기 위해 Perl이 설치되어 있어야합니다. Perl은
http://www.activestate.com과
http://www.perl.org에서 받을 수 있지만, 윈도우 사용자는 ActiveState의 Active Perl을 받아서 설치하는 것이 편합니다. 경로 설정이나 파일 연결 같은 설정을 자동으로 해줍니다.
이것을 컴파일하려면 비주얼 스튜디오 닷넷이 필요합니다. 모두 여러분의 컴퓨터에 설치되어 있겠지요? FreeBSD 사용자라면 GCC만 있으면 됩니다.
이제 sscli 디렉터리에서 env.bat를 실행합니다. FreeBSD 사용자라면 사용하는 쉘의 종류에 따라서 env.sh이나 env.csh을 실행하면 됩니다. 그리고 buildall을 실행합니다. FreeBSD 사용자라면 ./configure와 ./buildall을 실행합니다.
저는 P-III 800Mhz, 256M 램을 사용하고, 윈도우 XP에서 컴파일을 하는데 1시간 20분 가량 걸렸던 것 같습니다. 생각했던 것과는 달리 경고 메시지도 나타나지 않고, 깔끔하게 컴파일되었습니다.
컴파일이 모두 끝났으면 제대로 컴파일이 되었는지 확인하기 위해 csc를 실행합니다. 실행하면 다음과 같은 메시지가 나타납니다.
Microsoft (R) Visual C# .NET Compiler version
for Microsoft (R) .NET Framework version ---
Copyright (c) Microsoft Corporation 2001. All rights reserved.
fatal error CS2008: No inputs specified.
평소에 쓰던 C# 컴파일러와는 조금 다릅니다. 컴파일이 정말 되는지 알아보기 위해 sscli에서 tools\hello로 이동합니다. 다음과 같은 명령을 실행해 봅니다.
csc hello.cs
csc helloxml.cs
clix hello.exe
clix helloxml.exe
모두 잘 실행되는 것을 알 수 있습니다. clix는 CLI Loader라는 것으로, 우리가 컴파일한 CLI 환경에 코드를 로드할 수 있게 해줍니다. 그렇지 않으면 보통의 닷넷 런타임이 로드됩니다. 주의해야겠죠.
여기에는 몇 가지 차이점이 있습니다. 닷넷 프레임워크에 있는 C# 컴파일러에서 몇 가지 옵션이 제거되어 있으며, GUI 환경을 위해서 Tcl/Tk를 사용하고 있습니다.
자, 컴파일이 너무 간단하게 되기 때문에(아마, 퀘이크 소스 보다는 간단한 것 같군요!) 특별히 쓸 내용이 없습니다.
여기서는 간단히 여러분이 흥미를 가질만한 디렉터리들을 소개하는 것으로 마칠까 합니다.
- sscli/docs - Shared Source CLI의 각종 문서들이 있습니다. 이 문서들을 시작지점으로 하면 좋습니다.
- sscli/pal - PAL(Platform Adaptation Layer)라고 하며, unix와 win32 환경을 위한 코드가 따로 있습니다.
- sscli/pal/src - PAL 런타임 소스가 있습니다. 새로운 PAL을 구현하는 것으로 닷넷 환경을 다른 운영체제로 옮길 수 있습니다. 하지만 모든 것을 새로 구현하는 것은 분명히 낭비겠지요. 여기는 PAL에서 공통적인 부분들에 해당하는 소스 코드가 있습니다. 주로 COM API, 암호화, 문자열, 관리형 코드에서 비관리형 코드(운영체제 네이티브 호출)를 사용하는 것에 대한 내용이 있습니다.
- sscli/tools - 주로 SSCLI에서 사용하는 도구들입니다. 여기에는 namke 등이 있습니다.
- sscli/clr/src - 여기에는 상당히 많은 디렉터리들이 있는데, 주요 디렉터리들은 다음과 같습니다.
- vm - 많은 분들이 들어봤을 법한 가비지 컬렉터, 클래스 로드, 타입 시스템, 응용 프로그램 도메인, 리플렉션, 보안, 코드 관리자, 가상 실행 엔진(VEE)을 구현하고 있는 부분입니다. 실제로 저는 여기서 CLR의 메모리 관리와 같은 부분에 대한 많은 내용들을 얻을 수 있었습니다.
- csharp - C# 컴파일러 구현입니다.
- bcl - ECMA에 표준안으로 제출된 C# 스펙의 기본 클래스 라이브러리(Base Class Library, BCL)를 정의한 부분입니다. 실제로 이 부분은 C++이 아니라 C#으로 구현되어 있어서, 내부 구현을 들여다 볼 수 있는 좋은 기회를 제공합니다. void.cs 같은 것을 보면 반환값이 없는 형태를 구현하는 것을 볼 수 있습니다. 정말 아무것도 없어요(VOID !!)
- debug - cordbg.exe와 같은 디버거를 구현한 소스 코드입니다. 닷넷 프레임워크에는 GUI 버전인 GUI Debug도 있었는데, SSCLI에서는 제외되어서 아쉽습니다.
- ilasm/ildasm - IL 코드 어셈블러와 디셈블러 소스 코드가 있습니다.
- dlls - mscoree.dll과 같은 네이티브 코드들에 대한 소스가 들어있습니다. System 네임 스페이스를 비롯한 거의 대부분의 네임 스페이스가 mscoree.dll에 있다는 것을 아시는 분들은 아실겁니다. 기대와는 달리(당연한 얘기지만) 해당 운영체제의 네이티브 호출로 꽉 차 있습니다.
- sscli/jscript/engine - JScript 컴파일러 소스 코드입니다.
- sscli/tests - 각종 테스트 프로그램이 있습니다. rrun.pl은 런타임 환경 자체를 테스트할 수 있는 Perl 스크립트입니다. sscli/tests/palsuite는 FreeBSD 환경에서 테스트할 수 있는 코드들이 있습니다. 테스트 프로그램들 중에는 CLR을 수정한 경우에 CLR 환경만 테스트 할 수 있는 것도 있고, BCL만 테스트할 수 있는 것등 다양한 버전이 있습니다.
이외에 sscli/samples/pigui/tk에서 Tcl/Tk 래퍼 클래스들을 컴파일할 수 있습니다. 컴파일하면 SharedSourceCLI.Tk.dll이 만들어집니다. 물론 Tcl/Tk가 시스템에 설치되어 있어야합니다.
http://www.activestate.com에서 Tck/Tk를 다운 받을 수 있습니다. pigui에는 GUI 예제들이 있습니다. 간단한 GUI 노트 패드도 있으니 사용해 보시기 바랍니다.
http://msdn.microsoft.com/net/sscli에 가면 SSCLI와 관련된 뉴스 그룹 목록과 관련된 자료를 볼 수 있는 곳에 대한 정보를 얻을 수 있습니다.
C#의 다음 버전에는 메소드 조인이 소개될지도 모릅니다. 닷넷 프레임워크에서 구현된 컴파일러는 있지만, 몇가지 문제점들을 해결하기 위해 노력하고 있는 모양입니다.
메소드 조인은 멀티 스레드와 관련된 Concurrent Abstraction을 제공하며, Concurrent Abstraction Programming 모델을 제공합니다. 교착상태가 발생하지 않게 할 수 있고, 지금까지와는 전혀 새로운 형태로 스레드 프로그래밍을 할 수 있을 것입니다.(저의 세미나 주제이기도 했는데, 정말 멋진 코드를 작성할 수 있고, 훌륭하게 실행된다는 사실에 즐거웠었습니다. 닷넷 프레임워크 v 2.0 정도가 나오고, 조인 메소드가 소개된다면 여러분에게 가장 먼저 깊이 있는 내용을 소개할 수 있게 되기를 고대해 보겠습니다)
자, 지금은 CLI 해킹을 즐겨볼까요?
참고