1. Background: Binary

프로그램과 컴파일

프로그램

프로그램은 연산 장치가 수행해야 할 동작을 적어 둔 명령서로, 컴퓨터(CPU)는 이 명령을 해석·실행해 원하는 결과를 만든다.

이런 명령을 받아 다양한 일을 수행할 수 있는 장치를 programmable하다고 하며, 현대의 컴퓨터가 대표적인 예이고 일반 계산기는 상대적으로 non-programmable한 장치에 가깝다.

과거에는 프로그램을 내부에 저장하기 어려워 사람의 배선 연결로 전달하거나 천공카드에 기록해 사용했는데, ENIAC처럼 프로그램을 바꿀 때마다 배선을 재배치해야 해서 비효율적이고 큰 프로그램을 쓰기 어려웠다. 이후 이 문제를 해결한 Stored-Program Computer가 등장하면서 프로그램을 메모리에 저장해두고 필요할 때 불러 실행할 수 있게 되었고, 그 결과 오늘날 대부분의 컴퓨터가 이 구조를 따른다. 또한 프로그램이 메모리에 이진(Binary) 형태로 저장되기 때문에, 많은 개발자·해커들이 프로그램을 바이너리라고 부르기도 한다.

=> 바이너리의 2가지 흔한 뜻: 1) 실행 파일/프로그램 그 자체 2) CPU가 직접 실행하는 기계어


컴파일러와 인터프리터

프로그래밍 언어는 프로그램을 개발하기 위해 사용하는 언어이며, CPU가 이해할 수 있는 형태는 기계어이므로 소스 코드는 실행 전에 번역 과정이 필요하다. 이 번역 방식은 크게 컴파일과 인터프리팅으로 구분된다. (소스 코드 => 번역 과정 => 기계어)

**컴파일(Compile)**은 C, C++, Go, Rust 등으로 작성된 소스 코드(Source Code)를 컴퓨터가 실행할 수 있는 기계어 형태로 미리 변환하는 과정이다. 이 과정을 수행하는 소프트웨어를 **컴파일러(Compiler)**라고 하며, 대표적으로 GCC, Clang, MSVC 등이 있다. 컴파일이 완료되면 실행 가능한 결과물이 생성되므로 이후에는 별도의 번역 과정 없이 동일한 프로그램을 반복 실행할 수 있다.

반면 **인터프리팅(Interpreting)**은 Python, JavaScript 등에서 주로 사용되는 방식으로, 소스 코드 또는 사용자의 입력을 실행 시점에 한 줄씩(또는 단계적으로) 해석하여 CPU에 전달한다. 이 역할을 수행하는 프로그램을 인터프리터(Interpreter)라고 한다.

비유적으로 컴파일은 문서를 한 번 번역해 번역본을 만들어두는 것에 가깝고, 인터프리팅은 대화할 때마다 실시간 통역을 거치는 방식에 가깝다. 전자는 초기 번역에 시간이 들 수 있으나 결과물이 남아 재사용이 가능하고, 후자는 즉시 실행이 가능하지만 실행할 때마다 해석 과정이 반복된다는 특징이 있다.


컴파일 과정

C언어로 작성된 코드는 일반적으로 **전처리(Preprocess), 컴파일(Complie), 어셈블(Assemble), 링크(Link)**의 과정을 거쳐 바이너리로 번역된다.