Language/C++

[C++] C++ 동작 원리

검은 까마귀 2024. 1. 13. 13:37



뭐 자바를 공부하기 전에도 마찬가지로 자바의 동작원리부터 알아보고 시작을 했다.

JAVA는 대충 설명하자면 JVM에서 띄워지기 때문에 어디든 JVM 머신이 있다면 실행 시킬 수 있다.

 

 

하지만, C++을 기본적인 C언어의 여러가지 기능을 추가로 만든 언어이다.

자바는 애초에 OOP(객체 지향)을 위해서 만들어졌지만 C는 절차지향형 언어이다. 그래서 여러기능을 추가한 C++에서는 OOP의 특징도 가져왔다. 그래서 두가지 다 특징을 갖고있다.

 

위는 대충 C++과 JAVA의 차이에 대해서 작성했지만, 아직 제대로 C++를 공부한게 아니라서 추가적으로 공부후에 어떤것 들이 다른것인지 알아보겠다.(공부하는 중.....)

 

# 프로그래밍

OS를 공부하면서 배운 내용을 생각해보면 좋을 것이다. 소스코드라는 code형태의 파일을 작성하게 되고 이를 excution하기 위해서는 Compile(컴파일)이라는 기계언어로 변경해야 CPU가 알아 듣는다. CPU는 소스코드(text)를 알아들을 수가 없다. 아래는 소스코드에서 Comepile되어서 실행파일이 되는 과정을 설명한 것이다.

 

순서를 나열하면 아래와 같다.

  1. 코드 작성 ➡️ 소스파일 작성
  2. Preprocessor(전처리기, 선행처리기)에 의한 선행처리
  3. Complier에 의한 Compile ➡️ Object파일 생성
  4. Linker(링커)에 의한 Link
  5. Excution 파일 생성

여러가지 용어가 나온다. 익숙한 컴파일러, 소스파일, 라이브러리, 생소한 언어인 선행처리기, 오브젝트 파일, 시동코드, 링커등이 있다.

 

#소스 코드 작성

 

 

이렇게 CLion에서 프로젝트를 생성하고 .cpp이라는 확장자의 언어를 작성할 수 있다. 앞으로 배울 C++의 문법을 여기다 작성하면 된다. 자바는 알다시피 .java라는 확장자로 나온다.

 

# Preprocessor(전처리기, 선행처리기)

 

위는 임시로 소스 코드를 작성한 것이다. #include라는 전처리기로 iostream라는 헤더파을 전처리기한 것이다. 개인적으로 자바를 공부하면서 import랑의 차이점때문에 헷갈렸다. 그래서 한번 자료를 정리해 보았다.

기준 자바의 import c++ 전처리기
목적 다른 Package에 정의된 class, interface를 불러옴 다른 파일의 내용을 현재 파일 소스로 복사함, 주로 헤더파일을 포함하기 위해 사용
작동 방식 컴파일러가 클래스의 경로를 찾아낸다. 전처리기가 지시어(include, define)을 만나면 해당 파일에 직접 복사함. 컴파일 이전에 이루어짐
성능 import 자체는 성능의 영향을 주지는 않음 #include는 파일의 내용을 그대로 복사하기 때문에 컴파일 시간과 결과물의 크기에 따라 영향을 받는다.

 

결론적으로 큰 관점에서 보았을때는 Compile 시점에 따른 차이 이다. 자바의 import는 컴파일 이후에 이뤄지고  C++의 전처리기는 말 그대로 컴파일 이전에 이루어지게 된다. 

 

다시 C++로 돌아가서 결국 전처리기는 Compile 이전에 소스 코드를 Compile이 잘 일어날 수 있게 작업하기 좋게 재구성을 하는 것이다.

 

# Compiler(컴파일러)

이제 전처리로 아주 이쁘게 컴파일할 수있게 재구성을 해두었다. 우리는 컴퓨터가 알아먹을 수 있게 0,1로 해줘야한다. 우리는 그 과정을 위에서 이야기 했듯이 Compile 해야하고 이는 Compiler를 통해 진행된다.  확장자가 .cpp이었던 것이 확장자 오브젝트 파일인 확장자 .o로 변경되게 된다.

 

뭐 공부하다가 나오겠지만 GNU Compiler Collection이 있다. 나의 CLion은 Min GW로 셋팅되어있다.

 

https://namu.wiki/w/GCC

 

GCC - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

# 링커( Linker)

이제 기계어로 번역이 완료된 오브젝트 파일을 갖고 있다. 하지만 OS에서 코드를 실행시켜야하지만 OS 연결이 가능한 Start-up Code를 갖고 있지 않다. 또한 표준 라이브러리 파일도 갖고 있지 않기 때문에 하나로 합쳐 파일로 만드는 작없을 Link라고 한다.

 

 

Link는 Linker에 의해서 수행되며, 링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일을 만들어 낸다. C++에서 소스 코드를 작성하고 하나의 실행파일로 만드는 것이 분할 컴파일이라고 한다.

 

뭐 찾아보니깐 CMake가 이런걸 지원하는거 같은데.... 소스 코드를 많이 작성해보지 않아서 모르겠다. 임베디드할 때를 생각해보면 저 과정을 할지 몰라서 main.cpp에 함수별로 다 때려박아서 한 소스파일의 코드 길이가 2만줄 이랬던거 같은데 얼마나 무식하게 했나 싶다.....!

 


 

실행 파일이 생긴다. 실행파일의 확장자는 .exe 이다. 알다시피 .exe는 내부의 소스 파일을 볼 수 없다. 뭐 일단 C++ 개발툴은 해당 내용들을 다 내장하고 있어서 무척이나 개발하기 편하다.

 

그리고 OS를 배우면서 System Call을 할 수 있다는 것에서 놀랐다.

2024.01.10 - [Computer Science/Operation System] - [OS] SystemCall (시스템 콜)

 

[OS] SystemCall (시스템 콜)

이번주안에 OS 관련공부를 마칠 수 있을지는 잘 모르겠다. OS는 공룡책도 있을 만큼 공부해야하며 여전히 발전하고 있기때문에 꾸준히 공부를 해야한다. 클라우드니 쿠버네티스니 모두 OS의 기본

blaj2938.tistory.com

 

알고리즘 개념 공부하는 것도 C++언어로 변경해서 다시 공부를 진행해야할것 같다. java처럼 다 알아서 주소 해서 해주는거 말고...!

2023.11.16 - [Computer Science/Data Structure] - [Data Structure] 선형 - 스택(Stack)

 

[Data Structure] 선형 - 스택(Stack)

#요약 Stack은 "쌓다" 라는 어원을 갖고 있음 ➡️책상에 책을 쌓아두는것과 마찬가지인 구조 선형구조 나중에 입력된 데이터가 먼저 나오는 구조 ➡️ LIFO 구조로 저장 (큐)Queue와 반대되는 구조 #

blaj2938.tistory.com

 

주말에 C++를 공부할려고 시작한지 1일차인데 일단 이론은 이 정도면 되고 Assignment위주로 공부를 진행해보아야겠다. LinkedList로 구현하는 주소록과제 있다고 하던데 한번 진행해보겠다.

반응형

'Language > C++' 카테고리의 다른 글

[C++] Class & 접근제어지시어  (0) 2024.01.22
[C++] Structure Type(구조체)  (0) 2024.01.19
[C++] Pointer(포인터)  (0) 2024.01.18
[C++] Assignment 주소록(1) - 요구사항 분석  (0) 2024.01.13
[C++] C++ 배우기를 선택한 이유  (0) 2024.01.08