본문 바로가기
2024.10~/일일 학습 노트

[24.10.27] 컴파일러에 대한 기본기 다지기

by HJfan 2024. 10. 27.

Title : What is a Compiler? A Comprehensive Introduction to Compiler Basics


컴파일러는 개발자가 작성한 고급 언어로 작성한 소스 코드를 기계어로 변환하여 컴퓨터가 이해하고 실행할 수 있는

실행 파일을 생성하는 프로그램이다. 우리가 아는 일반적인 프로그래밍 언어는 인간이 이해하기 쉬운 형태로 만들어진

언어일 뿐, 컴퓨터가 실제로 이해할 수 있는 언어는 0과 1이라는 이진으로 구성된 기계어이기 때문이다.

 

Visual Studio, IntelliJ 등의 IDE를 사용하면 컴파일, 빌드, 디버그 과정을 한 번에 할 수 있도록 제공하지만 오늘 공부할

내용은 리눅스 터미널 환경에서 명령어 기반으로 사용하는 컴파일러에 대해 간단하게 알아보고자 한다.

리눅스에서 자주 사용되는 컴파일 도구를 몇 가지만 알아보자.

 

01. GCC(GNU Compiler Collection)

더보기

C, C++ 등 여러 언어를 컴파일할 수 있는 범용 컴파일러이다. 가장 많이 사용되는 컴파일러로, gcc 명령어를

통해 컴파일을 수행한다. 오늘은 아주 간단하게 GCC를 실제로 사용하는 예제 코드를 살펴보기만 하자.

gcc -o hello hello.c

hello.c라는 파일을 컴파일하여 hello라는 실행 파일을 생성하라는 명령어이다.

 

02. Make

더보기

Makefile이라는 것을 사용하여 복잡한 빌드 과정을 자동화하는 도구이다. 여러 소스 파일이 있는

프로젝트를 컴파일할 때 유용하게 사용된다. Make 명령어는 아직 익숙하지 않기에 gpt를 통해 예제 코드만
생성하고, 추후 실습을 통해 이해하도록 하자.

all: hello

hello: hello.o
    gcc -o hello hello.o

hello.o: hello.c
    gcc -c hello.c

터미널에서 make 명령어를 실행하면, hello.c 파일을 컴파일하고 링크하여 hello라는 실행 파일을 생성한다고 한다.

 

03. CMake

더보기

플랫폼 독립적인 빌드 시스템으로, 프로젝트를 구성하고 Makefile을 생성하는 역할을 한다.

여러 플랫폼에서 쉽게 빌드 환경을 구성할 수 있게 해준다.

cmake_minimum_required(VERSION 3.10)
project(HelloWorld)

set(SOURCES hello.c)

add_executable(hello ${SOURCES})

위의 파일(.txt)을 생성하고, 아래의 코드를 실행하면 hello 실행 파일이 생성된다고 한다.

mkdir build
cd build
cmake ..
make

 

위 도구들로 컴파일을 수행하면, 일반적으로 아래의 과정을 통해 하기 파일들이 생성된다.

1. 프리프로세싱(Preprocessing)
     소스 코드에 포함된 전처리 지시문(#include, #define 등)을 처리하여, 프리프로세싱된 소스 파일을 생성.
     이 단계에서 매크로 치환과 파일 포함이 이루어진다고 한다.

2. 컴파일(Compilation)
     프리프로세싱된 소스 코드를 어셈블리 언어로 변환한다. 이 과정에서 .s 확장자를 가진 어셈블리 파일이
     생성되고, 이 파일은 사람이 읽을 수 있는 형태로, CPU 명령어 수준의 코드라고 한다.

3. 어셈블링(Assembling)
    어셈블리 파일을 기계어로 변환하여 오브젝트 파일(.o)을 생성. 이 파일은 기계가 이해할 수 있는 이진 코드로,
    아직 완전한 실행 파일은 아니다. 여러 오브젝트 파일들이 결합하여 최종 실행 파일이 된다고 한다.

4. 링킹(Linking)
     여러 오브젝트 파일을 결합하고, 라이브러리 코드와 함께 최종적인 실행 파일을 생성.
     이 과정에서 외부 함수의 참조가 해결되고, 모든 코드가 하나로 결합됨. 링킹을 통해 완성된 파일은 리눅스에서
     주로 a.out 이라는 이름으로 생성되며, 실제 실행 가능한 형태의 파일이다.

5. 심볼 테이블 및 디버깅 정보
    컴파일 과정에서 -g 옵션을 사용하면, 디버그 심볼 파일이라는 것이 생성됨.
    이 파일에는 변수명, 함수명 등 디버깅에 필요한 추가 정보가 포함되어 있어, 디버깅 시 소스 코드와 실행 파일을
    연결하는데 사용됨. 이 정보는 디버깅 툴(GDB 등등)에서 프로그램의 상태를 추적하고 문제를 해결하는 데
    도움을 준다고 한다.

 

 

 

 


단어 사전

[1] 심볼링 : 코드 내의 함수나 변수명을 기계가 이해할 수 있는 메모리 주소에 대응시키는 과정.


Reference :