[CS BASIC] 컴퓨터가 코드를 이해하는 법

맹쥐·2025년 3월 18일

정글-개발일지

목록 보기
2/24

컴파일 시스템이란 ?

사람이 작성한 코드는 기본적으로 컴퓨터가 읽을 수 없다. 컴퓨터는 0과 1로 이루어진 기계어(바이너리 코드)만 이해할 수 있다.
하지만 사람이 기계어를 작성하기 어렵기 때문에, 사람이 읽을 수 있는 언어(C, Java , Python 등)를 사용한다.

  • 사람이 읽기 쉬운 언어를 고급언어라 하고, 기계에 가까운 언어를 저급언어라 칭한다. (사람이 이해할 수 있는 언어로 high-level 이라는 표현을 사용한다.) 이 용어는 익숙해지면 좋다.
  • 이처럼 인간이 코드를 작성하고 이를 컴퓨터가 읽고 실행하려면 기계어로 번역하는 과정이 필요한데 이를 컴파일 시스템이라고 부른다.


알아두면 좋을 기본적인 개념

  • .i, .c, .s, .o와 같이 파일 이름 뒤에 붙는 확장자는 그 파일의 형태(역할/단계)를 나타낸다.
    예를들어, .c는 C 프로그램 소스 코드로 작성한 파일이다. 컴파일 과정에서 소스 코드가 변환될 때마다 단계별로 새로운 파일이 생성되며, 확장자가 달라진다.
  • 최종적으로는 기계어로 번역된 목적 파일(.o)을 생성하게 된다.
  • 이 .o 파일을 "목적 파일(Object file)"이라고 부르며, 아직 완전히 실행 가능한 프로그램은 아니다.
  • 여러 개의 .o 파일을 링커(Linker)로 묶어 실행 파일(Executable file)로 완성해야 한다.
    → 확장자가 없거나 .exe인 파일 생성.


바이너리 / 어셈블리어 / 아스키 차이

용어설명
바이너리0과 1로 이루어진 데이터(기계어 코드 포함) 컴퓨터가 직접 이해하는 언어
어셈블리어바이너리를 사람이 읽을 수 있도록 CPU 명령어에 맞게 텍스트로 표기한 언어 ex) MOV AX, 1
아스키(ASCII)텍스트를 숫자(바이너리)로 매핑한 표준 ex) 'A' = 65 = 01000001 (7비트/8비트 코드)




컴파일 시스템의 4단계

1. 전처리 단계 [.i]

  • #include, #define 같은 전처리 지시문을 처리한다. 쉽게 말해, 코드에서 맨 윗줄에 있는 헤더파일을 실제 코드에 끼워 넣어주는 역할이라고 생각하면 된다.
  • 결과물은 전처리된 소스 코드(.i) 형태로 저장된다.
 int main() {
    printf("Hello\n"); // stdio.h 코드가 앞부분에 포함됨
    return 0;

2. 컴파일 단계 [.s]

  • 전처리된 코드를 어셈블리어(.s)로 변환하는 과정이다.
  • 이때부터 사람이 작성한 고급 언어 코드가 CPU에 맞는 저수준 언어(어셈블리어)로 바뀌기 시작한다.
  • 이 과정에서 문법 검사, 최적화, 중간 코드 생성 등이 이루어진다.
    .globl main
	main:
    pushq   %rbp
    movq    %rsp, %rbp
    leaq    .L.str(%rip), %rdi
    call    printf
    popq    %rbp
    ret
	.L.str:
    .string "Hello\n"

3. 어셈블리 단계 [.o]

  • 어셈블리어 코드를 읽어 기계어(바이너리)로 변환하고, 목적 파일(.o, .obj)을 생성한다.
  • 목적 파일(Object File)은 CPU가 읽을 수 있는 기계어 코드이긴 하지만, 아직 완성된 프로그램은 아니다.
    ELF....^@^@^@...text....data...Hello\n

4. 링크 단계

  • 여러 개의 목적 파일(.o)과 필요한 라이브러리를 결합하여 실행 가능한 프로그램을 만든다.
  • 링커는 기계어 코드 조각들을 하나로 묶어주는 마지막 단계이며, 이 과정을 통해 완성된 실행 파일(확장자 없음 or .exe 등)이 생성된다.
hello: ELF 64-bit LSB executable, x86-64, dynamically linked ...

✅ 팁
.i, .s는 텍스트 파일
.o와 실행파일은 바이너리(0과 1로 된 기계어 코드)

profile
이유민

0개의 댓글