1. 프로그래밍이란?

더보기

1.1 컴퓨터 동작

 

컴퓨터는 다양한 하드웨어 부품으로 이루어져 있습니다.

복잡해 보이는 컴퓨터가 실행되는 원리는 매우 간단합니다.

전기 신호가 “있다"  “없다" 라는 두 가지 상태만으로 동작합니다.

 

조금 더 자세히 말하자면, 컴퓨터는 “있다" 와 “없다"로 이루어진 패턴에 맞춰 특정 동작을 실행합니다.

개발자는 “있다" 와 “없다" 라는 두 가지 상태를 0과 1이라는 숫자를 사용해 패턴을 만듭니다.

 

즉, 개발자가 컴퓨터를 동작시키려면 0과 1로 이루어진 10011011 과 같은 패턴 만들어 컴퓨터에게 보내면, 패턴에 맞는 동작을 컴퓨터가 실행시킵니다.

 

 

 

 

1.2 기계어 (Machine Code)

 

0과 1로 이루어진 기계어는 컴퓨터에게, 정확하게 말하자면 CPU에게 던져주면 바로 해독할 수 있는 유일한 언어입니다.

기계의 언어라는 의미로 "기계어" 라고 하며, 비트단위로 표기하기 때문에 0과 1로만 표현됩니다.

 

 

기계어의 문제점 

  1. 최악의 가독성을 가진다.  간단한 연산문도 옆으로 길게 늘어져 개발자가 구분하기 어렵다.
  2. 호환성과 이식성이 없다. 엄밀히 말하면, 기계어는 특정 언어가 아니다. 단지 CPU 제조사에서 공개하는 CPU 명령어 집합이기 때문에 CPU가 변경되면 기계어가 달라지는 것이다. 개발자는 기계마다 달라지는 언어를 배워야 한다.

 

이 문제를 해결하기 위해 등장한 것이 어셈블리어입니다.

 

 

 

 

1.3 어셈블리어 (Assembly Language)

 

(어셈블리 언어(Assembly Language)와 C#의 어셈블리(Assembly)는 다릅니다.)

 

프로그래밍 언어의 하나입니다.

기계어(0, 1)보다 한 단계 위의 언어이지만, 기계어와 함께 단 둘인 저급(Low Level) 언어에 속합니다.

저급은 '수준이 낮다'라는 의미가 아니라 '하드웨어에 가까운'이란 의미입니다.

 

기계어라는 게 컴퓨터 관점에서 바로 읽을 수 있다는 것 빼고는 인간의 관점에서는 사용이 불편한 언어입니다.

이를 보완하기 위해 기계어를 문자와 매칭시킨 것이 어셈블리어입니다.

 

 

어셈블리어의 문제점

  1. CPU가 채택한 명령어 셋(ISA)에 따라 어셈블리어가 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없습니다.
  2. 하드웨어마다 다른 기계어와 어셈블리어를 사용합니다. 기계어(바이너리, 0, 1)가 영어 문자로 바뀐 상태일 뿐, 근본적인 문제 자체는 바뀌지 않았습니다.

 

 

 

 

1.4 어셈블리어 프로그래밍

 

 

어셈블리어 프로그래밍은 어디까지나 기계어(0, 1) 에 비해 생산성이 높아졌을 뿐, 고급 언어에 비하면 생산성이 매우 떨어집니다. 

한 예로, Python으로 위의 기계어나 어셈블리 언어와 똑같은 결과를 출력하려면 print("Hello, world") 한 줄이면 충분합니다.

 

 

개발자는 각 CPU가 채택한 명령어 셋(ISA)을 배워야 합니다.

CPU 마다 각기 다른 C/C++ 프로그래밍 언어를 새로 배운다고 생각하시면 됩니다.

 

 

 

 

1.5 고급 언어 프로그래밍

 

 

 

 

 

1.6 빌드와 실행

 

 

 

 

 

1.7 개발환경

 

일반적은 소프트웨어 개발은, 특정 프로그래밍 언어 문법에 맞춘 소스코드 문서를 작성하고

소스코드를 운영체제와 아키텍처에 맞는 컴파일러를 사용해 실행이 가능한 기계어로 변환하는 작업을 진행합니다.

이때 결과물은, 특정 운영체제와 아키텍처에 종속된 네이티브 언어(기계어)로 만들어진 프로그램입니다.

 

 

 

 

 

1.8 예시 - Visual Studio Code Editor

 

하나의 가정으로, 만약 위와 같은 방법으로 Visual Studio Code Editor 를 만든다고 가정합니다.

모든 운영체제와 아키텍처에 공통된 기능을 제공하는 애플리케이션을 만든다면, 의운영체제마다, 그리고 아키텍처 별로 프로그램을 개발환경을 다르게 세팅하고 개발해야 합니다.

 

Visual Studio Code 는 Windows, Linux, Mac 운영체제와 x64, Arm32, Arm64, Apple Cilicon 아키텍처 모두 지원합니다.

하지만 각각의 프로그램은 서로 다른 운영체제에서 호환되는 실행 파일이 아닙니다.

 

 

 

 

 

01.8 프로그래밍

 

 

 

 

2. C# 빌드

더보기

2.1 C# 빌드 구조

 

C# 프로그램을 만드는 경우 대개 exe 또는 dll 파일을 만들게 됩니다.

C# 소스코드를 컴파일하면, C/C++ 빌드 결과 처럼  바이너리 형태의 기계가 직접적으로 실행 가능한 기계어 형태가 아닙니다. 기계어가 아닌 중간 언어라는 특별한 언어로 구현된 결과물을 만들게 됩니다.

 

 

 

 

 

2.2 CIL(Common Intermediate Language, 공통 중간 언어)

 

C# 의 컴파일 결과물은 CIL(Common Intermediate Language, 공통 중간 언어)이라는 중간언어로 된 실행 파일입니다.

 

닷넷에서는 이러한 실행 파일을 Assembly(어셈블리)라고 하는데, 어셈블리는 .net 응용 프로그램의 가장 작은 배포 단위이다. dll 또는 exe 으로 주로 두 가지 유형이 있습니다.

 

닷넷 런타임 환경에서 실행할 수있는 중간언어로 컴파일 된 코드 덩어리로, 기계어가 아니기 때문에 CPU가 직접 실행할 수 없습니다.  CPU에서 직접 실행되는 기계와다 달리, 중간 언어는 반드시 닷넷 프레임워크 가상머신 위에서만 동작합니다. 

 

일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되어 특정 운영체제 플랫폼과 아키텍처에 종속되지만, C# 의 컴파일 결과물인 중간 코드 형태의 어셈블리는 CPU에 독립적인 형태로 닷넷 프레임워크 가상머신 위에서만 동작합니다. 

 

 

 

 

2.3 중간 언어 소스코드 확인하기

 

2.3.1 아래와 같은 C# 소스코드를  빌드해 봅시다.

using System;

namespace ILTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int a = 0, b = 1;
            int c = a + b;
            Console.WriteLine("Hello World {0}", c);
        }
    }
}

 

실행 결과

 

 

 

 

2.3.2 파일 탐색기에서 ildasm.exe 가 설치된 경로로 이동합니다.

(경로는 설치된 프레임워크에 따라 버전이 상이할 수 있습니다.)

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools

 

 

 

 

2.3.3  ildasm.exe 프로그램을 실행합니다.

빌드한 C# 실행파일(exe)을 열어줍니다.

 

 

 

 

 

Ilasm.exe

IL 어셈블러는 IL 어셈블리에서 PE(이식 가능한 실행) 파일을 생성합니다.

 

ildasm.exe 

IL 디어셈블러는 IL 어셈블러(Ilasm.exe)의 자매 도구입니다. Ildasm.exe는 IL(intermediate language) 코드가 포함된 PE(이식 가능한 실행) 파일을 가져와서 Ildasm.exe에 입력하기에 적합한 텍스트 파일을 만듭니다.

Assembly

어셈블리는, 어셈블리 언어가 아닙니다. 

C# 빌드 결과물인 어셈블리는 실행 파일( .exe) 또는 동적 연결 라이브러리( .dll) 파일의 형태의 실행 파일을 Assembly(어셈블리리)라는 단위로 사용합니다.

 

3. C# 실행

더보기

3.1 C# 실행 구조

 

일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행됩니다.

하지만 닷넷을기반 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서 가상머신을 거처 실행됩니다.

 

 

 

 

 

3.2. CLR(Common Language Runtime,  공용 언어 런타임)

 

CLR(Common Language Runtime, 공용 언어 런타임)

 

어셈블리 형태의 중간 코드는 CLR(Common Language Runtime) 가상머신 위에서 동작할 때, CLR이 IL 중간언어를 CPU가 실행 가능한 기계어로 최종 번역하여 프로그램을 실행합니다.

 

닷넷 프레임워크를 설치하면 가상 머신 역할을 하는 CLR 구성요소가 실행될 수 있는 환경이 윈도우 운영체제에 마련됩니다.

 

닷넷 기반의 exe/dll 프로그램이 실행되면, CLR을 로드하는 코드를 exe/dll 내부에 적재합니다.

CLR은 닷넷 기반 프로그램(exe, dll)이 실행되면 메모리에 함께 적제되어 실행됩니다.

 

이후 닷넷 프레임워크 개념을 설명하겠습니다.

 

 

 

 

(참고) 닷넷 프레임워크 기본 설치

 

Windows: 윈도우 XP, 윈도우 서버 부터 .NET Framework 1.0는 윈도우에 기본으로 설치되어 있습니다.

  • Windows XP: .NET Framework 1.0
  • Windows Server 2003: .NET Framework 1.1
  • Windows Vista / Windows Server 2008: .NET Framework 3.0
  • Windows 7 / Windows Server 2008 R2: .NET Framework 3.5
  • Windows 8 / Windows Server 2012: .NET Framework 4.5
  • Windows 8.1 / Windows Server 2012 R2: .NET Framework 4.5.1

 

Windows 10: 

  • :초기 릴리스 (1507): .NET Framework 4.6
  • Threshold 2 (1511): .NET Framework 4.6.1
  • Anniversary Update (1607) / Windows Server 2016: .NET Framework 4.6.2
  • Creators Update (1703): .NET Framework 4.7
  • Fall Creators Update (1709): .NET Framework 4.7.1
  • April 2018 Update (1803): .NET Framework 4.7.2
  • October 2018 Update (1809) / Windows Server 2019: .NET Framework 4.7.2
  • May 2019 Update (1903): .NET Framework 4.8
  • November 2019 Update (1909): .NET Framework 4.8
  • May 2020 Update (2004): .NET Framework 4.8
  • October 2020 Update (20H2): .NET Framework 4.8

 

Windows 11:

  • (서버 2022) .NET Framework 4.8이 기본으로 설치되어 있습니다.

 

4. CLI (Common Language Infrastructure, 공용 언어 기반구조)

더보기

4.1 닷넷(.NET)의 프로그래밍 언어

  • C# (씨샵으로 발음)
  • F# (에프샵으로 발음)
  • VB (Visual Basic, 비주얼 베이직)
  • C++/CLI 지원(최신)
  • 공용 언어 인프라(CLI) 언어
  • COBOL, Lisp, Python, PHP, Ruby 등

 

 

4.2 닷넷(.NET) 호환 프로그래밍 언어와 공통 중간 언어(CIL)

 

닷넷 호환 언어 중 어떤 언어라도 빌드 결과물로 중간 언어로 된 어셈블리를 생성해 낸다면, 닷넷 프레임워크 가상머신이 그것을 실행할 수 있습니다. 이처럼 중간언어로 변역하는 언어를 닷넷 호환 언어(.NET Compliant Language) 라고 합니다.

 

C#은 그러한 언어 중 하나입니다.

 

닷넷 호환 언어는 중간 코드라는 동일한 결과물을 가지기 때문에, 상호 호출 가능합니다.

예를 들어 C#으로 만든 클래스를 F#에서 사용할 수 있고, 심지어 다른 클래스까지 상속받을 수 있습니다.

 

 

 

 

 

4.3 CLI (Common Language Infrastructure, 공용 언어 기반구조)

 

CLI는 Microsoft 에서 ECMA 표준으로 제정한 공개 표준이다.

CTS 명세서, 중간 언어에 대한 코드 정의, 메타데이터와 이진 파일의 구조까지 표준 사양으로 기술하고 있다.

CLI 사양은 누구나 임의로 구현할 수 있도록 공개되어 있으며, CLI 사양을 준수한 구현체에서 동작하는 닷넷 파일은 다른 구현체에서 실행하는 것이 가능하다. CLI 표준을 Microsoft 에서 구현한 실체가 바로 CLR 이다.

 

닷넷(.NET) 프레임워크 외에, 닷넷 코어(.NET Core) 프레임워크, 자마린/모노(Xamarin/Mono) 프레임워크 라는 또 다른 CLI 구현제가 있다.

 

 

 

 

 

4.4 CTS (Common Type System, 공용 타입 시스템)

 

닷넷 호환 언어가 지켜야 할 타입(Type)의 표준을 정의한 것이다.

C#과 VB, 닷넷 언어는 CTS가 정의한 타입 시스템의 일부를 자신들의 프로그래밍 언어 사양에 맞게 선택적으로 구현하고 있다.

 

새로운 닷넷 호환 언어를 만든다면 CTS 표준을 넘어선 새로운 타입을 구현할 수는 없지만,  정의된 모든 규격을 구현할 필요 없이 필요하지 않은 부분까지 모두 대응할 필요는 없다.

 

 

 

 

4.5 CLS (Common Language Specification, 공용 언어 사양)

 

닷넷 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이다.

새로운 닷넷 호환 언어를 만든다면 CTS 전체를 구현할 필요는 없지만 CLS에 명시된 사양만큼은 모두 완벽히 구현해야 한다. 그래야만 언어가 다르더라도 닷넷 호환 언어끼리 상호 상속같은 기능이 가능하다.

 

 

05. 닷넷 프레임워크

더보기

.NET Framework

닷넷의 프레임워크 중, 이름이 .NET Framework 라는 이름의 프레임워크입니다.

.NET의 최초 구현체입니다.

Windows 운영체제에서만 동작하는 웹 사이트, 서비스, 데스크톱 앱 등을 실행하는 것을 지원합니다.


.NET(.NET Core)

Windows, Linux 및 macOS에서 웹 사이트, 서비스 및 콘솔 앱을 실행하기 위한 플랫폼 간 구현체입니다. 

.NET은 GitHub의 오픈 소스.

.NET은 이전에 .NET Core라고 했습니다.


Xamarin/Mono

iOS 및 Android를 포함한 모든 주요 모바일 운영 체제에서 앱을 실행하기 위한 .NET 구현입니다.

 

06. 닷넷 스텐다드

더보기

.NET Standard

.NET 구현에서 공통적인 API의 공식 사양입니다.

이렇게 하면 동일한 코드와 라이브러리를 다른 구현에서 실행할 수 있습니다.