readme.md 2023. 2. 7. 19:56

https://www.learncpp.com/

0.2 프로그래밍 언어 소개

컴퓨터 프로그램(혹은 애플리케이션, 응용프로그램)은 컴퓨터가 정해진 순서대로 작업을 처리할 수 있는 명령어의 집합으로 만들어진다. 프로그래밍은 이러한 프로그램을 만드는 일련의 과정을 의미하며, 프로그래머는 일반적으로 소스 코드를 통해 프로그램을 만들어 낸다. 컴퓨터 프로그램이 메모리에 로드되면 하드웨어가 순차적으로 명령어를 실행하여 프로그램을 실행하게 된다.

기계어(Machine Language)

컴퓨터의 CPU는 C++를 이해할 수 없다. CPU가 이해할 수 있는 언어는 기계어(명령어 집합) 뿐이다.(10110000 01100001) 따라서 컴퓨터 발명 초기에는 프로그래머가 프로그램을 기계어로 직접 작성해야 했다. 기계어에서 중요한 특징은 두 가지가 있다.

  • 각 명령어는 1 또는 0으로 구성된 시퀀스들로 만들어진다. 각각의 1 또는 0은 비트라고 부른다.
  • CPU는 명령어를 해석하여 특정 작업을 처리하는데, CPU 모델이 다르면 사용되는 명령어 집합 역시 달라진다. 따라서 프로그램은 일반적으로 다른 시스템으로의 이식이 불가능하다. 이식을 위해서는 새로운 시스템에 맞게 다시 작성되어야 한다.

어셈블리어(Assembly Language)

기계어는 사람이 읽고 이해하기가 어려웠기 때문에 어셈블리어가 만들어졌다.(mov al, 061h) 어셈블리어는 기계어에 비해 사람이 훨씬 읽고 쓰기 쉽지만, CPU는 어셈블리를 직접 이해할 수 없다. 따라서 어셈블리어로 작성된 프로그램은 기계어로 번역이 되야 했고, 이 작업은 어셈블러라고 불리는 프로그램에서 처리된다. 어셈블리어로 작성된 프로그램은 빠르기 때문에 지금도 속도가 중요한 분야에서는 사용되고 있다.

그러나 어셈블리어는 몇 가지 단점을 가지고 있다.

  • 어셈블리어는 기계어 보단 읽고 쓰기 쉽지만 여전히 간단한 작업 처리를 위해서 많은 수의 명령어가 필요하다.
  • 각 명령어는 사람이 읽을 수 있지만, 전체 프로그램을 어셈블리어로 이해하는 것은 여전히 어려운 일이다.
  • 어셈블리어는 기계어와 마찬가지로 다른 시스템에 이식이 어렵다.

고급 언어(High-level Languages)

기계어, 어셈블리어가 가진 가독성과 이식성 문제를 해결하기 위해 C, C++과 같은 언어가 개발됐다. 이런 언어를 고급 언어라고 부르며, 프로그래머가 오로지 프로그램을 작성하는 데에만 집중할 수 있도록 만들어졌다. 고급 언어를 사용하는 프로그래머는 프로그램이 실행되는 시스템에 대한 걱정을 하지 않아도 된다.

어셈블리어와 마찬가지로 고급 언어로 작성된 프로그램은 컴퓨터가 이해할 수 있도록 번역이 되야 한다. 주로 사용되는 두 가지 방법이 있다.

컴파일

  • 컴파일러는 소스 코드를 읽고 그 자체로 실행 가능한 파일을 만들어내는 프로그램이다.
  • 소스 코드가 실행 가능한 파일로 변하면 프로그램을 실행하기 위해서 다시 컴파일을 실행할 필요가 없다.
  • C++는 일반적으로는 컴파일된다.

인터프리터

  • 인터프리터는 소스 코드를 읽고 컴파일을 하지 않고 바로 실행 가능한 상태로 만들어 명령을 곧바로 실행하는 프로그램이다.
  • 컴파일러에 비해 유연하지만 프로그램 실행 중에 항상 인터프리팅 작업을 해야하기 때문에 비효율적인 부분이 있다.

고급 언어를 사용했을 때의 장점은 다음과 같다.

  • 고급 언어로 작성된 프로그램은 실제 사람이 사용하는 언어와 가깝기 때문에 가독성이 좋다.
  • 기계어, 어셈블리어와 비교했을 때, 같은 작업을 실행해도 더 적은 명령어를 필요로 한다.
  • 프로그램이 다양한 시스템에 맞게 컴파일/인터프리팅 될 수 있다.

C++ 컴파일러가 소스 코드를 컴파일 하면 오브젝트 파일({name}.o)이 생성된다. 오브젝트 파일은 기계어이기 때문에 CPU가 읽을 수 있다. 오브젝트 파일이 생성되었으면 링커라는 프로그램이 오브젝트 파일을 묶어서 하나의 실행 가능한 프로그램으로 만든다. 이 과정에서 링커는 라이브러리 파일을 함께 묶어주기도 한다. 여기에 소스 코드 사이에 의존 관계가 있는 경우에 링커는 적절한 소스 코드를 연결해서 의존 관계로 인한 에러가 발생하지 않도록 도와준다.(LEARN C++ 0.5 내용 요약)