서론: 바벨탑의 언어를 기계어로
우리가 지금까지 배운 C언어는 printf, if, while 같은 영어 단어로 되어 있습니다. 하지만 컴퓨터(CPU)는 영어를 전혀 모릅니다. 컴퓨터가 아는 것은 오직 전기가 들어오고(1) 나가는(0) 신호뿐입니다.
그렇다면 도대체 어떻게 우리가 쓴 영어 코드가 기계를 움직이는 걸까요? 그 사이에는 인간의 언어를 기계의 언어로 완벽하게 번역해 주는 천재 통역사, '컴파일러(Compiler)'가 존재합니다.
오늘 19편에서는 소스 코드가 실행 파일(.exe)로 변신하는 마법 같은 번역의 과정을 NASA 엔지니어의 시선으로 해부해 봅니다.
본론 1: 고급 언어 vs 저급 언어
프로그래밍 언어는 '누가 이해하기 쉬운가'에 따라 레벨이 나뉩니다.
- 고급 언어 (High-Level): 인간에게 친숙합니다. (C, Python, Java)
예:a = b + 1(b에 1을 더해라) - 저급 언어 (Low-Level): 기계에게 친숙합니다. (기계어, 어셈블리어)
예:10110000 01100001(메모리 0x61번지로 이동하라)
컴파일러는 이 고급 언어를 저급 언어로 낮춰주는(Translate Down) 역할을 합니다.
본론 2: 번역의 4단계 (빌드 과정)
우리가 키보드로 '빌드(Build)' 버튼을 누르는 순간, 내부에서는 눈 깜짝할 새에 4단계 공정이 일어납니다.
- 전처리 (Preprocessing): 본격적인 번역 전에 준비 작업을 합니다.
#include같은 파일을 가져오고, 주석(메모)을 싹 지워서 깨끗한 상태로 만듭니다. - 컴파일 (Compilation): C언어 문법을 검사하고, 이를 '어셈블리어'라는 중간 언어로 번역합니다. 문법 오류(Syntax Error)가 있다면 여기서 빨간 줄을 띄웁니다.
- 어셈블리 (Assembly): 중간 언어를 진짜 0과 1로 된 기계어(Object Code)로 바꿉니다. 이제 사람은 읽을 수 없습니다.
- 링크 (Linking): 여러 개의 기계어 파일들과 라이브러리(도서관)를 하나로 합쳐서 최종적인 실행 파일(.exe)을 만듭니다.
본론 3: 똑똑한 통역사, 최적화(Optimization)
현대의 컴파일러는 단순히 번역만 하지 않습니다. 인간이 멍청하게 짠 코드를 더 효율적으로 고쳐주기도 합니다. 이를 최적화라고 합니다.
예를 들어 개발자가 a = 10 + 20 + 30;이라고 썼다면, 컴파일러는 실행할 때마다 덧셈을 하는 대신 미리 a = 60;으로 바꿔서 번역해 버립니다. NASA의 소프트웨어가 극한의 성능을 낼 수 있는 이유는 엔지니어의 실력도 있지만, 이 컴파일러의 무시무시한 최적화 능력 덕분이기도 합니다.
결론: 소프트웨어의 탄생
컴파일러가 없다면 우리는 여전히 0과 1로 코딩을 하고 있었을 것입니다. 컴파일러는 인간의 추상적인 아이디어를 물리적인 기계의 동작으로 실체화시키는 가장 위대한 소프트웨어입니다.
이제 대망의 마지막 20편만이 남았습니다.
지금까지 배운 19가지 지식을 바탕으로, [Part 20. 개발자의 자질: 코딩은 언어가 아니라 '생각하는 훈련'이다] 편에서 이 긴 여정을 마무리하고, 진정한 엔지니어의 길을 제시해 드리겠습니다.