컴퓨터는 크게 3가지로 구분된다. CPU(중앙처리장치), RAM(주기억장치, 메모리) , 보조기억장치(HDD)
그리고 출력장치(모니터, 스피커, 프린터 등)와 입력장치(키보드, 마우스, 카메라 등)로 연산할 데이터를 입력하고 연산된 결과데이터를 출력받는다.
우리가 프로그래밍 언어로 작성한 파일은 컴파일러(혹은 인터프리터)로 0과 1로만 구성된 바이트 파일(. exe,. elf)로 바뀌게 된다. 이러한 바이트 파일(실행파일)을 사용자가 실행하게 되면 RAM(메모리)에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어서 적제 되며 실행된다.
이렇게 실행된 프로그램은 코딩된 명령어를 통해 CPU를 연산하게 하고 제어하게 만듭니다. 그래서 우리가 프로그래밍을 한다는 건 CPU가 연산할 수 있게 명령어를 입력해주는 것이다. 그렇다면 우리는 CPU를 읽고 해석할 수 있어야 한다...
이러한 명령어는 기계어 명령어라고도 하며 기계어와 일대일 문자화한 것이 어셈블리어이다. 실제로 예전에는 어셈블리어로 프로그램을 만들었다.(어셈블리어에 대해서 추후 포스팅 예정)
그러나 요즘 세상에는 수많은 CPU가 존재한다. 예를 들어 인텔의 x86, AMD, Arm, Mips 등의 여러 가지 제조사가 존재하고 각 제조사는 수많은 모델이 존재하며 또한 32bit, 64bit로도 분류된다. 앞으로는 더욱더 많은 코어가 생겨날 것이다.
그런데 이런 다양한 CPU는 제어할 수 있는 모두 명령어가 조금씩 다르다. 그래서 우리는 어셈블리어로 코딩할 경우 특정 CPU에서만 작동할 수 있도록 설계된다. 새로운 코어에서 동작시키려면 다시 만들어야 된다. 사실상 요즘처럼 다양한 CPU 아키텍처가 존재하는 상황에서는 많은 리소스가 들어갈 것이다. (물론 어셈블리어는 아직도 엄청 엄청 유용한 언어이다.)
1971년 데니스 리치에 의해 C언어가 태어났다. C언어의 문법으로 작성한 코드는 컴파일러에 의해 CPU가 읽을 수 있는 명령어인 바이트로 번역되므로(컴파일러에 의존) 다른 컴퓨터 환경에서도 그대로 작동된다.
컴파일러에 의해 번역된 C와 C++은 CPU를 바로 제어할 수 있다. 그래서 Firmware(펌웨어)나 OS(운영체제)는 C언어로 만들어졌다.
그리고 그 외의 JAVA나 Python 같은 언어들은 구동을 위한 가상 환경(JVM, 인터프리터)이 필요하다.
고급언어는 방식에 따라 절차지향, 객체지향 언어로 나뉜다.
절차지향은 위부터 순서대로 프로세스가 진행되고,
객체지향은 클래스와 메소드의 개념이 추가되어 서로 필요할때 호출하며 동작한다.
따라서 우리가 하나의 프로그램이 만들어 내기까지의 과정은 아래와 같다(C, C++기준)
5단계로 나눌 수 있다.
1. 설계(Design) : 어떤 프로그램을 만들지에 대한 구상과 어떻게 만들지에 대한 설계과정
2. 코딩(Coding) : 설계를 했으면 프로그래밍 언어의 문법에 맞게 내 생각을 적는 과정
3. 컴파일(Compile) : 프로그램을 동작시킬 컴퓨터의 환경에 맞는 컴파일러로 컴파일하는 과정. (만약 윈도우에서 리눅스에서 동작시킬 프로그램을 컴파일한다면 크로스 컴파일을 해야 한다)
4. 링크(Link) : 컴파일된 파일들을 연결해서 실행파일을 만들어주는 과정
5. Binary파일(.exe , .dll , .elf 등등) 생성 완료
C/C++프로그램을 만들기 위해서는 오직 컴파일러만 필요하다.
컴파일러로는 GCC, CMake, MinGW 등이 있다.
그러나 우리는 통합개발환경(IDE, Integrated Development Environment)이 있으면 편하다. 코딩, 디버그, 컴파일, 배포등을 하나의 프로그램 안에서 처리 할 수 있는 환경을 제공하는 소프트웨어이다.
통합개발환경으로는 너무 많지만 대표적으로 Eclipse, Visual Studio, VSCode 등이 있다.
세상의 모든 프로그래밍 언어는 이러한 과정을 모두 기본으로 하고 있다. 단, 코딩하는 사용자 입장에서 방법이 조금씩 간편해지고 있을 뿐,,
앞으로 C++에 대해 좀 더 포스팅해볼 예정이다.
피드백은 언제든지 환영입니다
C++ #1 - 기본 정리 (0) | 2019.07.23 |
---|