C언어의 컴파일 과정
먼저 C언어의 컴파일 과정은 아래와 같습니다.

1. C언어로 작성된 소스코드를 전처리(Preprocessing) 과정을 거칩니다.
- 전처리 과정에서 #define으로 정의된 매크로를 실제 값으로 치환하고, #include에 따라 파일을 소스코드에 포함하고, 주석을 제거하는 등의 작업이 진행됩니다.
2. 전처리 과정을 거친 소스코드를 컴파일러를 통해 어셈블리어로 변환(Compilation)합니다.
- 소스 코드를 구문 분석하고 구문 트리를 생성합니다.
- 구문 트리를 바탕으로 중간 코드를 생성하고, 중간 코드 최적화 진행 후 어셈블리어로 변환합니다.
3. 어셈블러가 어셈블리어를 기계어 코드(목적 파일)로 변환(Assemble)합니다.
- 어셈블리어 명령어를 해석하여 기계어 명령어(인스트럭션)로 변환합니다.
- 각 소스파일에 대한 목적파일을 생성합니다.
4. 링커를 통해 여러 개의 목적 파일과 라이브러리를 결합(Linking)하여 실행 파일을 생성합니다.
- 실행 파일 내의 코드 및 데이터에 대한 실제 메모리 주소를 할당합니다.
- 표준 라이브러리나 사용자 정의 라이브러리와 목적 파일을 결합합니다.
GCC(GNU Compiler Collection)
위 과정에서 사용된 컴파일러의 역할을 하는 것이 바로 오늘 우리가 알아볼 GCC입니다. 대표적인 컴파일러의 종류에는 Clang, GCC, MSVC, Intel C++ Compiler가 있습니다.
각 컴파일러마다 가지는 특징, 장단점이 존재합니다.
GCC 컴파일러는 아래와 같은 특징, 장점, 단점을 가집니다.
특징: GNU 프로젝트에서 개발한 오픈 소스 컴파일러입니다. C 언어 외에 C++, Objective-C, Fortran, Ada 등 다양한 언어를 지원합니다. 주로 리눅스/유닉스 시스템, 크로스 컴파일 환경에서 사용합니다.
장점: GCC는 최적화 옵션을 통해 컴파일 시의 최적화 수준을 선택할 수 있습니다.
단점: 옵션 및 설정이 복잡하고, 컴파일 속도가 타 컴파일러에 비해 상대적으로 느립니다.
이러한 GCC의 다양한 언어 지원, 광범위한 플랫폼 지원, 그리고 강력한 최적화 기능으로 인해 GCC는 전 세계적으로 가장 널리 사용되는 컴파일러가 되었습니다.
GCC 컴파일러의 최적화 옵션
GCC에서는 다양한 최적화 옵션을 제공합니다. GCC는 아래와 같은 주요 최적화 옵션을 제공합니다.
1. -O1, -O2, -O3, -Os, -Ofast
- -O1: 컴파일 속도와 실행 속도 간의 균형을 맞춘 최적화 단계입니다.
- -O2: 더 많은 최적화를 수행하기 위해서 실행 속도를 향상시킨 최적화 단계입니다.
- -O3: 모든 최적화 기술을 사용하여 최대한의 성능을 끌어낸 최적화 단계입니다.
- -Os: 코드의 크기를 최소화하는 최적화입니다.
- -Ofast: -O3 단계의 최적화에서 특정 비표준 최적화를 수행한 단계입니다.
즉 최적화 단계에서 숫자가 커질수록 더 고도의 최적화가 이루어지는 것을 알 수 있습니다. 최적화 수준이 높아질수록 성능 및 실행속도가 향상됩니다.
2. -Og
앞서 설명했던 -O1, -O2 등 최적화들이 성능을 향상에 초점을 맞춘 최적화였다면 -Og 최적화는 이용자로 하여금 디버깅을 할 수 있게 하기 위해 최적화를 최소한으로 진행합니다. 즉 디버깅과 최적화에 밸런스를 맞춘 옵션입니다.
'CS' 카테고리의 다른 글
[CS] OSI 7계층(OSI Model) (0) | 2024.08.16 |
---|---|
[CS] BSD 소켓(Socket) (0) | 2024.08.16 |
[CS] 가상화(Virtualization) (3) | 2024.07.26 |
[C언어] 포인터(Pointer) (1) | 2024.07.25 |
[운영체제] CSAPP 1장 정리(수정 중) (5) | 2024.07.16 |
C언어의 컴파일 과정
먼저 C언어의 컴파일 과정은 아래와 같습니다.

1. C언어로 작성된 소스코드를 전처리(Preprocessing) 과정을 거칩니다.
- 전처리 과정에서 #define으로 정의된 매크로를 실제 값으로 치환하고, #include에 따라 파일을 소스코드에 포함하고, 주석을 제거하는 등의 작업이 진행됩니다.
2. 전처리 과정을 거친 소스코드를 컴파일러를 통해 어셈블리어로 변환(Compilation)합니다.
- 소스 코드를 구문 분석하고 구문 트리를 생성합니다.
- 구문 트리를 바탕으로 중간 코드를 생성하고, 중간 코드 최적화 진행 후 어셈블리어로 변환합니다.
3. 어셈블러가 어셈블리어를 기계어 코드(목적 파일)로 변환(Assemble)합니다.
- 어셈블리어 명령어를 해석하여 기계어 명령어(인스트럭션)로 변환합니다.
- 각 소스파일에 대한 목적파일을 생성합니다.
4. 링커를 통해 여러 개의 목적 파일과 라이브러리를 결합(Linking)하여 실행 파일을 생성합니다.
- 실행 파일 내의 코드 및 데이터에 대한 실제 메모리 주소를 할당합니다.
- 표준 라이브러리나 사용자 정의 라이브러리와 목적 파일을 결합합니다.
GCC(GNU Compiler Collection)
위 과정에서 사용된 컴파일러의 역할을 하는 것이 바로 오늘 우리가 알아볼 GCC입니다. 대표적인 컴파일러의 종류에는 Clang, GCC, MSVC, Intel C++ Compiler가 있습니다.
각 컴파일러마다 가지는 특징, 장단점이 존재합니다.
GCC 컴파일러는 아래와 같은 특징, 장점, 단점을 가집니다.
특징: GNU 프로젝트에서 개발한 오픈 소스 컴파일러입니다. C 언어 외에 C++, Objective-C, Fortran, Ada 등 다양한 언어를 지원합니다. 주로 리눅스/유닉스 시스템, 크로스 컴파일 환경에서 사용합니다.
장점: GCC는 최적화 옵션을 통해 컴파일 시의 최적화 수준을 선택할 수 있습니다.
단점: 옵션 및 설정이 복잡하고, 컴파일 속도가 타 컴파일러에 비해 상대적으로 느립니다.
이러한 GCC의 다양한 언어 지원, 광범위한 플랫폼 지원, 그리고 강력한 최적화 기능으로 인해 GCC는 전 세계적으로 가장 널리 사용되는 컴파일러가 되었습니다.
GCC 컴파일러의 최적화 옵션
GCC에서는 다양한 최적화 옵션을 제공합니다. GCC는 아래와 같은 주요 최적화 옵션을 제공합니다.
1. -O1, -O2, -O3, -Os, -Ofast
- -O1: 컴파일 속도와 실행 속도 간의 균형을 맞춘 최적화 단계입니다.
- -O2: 더 많은 최적화를 수행하기 위해서 실행 속도를 향상시킨 최적화 단계입니다.
- -O3: 모든 최적화 기술을 사용하여 최대한의 성능을 끌어낸 최적화 단계입니다.
- -Os: 코드의 크기를 최소화하는 최적화입니다.
- -Ofast: -O3 단계의 최적화에서 특정 비표준 최적화를 수행한 단계입니다.
즉 최적화 단계에서 숫자가 커질수록 더 고도의 최적화가 이루어지는 것을 알 수 있습니다. 최적화 수준이 높아질수록 성능 및 실행속도가 향상됩니다.
2. -Og
앞서 설명했던 -O1, -O2 등 최적화들이 성능을 향상에 초점을 맞춘 최적화였다면 -Og 최적화는 이용자로 하여금 디버깅을 할 수 있게 하기 위해 최적화를 최소한으로 진행합니다. 즉 디버깅과 최적화에 밸런스를 맞춘 옵션입니다.
'CS' 카테고리의 다른 글
[CS] OSI 7계층(OSI Model) (0) | 2024.08.16 |
---|---|
[CS] BSD 소켓(Socket) (0) | 2024.08.16 |
[CS] 가상화(Virtualization) (3) | 2024.07.26 |
[C언어] 포인터(Pointer) (1) | 2024.07.25 |
[운영체제] CSAPP 1장 정리(수정 중) (5) | 2024.07.16 |