1. Hello 世界

CLR 2009. 12. 23. 09:00 Posted by 알 수 없는 사용자
다음의 소스코드로 시작해 봅시다.

.assembly PrintString {}

/*
    Console.WriteLine("Hello, 世界)"
*/

.method static public void main() il managed
{
    .entrypoint            // 프로그램의 진입점. 곧 Entrypoint입니다.
    .maxstack 8


    // *****************************************************
    // Console.WriteLine("Hello, 世界");
    // *****************************************************
    ldstr "Hello, 世界"        // 스택에 스트링을 PUSH 합니다.

    // System.Console.Writeline 함수 호출합니다.
    // 이 함수는 스택에 있는 스트링을 인자로 POP합니다.
    call   void [mscorlib]System.Console::WriteLine
                                 (class System.String)

    // *****************************************************
    ldstr "Press Enter to continue"
    call   void [mscorlib]System.Console::WriteLine
                                 (class System.String)

    // System.Console.Read 함수를 호출합니다.
    // 키입력을 기다리게 되겠네요.
    call int32 [mscorlib]System.Console::Read()

    // Read()함수 호출로 인한 키 입력이 스택에 PUSH되었을 테니까
    // 이 함수가 끝나기 전에 POP하여 스택을 비웁니다.
    pop
    // *****************************************************

    ret
}

어 이거 뭔가요. 뭔가 익숙한 것 같으면서도 이상한 코드입니다.

대충 보아하니 화면에 "Hello, 世界" 를 출력하는 프로그램 같은데 Console::WriteLine() 같은 걸 보자니 Visual C++ 에서 Managed Code 프로그래밍 하는 것 같기도 하고, call, pop 이런 것들을 보니까 어셈블리어 같기도 합니다. 야~~ 21세기에 컴퓨터 개론에서나 보던 스택 PUSH, POP 신경쓰면서 화면에 저런거 찍어야 겠나 싶기도 하네요.

그런데 또 다시 생각해보면 사람이 보긴 답답해도 속도만 빨라졌지 여전히 좀 멍청한 CPU가 알아먹기는 좀 쉬울 것 같다는 생각이 들기도 합니다. 

네 저 코드는 .NET하면 누구나 들어봤을만한 IL (Intermediate Language) 코드라고 하는 것이라고 하네요. .NET Framework 기반의 환경에서 프로그래밍을 하게 되면 어떤 언어로 프로그래밍을 하던 .NET을 지원하는 모든 컴파일러는 지금까지 많이 봐오던 기계어로 컴파일을 하는 것이 아니라 MSIL이라는 코드로 컴파일을 합니다.

자. 일단 코드를 만들어 봤으니 실행을 시켜봐야죠. IL코드는 뭘로 컴파일을 해야 하나요. MSDN을 디벼보니 ilasm.exe 라는 .NET Framework의 도구를 이용해 컴파일을 할 수 있다고 합니다.

그러면 Visual Studio 2010에서 제공하는 CMD를 열고 해당 소스를 컴파일 해봅니다. (시작 -> 프로그램 -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010) 을 이용하면 됩니다.)



컴파일 하면 exe 실행파일이 생성이 되고 그 실행파일을 실행하니까 Hello, 世界 찍힙니다! 코드대로 Press Enter to continue 나오고 거기서 아무 키나 누르면 프로그램 실행이 종료됩니다.

(당연한거지만) 유니코드 지원 잘 되는군요. 보통 Hello World를 찍는데 Hello 世界 라고 글로벌하게(?) 찍은 이유는 얼마전 구글에서 공개한 Go 언어의 소개 프로그램이 Hello 世界 였거든요. 그게 괜히 멋져보여서 따라해 봤습니다. ㅎㅎ


명색이 프로그래머인데 첫인사는 코드로 해야 하지 않겠나. 싶어서 이렇게 너저분하게 인사를 해봤네요. 앞으로 CLR에 대해서 공부하면서 공부한 내용을 나름대로 정리해서 이런식으로 공유를 해 볼 생각입니다. 같이 공부하는 입장이라 이래저래 시행착오도 많을테고 실수도 분명히 있을테지만 앞으로 잘 부탁드립니다. _(_ _)_

CLR은 Common Language Runtime의 약자로 우리말로 번역하니 [공용 언어 런타임] 이라고 번역이 되네요. [공용 언어]는 우리말인데 [런타임]은 왜 런타임인가. 도대체 런타임이 뭔가요?

IT용어사전을 찾아보니 런타임에 대한 내용이 다음과 같이 나와 있습니다.

런타임 【run-time】

읽기 : 런타임

어플리케이션 소프트를 실하는데에 필요한 소프트웨어 모듈(부품)을 말한다. Windows의 경우 DLL파일의 형태로 제공된다. 실시에 런타임이 필요한지는 어플리케이션 소프트의 개발에 쓰여진 개발 툴에 의존한다. 런타임은 어플리케이션 소프트에 같이 들어있는 경우도 있지만, Microsoft사의 Visual Basic으로 개발 된 어플리케이션 소프트를 실하기 위해서는 [MSVBVMxx.DLL](xx는 버전 번호)라는 파일이 필요하지만, Borland Software사의 C++ Builder로 개발된 어플리케이션 소프트는 런타임 없이 동작 시킬수 있다.


출처 : http://www.chinatotheworld.net/w/C3ABC29FC2B0C3ADC283C280C3ACC29EC284.html


아. 프로그램을 실행하는데 필요한 소프트웨어 모듈을 말한답니다. 그렇다면 CLR은 공용 언어를 실행하는데 필요한 소프트웨어 모듈. 정도가 되는건가요?

위키도 한번 뒤져봤습니다.

공통 언어 런타임

위키백과 ― 우리 모두의 백과사전.

공통 언어 런타임(Common Language Runtime, CLR)은 마이크로소프트 닷넷 이니셰이티브의 가상 머신 구성 요소이다. 프로그램 코드를 위한 실행 환경을 정의하는 마이크로소프트의 공통 언어 기반 (CLI) 표준의 기능이다. 공통 언어 런타임은 공통 중간 언어(CIL, 이전에는 MSIL로 알려져 있었음)라고 불리는 바이트코드의 형태를 실행한다.

공통 언어 런타임을 사용하는 개발자들은 C#이나 VB 닷넷과 같은 언어의 코드를 기록한다. 컴파일 시간에 닷넷 컴파일러는 이러한 코드를 공통 중간 언어의 코드로 변환한다. 런타임할 때 공통 언어 런타임의 JIT 컴파일러(JIT 컴파일러)는 공통 중간 언어 코드를 운영 체제의 네이티브 코드로 변환한다. 아니면 중간 언어 코드는 런타임 이전에 개별단계에서 네이티브 코드로 컴파일될 수도 있다. 이로써 공통 중간 언어를 네이티브 코드로 변환하는 컴파일이 더 이상 필요하지 않기때문에 나중에 실행되는 모든 소프트웨어가 빠르게 실행되도록 도와 준다.

공통 언어 기반의 몇 가지 다른 기능이 윈도가 아닌 운영 체제에서 실행되는 반면, 공통 언어 런타임은 마이크로소프트 윈도 운영 체제에서만 동작한다.

출처 : http://ko.wikipedia.org/wiki/%EA%B3%B5%ED%86%B5_%EC%96%B8%EC%96%B4_%EB%9F%B0%ED%83%80%EC%9E%84


아 맞네요. 우리가 오늘부터 공부하고자 하는 CLR이라는 놈은 바로 IL을 실행가능하게 해주는 놈입니다. .NET Framework 기반의 모든 언어들은 언어를 가리지 않고 각자의 컴파일러에 의해 IL이라는 언어로 컴파일이 되고 CLR에 의해 IL기반의 코드들이 실제로 실행이 되게 되는 것이네요.

대충 CLR이 어떤 일을 한다는 것을 알게 되었습니다. 그렇다면 왜 CLR이라는 걸 만들었는지 CLR의 주변엔 또 어떤 것들이 있는지 주욱- 한번 훑어봐야지 앞으로 진도 나가는데 어려움이 없겠지요.

후아-
오늘은 여기까지 하죠!

'CLR' 카테고리의 다른 글

6. Assembly - GAC(Global Assembly Cache)  (2) 2010.02.02
5. Assembly - Strongly named assemblies  (0) 2010.01.26
4. Assembly  (2) 2010.01.15
3. MSCorLib & Metadata  (4) 2010.01.06
2. CLR! CLR! CLR!  (3) 2009.12.30