CLR(Common Language Runtime) feat.JVM

2경빈·2025년 1월 10일

C#

목록 보기
12/14

1. IL (Intermediate Language)란?

IL은 .NET에서 컴파일된 코드의 중간 단계 언어.

  • C#이나 VB.NET 같은 고수준 언어로 작성된 소스 코드가 컴파일러에 의해 IL로 변환된다.
  • IL은 플랫폼 독립적이며, .NET 런타임(CLR)에서 실행될 준비가 된 명령어들의 집합이다.

2. CLR (Common Language Runtime)의 역할

CLR은 .NET의 실행 환경으로, IL을 실제 실행 가능한 코드로 변환하고 실행을 관리한다.

  • CLR 내부의 JIT (Just-In-Time) 컴파일러가 IL을 기계어(Assembly Language)로 변환한다.
  • 변환된 기계어는 CPU가 직접 실행한다.

3. 작동 흐름

  1. 소스 코드 작성:

    Console.WriteLine("Hello, World!");

    위와 같은 고수준 코드 작성.

  2. 컴파일:
    C# 컴파일러(csc.exe)가 소스 코드를 IL로 컴파일. 결과물은 .dll 또는 .exe 형식의 어셈블리 파일이 생성됨.

  3. IL 실행 준비:
    CLR이 어셈블리를 로드하고, IL을 JIT 컴파일러를 통해 기계어로 변환.

  4. 기계어 실행:
    변환된 기계어 코드가 CPU에서 실행.

.NET에서 사용되는 컴파일 도구들

csc: C# 소스 코드 컴파일 (기본적으로 C# 코드만 컴파일).
vbc: Visual Basic 소스 코드 컴파일 (VB.NET 코드 컴파일).
ilasm: IL(Intermediate Language) 코드 컴파일 (직접 IL 코드에서 실행 파일 생성).
msbuild: 빌드 시스템 (프로젝트 파일을 통해 C# 프로젝트를 빌드).


4. 장점

  • 플랫폼 독립성: IL은 운영체제나 CPU에 종속적이지 않아서 여러 플랫폼에서 동일한 IL을 실행 가능.
  • 언어 간 상호 운용성: .NET의 여러 언어(C#, VB.NET, F# 등)가 동일한 IL로 변환되므로 서로 간의 상호 작용이 쉽다.
  • 최적화: JIT 컴파일이 실행 중의 환경(CPU, OS 등)에 맞는 최적화를 수행한다.

5. 예시

C# 코드

public class Program
{
    public static void Main()
    {
        int x = 10;
        int y = 20;
        Console.WriteLine(x + y);
    }
}

컴파일된 IL 코드 (부분)

.method public hidebysig static void Main() cil managed
{
    .entrypoint
    // 로컬 변수 선언
    .locals init ([0] int32 x, [1] int32 y)

    // x = 10
    ldc.i4.s 10
    stloc.0

    // y = 20
    ldc.i4.s 20
    stloc.1

    // Console.WriteLine(x + y)
    ldloc.0
    ldloc.1
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}
  • ldc.i4.s 10: 정수 10을 로드.
  • stloc.0: 로드한 값을 로컬 변수 x에 저장.
  • add: 두 값을 더함.

6. 결론

IL은 고수준 언어와 CPU가 실행할 기계어 사이의 중간 단계 언어로, .NET의 핵심 기술 중 하나이다. 이를 통해 .NET은 플랫폼 독립성을 확보하고, 다양한 언어를 하나의 런타임에서 실행 가능하게 한다.


Feat. JVM

Java와 JVM(Java Virtual Machine)도 .NET의 IL(CIL)과 CLR과 매우 유사한 개념을 가진다. 둘 다 중간 언어(Intermediate Language)가상 머신(Virtual Machine)을 사용해 코드를 실행한다.


Java와 JVM의 실행 과정

  1. 소스 코드 작성:
  • Java로 작성된 소스 코드(.java 파일).
  1. 컴파일:
  • Javac라는 Java 컴파일러가 .java 파일을 컴파일하여 바이트코드(Bytecode)로 변환한다.
  • 이 바이트코드는 .class 파일로 저장된다.
  • 바이트코드는 CPU가 직접 실행하지 못하는 중간 언어이다.
  1. JVM(Java Virtual Machine):
  • .class 파일의 바이트코드를 JVM이 읽어 실행.
  • JVM은 바이트코드를 실행 가능한 기계어로 변환한다.
    • JIT(Just-In-Time) 컴파일러: 실행 중에 바이트코드를 기계어로 변환한다.
    • 이 과정을 통해 성능 최적화와 플랫폼 독립성을 제공한다.
  1. 기계어 실행:
  • JIT 컴파일된 기계어 코드가 CPU에서 실행된다.

Java와 .NET의 유사점

  1. 중간 언어:
  • Java는 바이트코드(Bytecode)를 사용.
  • .NET은 중간 언어(IL, Intermediate Language)를 사용.
  1. 가상 머신:
  • Java는 JVM을 사용하여 바이트코드를 실행.
  • .NET은 CLR을 사용하여 IL을 실행.
  1. JIT 컴파일:
  • 두 환경 모두 JIT(Just-In-Time) 컴파일러를 사용하여 실행 시점에 바이트코드/IL을 기계어로 변환.
  1. 플랫폼 독립성:
  • Java는 JVM이 설치된 모든 플랫폼에서 실행 가능.
  • .NET은 초기에는 Windows 중심이었으나, 지금은 .NET Core/.NET을 통해 다양한 플랫폼에서 실행 가능.

차이점

  1. 초기 목적:
  • Java는 처음부터 플랫폼 독립성을 목적으로 설계되었다.
  • .NET은 Windows 생태계를 위한 플랫폼 중심으로 시작했으나, 이후 플랫폼 독립성을 추구.
  1. 바이트코드와 IL:
  • Java의 바이트코드는 JVM에서 실행만을 위해 설계되었다.
  • .NET의 IL은 더 많은 메타데이터를 포함하며, 리플렉션 등 다양한 런타임 기능을 지원한다.
  1. 멀티 플랫폼:
  • Java는 JVM 덕분에 처음부터 멀티 플랫폼 지원.
  • .NET은 .NET Core 이후로 멀티 플랫폼 지원이 확장된다.

요약

Java와 JVM은 .NET의 IL과 CLR 개념과 매우 유사하다. 둘 다 소스 코드를 중간 언어로 컴파일한 후 가상 머신에서 실행하며, JIT 컴파일러를 통해 기계어로 변환해 실행하는 구조를 가진다. 다만 Java는 플랫폼 독립성에 더 초점을 두었고, .NET은 Windows 중심에서 시작했으나 현재는 멀티 플랫폼 지원으로 방향을 확장한다.

profile
eggs before hatching

0개의 댓글