[TIL]컴파일러

KBC·2024년 8월 20일
0

TIL

목록 보기
4/8

GCC(GNU Compiler Collection)

다양한 프로그래밍 언어를 지원하는 강력한 오픈 소스 컴파일러 모음이다. 가장 널리 사용되는 C, C++ 언어뿐만 아니라 Objective-C, Fortran, Ada, Go, D 등 다양한 언어를 지원한다. GCC는 GNU 프로젝트의 일부로 시작되었으며, 오픈 소스 소프트웨어 개발 커뮤니티에서 중요한 도구로 자리잡았다.

  • 크로스 컴파일링: GCC는 크로스 컴파일링을 지원한다. 즉, 개발 중인 시스템과 다른 아키텍처를 위한 코드를 생성할 수 있다. 예를 들어, x86 시스템에서 ARM 프로세서를 위한 코드를 컴파일할 수 있다.
  • 최적화 옵션: GCC는 코드 최적화 옵션을 제공하여, 실행 속도나 메모리 사용 효율성을 높일 수 있다. -O1, -O2, -O3와 같은 다양한 최적화 레벨이 있다.
  • 플랫폼 독립성: GCC는 다양한 플랫폼에서 실행될 수 있으며, 리눅스, 윈도우, macOS 등 여러 운영 체제에서 사용할 수 있다.
  • 확장성: 오픈 소스이기 때문에 사용자가 필요한 기능을 추가하거나 수정할 수 있다. 많은 개발자들이 GCC를 확장하여 자신만의 컴파일러를 만들거나 기존의 GCC에 새로운 기능을 추가하고 있다.

1. 전처리 (Preprocessing)

전처리 단계에서는 소스코드에 포함된 전처리 지시문들을 처리한다. #include로 시작하는 헤더 파일 포함 지시문, #define으로 시작하는 매크로 정의 등이 이 단계에서 처리된다. 전처리 결과는 .i 확장자를 가진 파일로 저장되며, 이 파일에서 모든 전처리 지시문이 처리된 것을 확인할 수 있다.

gcc -E source.c -o source.i

이 명령어를 사용하면 소스 파일 source.c가 전처리되어 source.i 파일로 저장된다.

2. 컴파일 (Compilation)

컴파일 단계에서는 전처리된 소스코드를 기계어에 가까운 중간 형태인 어셈블리어로 변환한다. 이 과정에서 생성된 어셈블리어 코드는 .s 확장자를 가진 파일로 저장된다.

gcc -S source.i -o source.s

이 명령어를 사용하면 source.i 파일이 컴파일되어 어셈블리어 파일인 source.s로 변환된다.

3. 어셈블 (Assembly)

어셈블 단계에서는 어셈블리어로 작성된 파일을 기계어 코드로 변환하여 오브젝트 파일을 생성한다. 이 오브젝트 파일은 .o 확장자를 가진다.

gcc -c source.s -o source.o

이 명령어를 통해 어셈블리어 파일인 source.s를 기계어 코드로 변환하여 source.o 파일을 생성한다.

4. 링킹 (Linking)

링킹 단계에서는 여러 오브젝트 파일과 라이브러리를 연결하여 최종적으로 실행 가능한 파일을 생성한다. 링킹이 완료된 실행 파일은 .out 또는 .exe 확장자를 가진다.

gcc source.o -o source.out

이 명령어를 사용하면 source.o 파일이 링크되어 최종 실행 파일 source.out이 생성된다.

각 단계에서 파일의 변화

전처리 단계 (source.c → source.i): 주석이 제거되고, 매크로와 헤더 파일이 처리된 소스코드가 생성된다.
컴파일 단계 (source.i → source.s): 전처리된 코드가 어셈블리어로 변환된다.
어셈블 단계 (source.s → source.o): 어셈블리어 코드가 기계어 코드로 변환되어 오브젝트 파일이 생성된다.
링킹 단계 (source.o → source.out): 오브젝트 파일들이 링크되어 실행 파일이 생성된다.

profile
AI, Security

0개의 댓글