18 컴파일러의 지형 — 현역 C 컴파일러들
먼저 알아야 할 것
돌아보기
16장에서 컴파일이 전처리·번역·어셈블·링크의 네 걸음이고, 17장에서는 그 걸음을 대신 밟아 주는 도구로 gcc나 clang을 깔았다. 그러면 컴파일러가 다르면 무엇이 달라지는가 — 같은 표준 C인데?
답. 세 가지가 달라진다. 첫째, 만들어 내는 기계어의 품질(속도와 크기)이다. 둘째, 어떤 기계를 겨냥할 수 있는가 — 세상의 CPU 중 gcc나 clang이 아예 모르는 것들이 있고, 그 자리는 그 칩을 만든 회사의 컴파일러가 채운다. 셋째, 표준의 어느 판까지 지원하는가와 진단(경고)의 성격이다. 표준이 같아도 도구는 여럿이고, 각자 잘하는 자리가 다르다 — 그 지형을 그리는 것이 이 장이다.
이 장의 필요성과 맥락
이 장이 끝나면
이 장에서 답할 질문
- 하나만 골라 배워도 되는가?
- 그러면 이 책의 예제를 Pelles C로 따라가도 되는가?
- 컴파일러를 고르는 실무의 기준을 한 줄로 요약하면?
18.1 세상의 큰 셋 — GCC, Clang/LLVM, MSVC
오늘날 데스크톱과 서버 C의 대부분은 이 셋 위에서 돈다.
GCC(GNU Compiler Collection). 1987년부터 이어져 온 자유 소프트웨어 컴파일러이고, 리눅스 세계의 기본값이다. 겨냥할 수 있는 CPU의 수가 압도적 으로 많다는 것이 가장 큰 강점이다 — x86·Arm·RISC-V는 물론이고 AVR, MSP430, SuperH, PowerPC 같은 임베디드 칩까지 하나의 계보로 덮는다. 임베디드 벤더들이 자기 도구의 속을 gcc로 채우는 일이 흔한 이유다(97장).
Clang/LLVM. 2000년대에 나온 후발 주자로, 컴파일러를 부품으로 쓸 수 있게 설계한 LLVM 기반이다. 진단 메시지가 친절하다는 평판으로 자리를 잡았고, 오늘날에는 그 부품성 덕에 생태계 전체가 그 위에 섰다 — 정적 분석기 (clang-tidy), 서식 도구(clang-format), 편집기의 자동완성 서버(clangd), 그리고 여러 벤더의 새 컴파일러가 전부 LLVM에서 갈라져 나왔다. macOS의 기본 컴파일러이기도 하다.
MSVC(Microsoft Visual C++). 윈도우의 표준 도구다. 이름은 C++이지만 C도 컴파일하며, 오랫동안 C99조차 미완이라는 평을 들었으나 근래에는 C11·C17을 지원하고 C23으로 나아가는 중이다. 윈도우 API와 가장 잘 맞물린다는 것이 존재 이유다.
문. 하나만 골라 배워도 되는가?
답. 배우는 것은 하나로 시작하되, 가끔 다른 것으로도 컴파일해 보는 습관을 권한다. 컴파일러마다 잡아 주는 실수가 다르기 때문이다 — 한쪽이 지나친 코드를 다른 쪽이 경고로 잡는 일이 흔하다. 이 책의 예제도 그래서 두 컴파일러로 교차 검증한다(머리말). 무료이고 설치가 쉬우니, 리눅스·macOS 라면 gcc와 clang을, 윈도우라면 MSVC와 clang을 함께 두는 것이 좋다.
18.2 성능을 파는 컴파일러들 — 벤더 컴파일러
같은 소스라도 자기 회사 CPU에서 더 빨리 돌게 만들어 주는 것을 파는 컴파일러 들이 있다. 대형 계산(HPC)과 서버 쪽에서 주로 만난다.
| 이름 | 누가 | 지금 상태 |
|---|---|---|
icx (oneAPI DPC++/C++) | 인텔 | 현역. LLVM 기반 |
icc (C++ Compiler Classic) | 인텔 | 은퇴 — oneAPI 2024.0에서 제거 |
| AOCC | AMD | 현역. LLVM 기반 |
NVIDIA HPC SDK (nvc) | 엔비디아 | 현역. GPU 가속 코드와 함께 |
| IBM Open XL C/C++ | IBM | 현역(AIX·z/OS). LLVM 기반으로 갈아탐 |
| Cray/HPE CCE | HPE | 현역(슈퍼컴퓨터) |
표 18.1
표를 관통하는 흐름이 하나 보인다 — 다들 LLVM으로 모였다. 자기만의 컴파일러를 처음부터 유지하는 비용이 너무 커서, 앞단(문법 해석)과 최적화의 공통부는 LLVM에서 가져오고 자기 칩에 맞는 뒷단만 붙이는 방식이 표준이 됐다. 인텔의 고전 icc가 물러나고 LLVM 기반 icx가 그 자리를 이은 것이 이 흐름의 가장 상징적인 장면이다.
흔한 오해. “인텔 컴파일러(icc)를 쓰면 코드가 빨라진다더라”
오래 회자된 말이지만 두 겹으로 낡았다. 첫째, 그icc는 이제 없다. 인텔은 고전 컴파일러를 폐기 예고한 뒤 oneAPI 2024.0에서 제거했고, 지금 받는 것은 LLVM 기반의 icx다. 둘째, 격차 자체가 줄었다. 예전에는 인텔 컴파일러의 자동 벡터화가 크게 앞선 시기가 있었지만, 지금은 GCC와 Clang도 같은 일을 잘한다. 컴파일러를 바꿔서 얻는 몇 %보다, 11장에서 본 기억의 사다리에 맞게 자료를 배치해 얻는 몇 배가 훨씬 크다는 사실은 변하지 않았다.18.3 임베디드 — 다음 장의 입구
세상의 C 컴파일러 중 수적으로 가장 많은 갈래는 임베디드 쪽이다. 칩을 만드는 회사마다 자기 컴파일러가 있고, 안전 인증(자동차·항공·의료)이 걸린 자리에는 그 인증을 함께 파는 전문 회사들이 있다. IAR, Arm의 Keil 계열, TI, 마이크로칩, 르네사스, 그린힐스, 윈드리버 — 그리고 8비트 칩을 위한 자유 소프트웨어 SDCC 까지. 이 지형은 도구 전체(디버그 프로브, 온칩 디버깅, 정적 분석)와 함께 보아야 뜻이 서므로 다음 장에서 따로 다룬다.
18.4 곁다리 하나 — 윈도우의 단정한 대안, Pelles C
지금까지의 이름들이 “많이 쓰이는 것”이었다면, 이 절은 조금 다르다. 시장 점유로 보면 큰 자리를 차지하지 않지만 성격이 뚜렷해서 소개할 만한 도구다.
Pelles C는 스웨덴의 펠레 오를린드(Pelle Orinius)가 혼자 이어 온 윈도우 전용 프리웨어다. 편집기·컴파일러·어셈블러·링커·자원 편집기·디버거·설치 파일 생성기까지 한 묶음으로 들어 있고, 다운로드 하나로 끝난다. 이름은 만든 사람의 이름에서 왔다.
주목할 점은 표준 지원이 성실하다는 것이다. 이 책을 쓰는 시점의 최신판 (14.50, 2026년 7월)이 C99·C11·C17·C23을 지원한다고 밝히고 있다. 규모가 훨씬 큰 도구들보다 새 표준을 빨리 따라간 시기도 있었다.
혈통도 재미있다. Pelles C는 맨땅에서 나온 것이 아니라 LCC(프레이저와 핸슨이 만든 작고 이식성 높은 교육용 C 컴파일러)를 크게 손본 물건이다. 위키백과에도 독립 문서가 아니라 「LCC (compiler)」 항목의 한 절로 실려 있고, 거기서 “C11·C17·C23 지원, amd64 지원, 인라인 전개 같은 최적화, 그리고 IDE를 더한 LCC의 대폭 개작판”이라고 설명한다. 자료를 찾을 때 이 사실을 알아 두면 헛수고를 던다 — “Pelles C” 위키백과 문서를 찾으면 나오지 않는다.
받는 곳은 공식 홈페이지 pellesc.se이고, 질문과 배포 소식은 별도의 포럼(forum.pellesc.de)에 모인다. 만든 사람이 그 포럼에서 직접 답하는 것이 이 도구의 오래된 풍경이다.
사용자들의 평가를 모으면 대체로 이렇게 갈린다.
| 자주 언급되는 장점 | 자주 언급되는 한계 |
|---|---|
| 설치가 한 번에 끝나고 용량이 작다 | 윈도우 전용 — 이식할 코드에는 맞지 않는다 |
| 컴파일이 빠르다 | C++ 지원은 사실상 없다(C 전용 도구로 보는 편이 옳다) |
| C 표준 준수가 좋고 최신 판을 잘 따라간다 | 큰 IDE(Visual Studio)만큼 기능이 많지는 않다 |
| 윈도우 API·자원 편집이 매끄럽다 | 사용자 층이 얇아 검색으로 나오는 자료가 적다 |
| 초보자에게 진입 장벽이 낮다 | 빌드 시스템·외부 도구와의 통합은 약하다 |
표 18.2
18.4.1 윈도 앱을 C로 짠다는 선택
이 도구의 자리를 하나 더 짚어 둘 만하다. 윈도 API(Win32)로 데스크톱 앱을 짤 때 특히 잘 맞는다 — 자원 편집기와 링커가 한 묶음이고, 만들어지는 것이 런타임 의존성 없는 실행 파일 하나이기 때문이다.
「지금 시대에 왜 C로 윈도 앱을 짜는가」라는 물음이 자연스럽다. 근거를 과장 없이 적으면 이렇다.
| Win32의 강점 | 그 대가 |
|---|---|
| 윈도의 바탕 API다 — 위에 얹힌 UI 스택들이 세대교체를 반복해도 이것은 남는다 | 코드가 길다. 창 하나를 띄우는 데도 정형화된 준비 코드가 필요하다 |
| 하위 호환이 유별나다 — 20년 전에 빌드한 실행 파일이 오늘도 도는 일이 흔하다 | 고해상도(DPI)·다크 모드·접근성 같은 현대적 요구를 직접 챙겨야 한다 |
| 런타임·프레임워크 설치가 필요 없다 | 새 UI 기능 일부는 WinRT/WinUI 쪽에만 있다 |
| 문서와 예제가 방대하고, 마이크로소프트가 계속 유지한다 | 화면 구성 도구(디자이너)의 도움이 약하다 |
표 18.3
18.4.2 한 묶음에 들어 있는 것 — 자원 편집기와 대화 상자 디자이너
이 도구가 Win32 개발에 잘 맞는 진짜 이유는 편집기들에 있다. 공식 사이트가 밝히는 구성은 이렇다.
| 갈래 | 들어 있는 것 |
|---|---|
| 빌드 도구 | 최적화 C 컴파일러, 매크로 어셈블러, 링커, 자원 컴파일러, 메시지 컴파일러, make, 라이브러리 관리자 |
| IDE | 프로젝트 관리, 디버거, 프로파일러, 소스 편집기 |
| 자원 편집기 | 대화 상자, 메뉴, 문자열 표, 액셀러레이터 표, 비트맵, 아이콘, 커서, 애니메이션 커서, AVI, 버전 정보, 매니페스트 |
| 배포 | 코드 서명 도구, 설치 프로그램 빌더 |
| 대상 | x64·x86·ARM64. C99·C11·C17·C23, OpenMP 3.1, SSE~AVX-512와 NEON 일부 |
표 18.4
여기서 대화 상자 편집기가 이른바 GUI 디자이너다. 창에 버튼과 입력란을 끌어다 놓고 배치를 정하면 .rc 자원 스크립트로 저장되고, 자원 컴파일러가 그것을 실행 파일 안에 넣는다. 코드에서는 DialogBox나 CreateDialog로 그 대화 상자를 띄우고, 컨트롤은 번호(ID)로 찾는다 — Win32의 오래된 작업 방식 그대로다.
실제 사례. Visual C++ 6.0 이 남긴 기대, 그리고 지금
1990년대 후반 윈도 개발의 표준 도구는 Visual C++ 6.0(1998)이었다. 그 시절의 강점이 정확히 이것이었다 — 편집기·컴파일러·디버거·자원 편집기가 한 묶음이고, 대화 상자를 그려서 바로 띄울 수 있고, 설치가 끝나면 다른 준비가 필요 없었다. 「무겁지 않고, 켜면 바로 되는」 통합 환경의 기억이 여기서 왔다.
오늘의 Visual Studio 는 그때와 비교할 수 없이 강력하지만 대신 아주 커졌다. 설치 용량이 수십 기가바이트에 이르고, 처음 켜는 데 시간이 걸리며, C만 쓰는 사람에게는 대부분이 쓸 일 없는 기능이다.
Pelles C 가 사랑받는 자리가 그 사이다. VC6 이 주던 「작고 빠른 통합 환경」의 감각을 유지하면서, 컴파일러는 C23 까지 따라온 도구이기 때문이다. 다운로드가 하나이고, 자원 편집기가 붙어 있고, 만들어지는 것은 런타임 없는 실행 파일이다.
다만 공평하게 적어 두자. VC6 이 가졌고 Pelles C 에는 없는 것도 있다 — MFC 와 그 마법사(클래스 위저드)처럼 C++ 프레임워크에 얹힌 생산성 도구는 이쪽에 없다. 애초에 C 전용 도구이기 때문이다. 반대로 VC6 이 갖지 못한 것은 시대의 차이가 그대로다 — C99 이후의 표준, 64비트, ARM64, 최신 SIMD. VC6 은 오래전에 지원이 끝났고 지금 새 코드를 짜는 데 쓸 도구가 아니다.
정리하면, 「옛 VC6 처럼 가볍게 Win32 앱을 하나 만들고 싶다」는 요구에 오늘 가장 가까운 답이 이 도구다.
마이크로소프트가 새 앱에 권하는 것은 Win32가 아니라 최신 스택(Windows App SDK·WinUI 3)이다 — 이 점은 분명히 해 두자. 다만 윈도의 UI 스택은 MFC → WinForms → WPF → UWP → WinUI로 여러 번 갈아엎혔고, 그때마다 앞 세대는 「유지는 되지만 새로 권하지는 않는」 자리로 밀렸다. 그 소용돌이 밖에서 변하지 않은 것이 Win32이고, 오래 쓸 작은 도구라면 그 안정성이 곧 이득이다.
한 가지가 더 달라졌다. 위 표의 「코드가 길다」는 대가가 예전만큼 무겁지 않다 — 정형화된 준비 코드는 지금 AI가 잘 만들어 내는 종류의 코드이기 때문이다. 창을 만들고 메시지 루프를 도는 껍데기는 어디서나 같은 모양이고, 사람이 손으로 외워 적을 이유가 줄었다. 다만 이 책의 태도는 여기서도 같다 — 받아 온 코드도 읽을 줄 알아야 고칠 수 있다. 껍데기를 남이 써 주더라도, 그 안에서 도는 것이 무엇인지(메시지 루프, 핸들, 자원의 수명)는 결국 알아야 한다.
정리하면 이렇다 — 윈도우에서 순수 C만, 가볍게 다루고 싶을 때 잘 맞는 도구다. 학습용으로, 작은 윈도우 유틸리티용으로, 그리고 “새 표준 문법이 실제로 되는지” 시험해 보는 용도로 쓰기 좋다. 반대로 여러 플랫폼으로 옮길 코드나, CMake 같은 빌드 도구와 CI에 얹을 프로젝트라면 앞의 큰 셋 쪽이 맞는다.
문. 그러면 이 책의 예제를 Pelles C로 따라가도 되는가?
답. 된다 — 이 책의 예제는 표준 C만 쓰므로 C23을 지원하는 어느 컴파일러에서든 같은 결과가 나온다. 다만 두 가지는 알아 두는 편이 좋다. 첫째, 이 책이 본문에서 쓰는 명령과 선택지 표기(cc -Wall -Wextra …)는 gcc·clang 계열의 것이라 Pelles C의 IDE에서는 대응되는 설정을 찾아야 한다. 둘째, 17장에서 본 새니타이저는 이쪽에 없다 — 검사 도구가 필요한 대목에서는 clang이나 리눅스 환경을 곁들이는 편이 좋다.
18.5 그 밖에, 그리고 은퇴한 이름들
작지만 살아 있는 것 — tcc(Tiny C Compiler)는 몇백 KiB짜리 초소형 컴파일러로, C 소스를 즉석에서 컴파일해 바로 실행하는 용도로 여전히 쓰인다. cproc·chibicc 같은 작은 컴파일러들은 “컴파일러를 배우는 교재”로서 값이 있다. 실무의 주력은 아니다.
이름은 유명하지만 이제 현역이 아닌 것 — 오래된 교재나 인터넷 글에서 이 이름들을 만나면 시대를 감안해 읽어야 한다.
| 이름 | 사정 |
|---|---|
| Borland/Turbo C | 1990년대 윈도우·DOS 시절의 강자. 그 시절 관행(conio.h, void main())은 오늘의 표준 C가 아니다 |
| 왓콤(Watcom) | DOS·게임 개발의 강자였다. 오픈 소스판(Open Watcom)이 남아 있으나 사실상 정체 |
인텔 icc | oneAPI 2024.0 에서 제거. 후계는 icx |
| Dev-C++ | 블러드셰드(2005 무렵 중단) → 오웰 포크 → 2020년 엠바카데로 포크로 이어졌으나, 갱신이 매우 뜸하다 |
| TDM-GCC | 윈도우용 GCC 배포판. Dev-C++ 이 오래 함께 썼지만 판올림이 멈춰, 지금은 MSYS2/MinGW-w64 나 LLVM 쪽을 쓴다 |
표 18.5
특히 Dev-C++ 과 TDM-GCC 조합은 한국의 학교와 학원에서 오래 쓰여 지금도 자료가 많이 남아 있다. 문제는 그 조합이 물고 있는 컴파일러가 몇 판 뒤처져 있다는 것이다 — C11 이후의 문법이나 C23의 낱말(78장)이 통하지 않는 일이 흔하다. 지금 시작한다면 17장의 두 갈래(LLVM clang 또는 MSYS2 의 gcc)를 권한다. 옛 교재를 따라가다 “이 문법이 왜 안 되지?”라고 만나는 벽의 상당수가 도구의 나이 때문이다.
실제 사례. 이 책이 두 컴파일러로 예제를 검증하는 이유
머리말에서 밝힌 대로 이 책의 예제는 gcc와 clang 양쪽으로 컴파일해 검증 한다. 실제로 집필 중 여러 번, 한쪽만 잡아 준 실수가 있었다 — 서식 문자열의 잘림 가능성(-Wformat-truncation), strncpy의 잘림(-Wstringop-truncation), 부호 있는 값과 없는 값의 비교(-Wsign-compare), 배열 매개변수에 sizeof를 쓴 실수(-Wsizeof-array-argument) 같은 것들이다. 한 컴파일러의 침묵은 “이 코드가 옳다”는 증거가 아니다 — 그저 그 도구가 그 실수를 보는 눈을 갖고 있지 않다는 뜻일 수 있다. 도구를 하나 더 두는 것은 리뷰어를 하나 더 두는 것과 같다.18.6 공식 자료가 있는 곳
컴파일러 이야기는 판과 옵션에 매여 있어서, 1차 자료를 직접 여는 습관이 특히 값지다. 이 책을 쓰는 시점에 살아 있는 주소를 모아 둔다(도메인만 적는다 — 경로는 바뀌어도 도메인은 오래간다).
| 무엇 | 공식 자료 | 영어 위키백과 항목 |
|---|---|---|
| GCC | gcc.gnu.org — 매뉴얼·옵션·릴리스 노트 | GNU Compiler Collection |
| Clang / LLVM | clang.llvm.org (프런트엔드), llvm.org (전체) | Clang, LLVM |
| MSVC | visualstudio.microsoft.com (설치), learn.microsoft.com/cpp (문서) | Microsoft Visual C++ |
| Pelles C | pellesc.se (홈), forum.pellesc.de (포럼) | 단독 문서 없음 — LCC (compiler) 항목의 절 |
| tcc | bellard.org/tcc | Tiny C Compiler |
표 18.6
세 가지만 덧붙인다. 첫째, 옵션의 정확한 뜻은 그 컴파일러의 매뉴얼에만 있다 — 17장에서 켜 둔 경고들이 무엇을 잡는지도 거기 적혀 있다. 둘째, 릴리스 노트가 「이번 판에서 어느 표준 기능이 들어왔는가」를 알려 준다 — C23 기능의 지원 현황을 확인하는 가장 빠른 길이다. 셋째, 위키백과는 역사와 계보를 훑기에 좋고, 정확한 동작의 근거로는 공식 문서를 쓴다.
문. 컴파일러를 고르는 실무의 기준을 한 줄로 요약하면?
답. 대상 기계가 먼저 고르고, 나머지를 사람이 고른다. 겨냥할 칩이 정해지면 선택지는 대개 두어 개로 줄고(그 칩을 아는 컴파일러만 남으므로), 그 안에서 인증·가격·진단 품질·팀의 익숙함으로 정한다. 배우는 단계에서는 반대다 — 아무 데서나 도는 표준 C를 쓰고, 흔한 도구 둘로 검증하는 것으로 충분하다.
복습 정리
| 이름 | 한 줄 |
|---|---|
| GCC | 자유 소프트웨어. 겨냥하는 칩이 가장 많다 |
| Clang/LLVM | 부품으로 쓰이는 컴파일러. 도구 생태계의 바탕 |
| MSVC | 윈도우의 표준. C11·C17 지원, C23 진행 중 |
icx·AOCC·nvc·Open XL | 벤더의 성능 컴파일러. 대부분 LLVM 기반 |
| 임베디드 계열 | 다음 장 |
| Pelles C | 윈도우 전용 프리웨어 한 묶음. C23까지 지원. 곁다리 |
| 은퇴한 이름 | icc, Turbo C, 왓콤, Dev-C++, TDM-GCC |
표 18.7
마지막으로, 학습자에게 한마디. 이 장에 나온 현역 컴파일러 중 무엇으로 공부해도 상관없다. 이 책의 예제는 표준 C만 쓰므로 gcc·clang·MSVC·Pelles C 어디서든 같은 결과가 나온다. 손에 익은 것, 설치가 편한 것, 학교나 회사가 쓰는 것 — 아무 기준으로 골라도 배우는 내용은 달라지지 않는다.
다만 하나는 권하지 않는다. Dev-C++ 은 설치가 간편해 지금도 널리 쓰이지만, 물고 있는 컴파일러가 너무 오래됐다. C11 이후의 문법이나 C23의 낱말이 통하지 않아, “책대로 썼는데 왜 안 되지?”라는 벽을 만들기 쉽다. 같은 이유로 옛 교재의 Turbo C 화면도 따라 하지 않는 편이 좋다. 설치의 간편함이라면 17장의 두 갈래(LLVM clang 한 줄 설치, 또는 MSYS2 의 gcc)도 충분히 간편하고, 그쪽은 최신 표준과 검사 도구가 함께 온다.
컴파일러의 지형을 폈다. 이 지형의 가장 넓은 구역 — 임베디드의 컴파일러들과 그 곁의 연장들 — 은 도구 전체를 함께 보아야 뜻이 서므로 책의 끝에서 한 장을 따로 들여 다룬다(97장).
제3부가 끝났다. 첫 프로그램을 읽었고(15장), 그것이 실행 파일이 되는 릴레이를 보았고(16장), 도구를 갖췄고(17장), 세상의 컴파일러 지형을 폈다(18장). 다음 부부터 본격적인 언어 공부다 — 새 문법을 나열하는 것이 아니라, 15장의 헬로 월드 한 편을 완전히 읽어 내는 것이 제4부의 목표다.