상세 컨텐츠

본문 제목

생활코딩 C#02: 코딩과 글쓰기 유사점, C#의 주요 특징, 컴파일 과정

코딩

by Simple Runner 2022. 4. 30. 11:20

본문

생활코딩CS02.md

생활코딩 C#02

미션

  • 코딩과 글쓰기의 유사점에 대해 알아보고,
  • 앞으로 배우게 될 C#의 주요 특징을 둘러보자.
  • 소스코드에서 실행 파일이 되는 과정에 대해 알아보자.

앞글: 생활코딩 C#01: 코딩을 배워야 하는 이유와 C#의 장점

코딩과 글쓰기의 유사점

코딩과 글쓰기는 유사하다. 기본 개념을 비교해 보면 좀 더 쉽게 배울 수 있다. 한가지 차이는 은 사람이 읽고 받아들이는데 반해, 코딩은 컴퓨터가 읽고 받아들여 일을 하는 것이다.

코딩(Coding) 글쓰기 (Writing) 설명
어셈블리(Assembly) 책, 글
프로그램(Program) 문단(文段), 단락(段落) 하나의 글에서 내용이나 형식을 기준으로 하여 크게 나누어 끊은 단위이다.
명령문(Statement) 문장(文章) 생각, 감정, 움직임, 모양 등을 표현하는 최소 단위이다. 문장의 끝에는 마침표, 쉼표, 물음표, 느낌표를 찍는다.
구문(Expression, 식) 구(句, 글귀), 절(節, 마디) 는 둘 이상의 낱말이 묶여 하나의 문장을 이루는 성분으로 쓰이는 말 덩이, 은 주어와 술어가 갖추어진 하나의 말 덩이이다.
토큰(Token) 단어(單語, 낱말), 문자(文字) 하나 이상의 글자로 되어 뜻을 나타내는 말이다.

C#의 주요 특징

C#은 객체 지향(object-oriented, 개체 지향), 더 나아가 컴포넌트 지향(component-oriented) 언어이다. 이 말의 의미는 차차 알아가게 될 것이다. 그리고 추가적인 중요한 특징은 다음과 같다.

  1. 통합 타입 시스템 Unified type system, 통합 형식 시스템)
  2. 가비지 컬렉션(Garbage collection, 가비지 수집): 자동 메모리 관리 기능
  3. 예외 처리(Exception handling): try, catch
  4. 람다식(Lambda expressions): 익명 메서드(Anonymous method)
  5. 쿼리 문법(Query syntax): LINQ
  6. 비동기 처리(Asynchronous operations): async, await
  7. 패턴 매칭 Pattern matching): is
  8. 버전 관리(Versioning): 신규 메서드를 만들 때 기존 것과 호환성 등을 고려하여야 할 경우에 필요한 것들(virtual, override)

위 사항들에 대해서는 앞으로의 글에서 자연스럽게 상세하게 설명하게 될 것이다.

소스코드에서 실행 파일까지

닷넷 아키텍쳐

C# 프로그램은 닷넷(.NET) 위에서 돌아간다. 닷넷은 공통언어런타임(Common language runtime, CLR)이라고 부르는 가상 실행 시스템과 클래스 라이브러리의 세트들로 구성되어 있다. CLR은 마이크로소프트에서 만든 공용언어 인프라구조(Common language infrastructure, CLI)를 구현한 것이다. CLI은 세계 표준이며, 코딩 언어 및 라이브러리들이 서로 심리스하게(Seamlessly) 작동하도록 규정한 프로그램의 실행 및 개발 환경의 기반을 제공한다.

아래 그림에서 보듯이 C# 소스코드는 공용중간언어(Common intermediate language, CIL)로 컴파일된다. 이 중간언어(Intermediate, IL) 코드와 리소스(비트맵, 문자열 등등)들은 어셈블리(Assembly)에 합쳐져 저장된다. 그 후 실행 시에 CLR을 저스트인타임(Just-In-Time, JIT) 컴파일을 통해 네이티브 기계어로 변환하여 프로그램이 돌아가게 한다.

이러한 아키텍쳐 덕분에 CLI를 따르는 다른 언어로 작성된 프로그램 및 라이브러리 등과 혼용될 수 있는 장점이 있다.

컴파일 프로세스

아래 다이어그램은 소스코드로 부터 컴퓨터가 이해하여 중간언어(CIL) 코드로의 변환 또는 컴파일이 어떻게 진행되는지를 좀더 구체적으로 나타낸 것이다.

flowchart LR A(소스 파일) --> |변환| B(유니코드 문자열) B --> |어휘 분석| C(토큰 스트림) C --> |구문 분석| D(실행 코드)
  • 변환(Transformation)은 소스파일들을 유니코드로 변환하는 것을 말한다. C#에서는 유니코드는 UTF-8 인코딩을 추천한다.
  • 어휘분석(Lexical analysis)은 어휘 문법(Lexical grammar)을 기준으로 유니코드 문자열을 다음 5가지로 변환한다.
    1. 라인 터미네이터(line terminators)
    2. 화이트 스페이스(white space)
    3. 코멘트(comments, 주석)
    4. 토큰(tokens)
    5. 전처리 지시자(pre-processing directives)
  • 구문분석(Syntactic analysis)은 구문문법(Syntactic grammar, 토큰들이 어떻게 결합하여 프로그램을 구성하는지에 대한 것)을 기준으로 실행 코드를 만든다.

코딩의 핵심

이제까지의 내용은 알고만 있으면 되고, 코딩할 때 중요한 지식은 아니다. 우리가 꼭 기억해야 할 코딩의 핵심은 문법, 그중에서도 구문문법(Syntactic grammar)을 반복하여 익혀서 글을 읽고 쓰듯이, 내가 원한는대로 읽고 쓸 수 있도록 해야 한다는 것이다. 다들 알겠지만 읽는 것은 쉽게 할 수 있게 되지만, 쓰는 것에 익숙해져서 유려한 글을 쓰는 것은 많은 연습이 필요하다.

이제는 C#의 프로그래밍 구조를 Top-down으로 분석해보자.

관련글 더보기