최신 컴퓨터는 엄청나게 빠르며 점점 더 빨라지고 있습니다. 그러나 컴퓨터에는 몇 가지 중요한 제약이 있습니다. 기본적으로 정해진 명령의 집합만 이해하고 수행할 작업을 정확히 알려줘야 합니다. 컴퓨터 프로그램(일반적으로 응용 프로그램이라고도 함)은 컴퓨터가 일부 작업을 수행하기 위해 수행할 수 있는 일련의 명령입니다. 프로그램을 만드는 과정을 프로그래밍이라고 합니다. 프로그래머는 일반적으로 하나 이상의 텍스트 파일에 입력된 명령 목록인 소스 코드(일반적으로 코드로 축약됨)를 생성하여 프로그램을 만듭니다. 컴퓨터를 구성하고 프로그램을 실행하는 물리적 컴퓨터 부품의 집합을 하드웨어라고 합니다. 컴퓨터 프로그램이 메모리에 로드되고 하드웨어가 각 명령을 순차적으로 실행할 때 이를 프로그램 실행 또는 실행이라고 합니다.
Machine Language(기계어)
컴퓨터의 CPU는 C++ 명령어를 수행할 수 없습니다. CPU가 직접 이해할 수 있는 제한된 명령어 집합을 기계어(또는 기계어 또는 명령어 집합)라고 합니다.
다음은 샘플 기계어 명령입니다. 10110000 01100001
컴퓨터가 처음 발명되었을 때 프로그래머는 기계어로 직접 프로그램을 작성해야 했으며 이는 매우 어렵고 시간이 많이 걸리는 작업이었습니다.
이러한 명령(instruction)을 구성하는 방법은 이 소개의 범위를 벗어나지만 두 가지 사항에 유의하는 것이 좋습니다. 첫째, 각 명령어는 1과 0의 시퀀스로 구성됩니다. 각 개별 0 또는 1을 이진 숫자 또는 줄여서 비트라고 합니다. 단일 명령을 구성하는 비트 수는 다양합니다. 예를 들어 일부 CPU는 항상 32비트 길이의 명령을 처리하는 반면 일부 다른 CPU(예: 사용 중인 x86 제품군)에는 다음과 같은 가변 길이 명령이 있습니다.
둘째, 각 이진 숫자 세트는 CPU에 의해 이 두 숫자를 비교하거나 이 숫자를 해당 메모리 위치에 넣는 것과 같은 매우 특정한 작업을 수행하는 명령으로 해석됩니다. 그러나 CPU마다 명령어 세트가 다르기 때문에 한 CPU 유형에 대해 작성된 명령어는 동일한 명령어 세트를 공유하지 않는 CPU에서 사용할 수 없습니다. 이것은 일반적으로 프로그램이 다른 유형의 시스템으로 이식될 수 없었고(주요 재작업 없이 사용 가능) 처음부터 다시 작성해야 함을 의미했습니다.
Assembly Language(어셈블리어)
기계어는 인간이 읽고 이해하기가 너무 어렵기 때문에 어셈블리 언어가 발명되었습니다. 어셈블리 언어에서 각 명령어는 비트 집합이 아닌 짧은 약어로 식별되며 이름 및 기타 숫자를 사용할 수 있습니다. 다음은 어셈블리 언어에서 위와 동일한 명령입니다. mov al, 061h
이것은 어셈블리언어를 기계어보다 훨씬 더 읽고 쓰기 쉽게 만듭니다. 그러나 CPU는 어셈블리 언어를 직접 이해할 수 없습니다. 대신 어셈블리 프로그램은 컴퓨터에서 실행되기 전에 기계어로 번역되어야 합니다. 이것은 어셈블러라는 프로그램을 사용하여 수행됩니다. 어셈블리 언어로 작성된 프로그램은 매우 빠른 경향이 있으며 속도가 중요한 오늘날에도 어셈블리가 사용됩니다.
그러나 조립에는 여전히 몇 가지 단점이 있습니다. 첫째, 어셈블리 언어는 간단한 작업을 수행하는 데에도 여전히 많은 명령(instruction)이 필요합니다. 개별 명령 자체는 사람이 읽을 수 있지만 전체 프로그램이 수행하는 작업을 이해하는 것은 어려울 수 있습니다(각 문자를 개별적으로 보고 문장을 이해하려고 하는 것과 약간 비슷합니다). 둘째, 어셈블리 언어는 여전히 이식성이 좋지 않습니다. 한 CPU용 어셈블리로 작성된 프로그램은 다른 명령어 세트를 사용하는 하드웨어에서 작동하지 않을 가능성이 높으며 다시 작성하거나 광범위하게 수정해야 합니다.
High-level Languages(고급언어)
가독성 및 이식성 문제를 해결하기 위해 C, C++, Pascal(및 이후에는 Java, Javascript 및 Perl과 같은 언어)과 같은 새로운 프로그래밍 언어가 개발되었습니다. 이러한 언어는 프로그래머가 프로그램이 실행될 컴퓨터의 종류에 대해 걱정할 필요 없이 프로그램을 작성할 수 있도록 설계되었기 때문에 고급 언어라고 합니다.
다음은 C/C++에서 위와 동일한 명령입니다. a = 97;
어셈블리 프로그램과 마찬가지로 고급 언어로 작성된 프로그램은 실행되기 전에 컴퓨터가 이해할 수 있는 형식으로 번역되어야 합니다. 컴파일과 해석이라는 두 가지 기본 방법이 있습니다.
컴파일러는 소스 코드를 읽고 실행할 수 있는 독립 실행형 실행 프로그램을 생성하는 프로그램입니다. 코드가 실행 파일로 바뀌면 프로그램을 실행하기 위해 컴파일러가 필요하지 않습니다. 처음에 컴파일러는 원시적이었고 느리고 최적화되지 않은 코드를 생성했습니다. 그러나 수년에 걸쳐 컴파일러는 빠르고 최적화된 코드를 생성하는 데 매우 능숙해졌으며 어떤 경우에는 어셈블리 언어에서 사람이 할 수 있는 것보다 더 나은 작업을 수행할 수 있습니다!
다음은 컴파일 프로세스를 단순화한 표현입니다.
C++ 프로그램은 일반적으로 컴파일되므로 곧 컴파일러에 대해 자세히 살펴보겠습니다.
인터프리터는 먼저 실행 파일로 컴파일할 필요 없이 소스 코드의 명령을 직접 실행하는 프로그램입니다. 인터프리터는 컴파일러보다 유연한 경향이 있지만 프로그램을 실행할 때마다 해석 프로세스를 수행해야 하기 때문에 프로그램을 실행할 때 효율성이 떨어집니다. 이것은 프로그램이 실행될 때마다 인터프리터가 필요하다는 것을 의미합니다.
다음은 해석 프로세스를 단순화한 표현입니다.
Optional reading
컴파일러와 인터프리터의 장점에 대한 좋은 비교는 여기에서 찾을 수 있습니다.
대부분의 언어는 컴파일되거나 해석될 수 있지만 전통적으로 C, C++ 및 Pascal과 같은 언어가 컴파일되는 반면 Perl 및 Javascript와 같은 "스크립팅" 언어는 해석되는 경향이 있습니다. Java와 같은 일부 언어는 두 가지를 혼합하여 사용합니다.
고급 언어에는 많은 바람직한 속성이 있습니다.
첫째, 고급 언어는 명령이 우리가 매일 사용하는 자연어에 더 가깝기 때문에 읽고 쓰기가 훨씬 쉽습니다. 둘째, 고급 언어는 저급 언어와 동일한 작업을 수행하기 위해 더 적은 명령을 필요로 하므로 프로그램이 더 간결하고 이해하기 쉽습니다. C++에서는 = b * 2 + 5; 한 줄로. 어셈블리 언어에서는 5~6개의 다른 명령어가 필요합니다.
셋째, 프로그램은 다양한 시스템에 대해 컴파일(또는 해석)될 수 있으며 다른 CPU에서 실행되도록 프로그램을 변경할 필요가 없습니다(해당 CPU에 대해 다시 컴파일하기만 하면 됨). 예로서:
이식성에는 두 가지 일반적인 예외가 있습니다. 첫 번째는 Microsoft Windows와 같은 많은 운영 체제에는 코드에서 사용할 수 있는 플랫폼별 기능이 포함되어 있다는 것입니다. 이것들을 사용하면 특정 운영 체제용 프로그램을 훨씬 쉽게 작성할 수 있지만 이식성을 희생해야 합니다. 이 자습서에서는 플랫폼별 코드를 사용하지 않습니다.
일부 컴파일러는 컴파일러별 확장도 지원합니다. 이러한 확장을 사용하면 수정 없이 동일한 확장을 지원하지 않는 다른 컴파일러에서 프로그램을 컴파일할 수 없습니다. 나중에 컴파일러를 설치한 후에 이에 대해 더 자세히 설명하겠습니다.
Rules, Best practices, and warnings
이 튜토리얼을 진행하면서 다음 세 가지 범주 아래에서 많은 중요한 사항을 강조할 것입니다.
Rules
Rules는 언어에서 요구하는 대로 수행해야 하는 지침입니다. 규칙을 준수하지 않으면 일반적으로 프로그램이 작동하지 않습니다.
Best practices
Best practices는 작업을 수행하는 방법이 일반적으로 표준으로 간주되거나 적극 권장되기 때문에 수행해야 하는 작업입니다. 즉, 모든 사람이 그렇게 하거나(그렇지 않으면 사람들이 기대하지 않는 일을 하게 될 것입니다), 어떠한 다른 작업보다 중요합니다.
Warnings
Warning은 일반적으로 예기치 않은 결과를 초래할 수 있으므로 해서는 안 되는 일입니다.
References : https://www.learncpp.com/cpp-tutorial/introduction-to-programming-languages/
'C++ (learncpp) > Introduction - Getting Started' 카테고리의 다른 글
0.6 — Installing an Integrated Development Environment (IDE) (0) | 2021.10.19 |
---|---|
0.5 — Introduction to the compiler, linker, and libraries (0) | 2021.10.18 |
0.4 — Introduction to C++ development (0) | 2021.10.18 |
0.3 — Introduction to C/C++ (0) | 2021.10.16 |
0.1 — Introduction to these tutorials (0) | 2021.10.15 |