🔥 컴퓨터가 소스코드를 실행하는 과정

우리가 사용하는 C, C++, Python, Java 같은 프로그래밍 언어는 사람이 읽고 쓰기 쉽도록 설계된 고급 언어입니다.
하지만 컴퓨터는 고급 언어를 바로 이해하지 못하며, 0과 1로 구성된 기계어로 변환해야 실행할 수 있습니다.

 

📌 이번 강에서는 고급 언어(소스코드)가 어떻게 컴퓨터가 실행할 수 있는 명령어로 변환되는지 학습합니다.
고급 언어와 저급 언어의 개념
기계어와 어셈블리어 비교
컴파일 언어 vs 인터프리터 언어
소스코드 변환 과정 (컴파일 & 인터프리트 과정 실습)


🏗 1. 고급 언어와 저급 언어

고급 언어 (High-Level Language)

  • 사람이 읽고 쓰기 쉽도록 설계된 프로그래밍 언어
  • 예: C, C++, Java, Python, JavaScript
  • 개발자가 이해하기 쉬운 문법을 제공

📌 예제 (Python)

print("Hello, World!")
  • 위 코드는 우리가 쉽게 읽고 이해할 수 있음
  • 하지만 컴퓨터는 이 코드를 바로 실행할 수 없음

저급 언어 (Low-Level Language)

컴퓨터가 직접 이해하고 실행할 수 있는 언어

  • 기계어 (Machine Language): 0과 1로만 이루어진 언어
  • 어셈블리어 (Assembly Language): 사람이 조금 더 읽기 쉽게 표현한 저급 언어

📌 예제 (기계어)

 
10101011 00001111 11001010 10101010

 

문제가 뭘까?

  • 사람이 읽고 이해하기 어렵다.
  • 개발자가 직접 작성하기 어렵다.
  • 컴퓨터는 기계어만 이해할 수 있기 때문에, 고급 언어 → 기계어로 변환해야 한다.

🎯 2. 기계어와 어셈블리어

기계어 (Machine Code)

  • 컴퓨터가 직접 이해할 수 있는 0과 1로 된 코드
  • CPU가 기계어를 실행하여 프로그램을 동작

📌 기계어 예제

 
10100011 01011000 11001010 01101100

 

문제점:

  • 사람이 직접 작성하기 어려움
  • 디버깅이 어렵고 유지보수가 불편함

어셈블리어 (Assembly Language)

  • 기계어를 사람이 좀 더 이해하기 쉽게 변환한 저급 언어
  • CPU 명령어를 문자 형태로 표현

📌 어셈블리어 예제

MOV AX, 5
ADD AX, 3

 

장점:

  • 기계어보다 사람이 읽기 쉬움
  • 특정 하드웨어(CPU)와 밀접하게 연관됨

단점:

  • 여전히 개발자가 직접 작성하기 어려움
  • 하드웨어에 따라 명령어가 달라지므로 이식성이 떨어짐

📌 따라서, 대부분의 프로그래머는 "고급 언어"를 사용하고, 이를 기계어로 변환하는 과정이 필요하다.


🛠 3. 컴파일 언어 vs 인터프리터 언어

고급 언어를 기계어로 변환하는 방식에는 컴파일 방식과 인터프리트 방식이 존재합니다.

컴파일 언어 (Compiled Language)

📌 특징

  • 소스코드를 한 번에 기계어로 변환한 후 실행
  • 실행 파일(.exe, .out)을 생성한 후 실행 가능
  • 프로그램 실행 속도가 빠름

📌 예제 언어

  • C, C++ (컴파일 방식 사용)

📌 컴파일 과정

소스코드 (C) → [컴파일러] → 기계어 변환 (목적 코드) → 실행 파일

장점

  • 실행 속도가 빠름
  • 배포 시 소스코드 노출 없이 실행 파일 제공 가능

단점

  • 컴파일 과정이 필요하여 실행 속도가 느릴 수 있음
  • 소스코드 수정 후 반드시 다시 컴파일해야 함

인터프리터 언어 (Interpreted Language)

📌 특징

  • 소스코드를 한 줄씩 해석하여 실행
  • 실행 파일을 만들지 않고, 코드 실행 속도가 느림

📌 예제 언어

  • Python, JavaScript, Ruby

📌 인터프리트 과정

소스코드 (Python) → [인터프리터] → 한 줄씩 기계어 변환 및 실행

 

장점

  • 즉시 실행 가능 (컴파일 과정 불필요)
  • 코드 수정 후 즉시 실행 가능 (개발 편의성 높음)

단점

  • 실행 속도가 느림
  • 프로그램을 실행할 때마다 해석해야 하므로 성능 저하

🔍 4. 컴파일 & 인터프리트 과정 실습

📌 소스코드가 컴파일 & 인터프리트 과정을 거쳐 어떻게 변환되는지 확인할 수 있는 사이트 소개
👉 godbolt.org (Compiler Explorer)

 

실습 방법

  1. 고급 언어(C, Python) 소스코드를 입력
  2. 오른쪽 창에서 어셈블리어 코드 변환 결과 확인
  3. CPU 아키텍처(x86, ARM 등)에 따라 변환된 코드가 달라지는 것도 확인 가능

📌 실습을 통해 확인할 수 있는 것

  • 고급 언어가 어셈블리어로 변환되는 과정
  • CPU 아키텍처별 명령어 차이
  • 컴파일러 옵션에 따라 기계어 코드 최적화 여부

🏁 정리: 소스코드와 명령어 변환 과정

📌 고급 언어 → 기계어로 변환하는 과정이 필요함


📌 컴파일 언어 vs 인터프리터 언어 비교

비교 항목
컴파일 언어 인터프리터 언어
변환 방식 전체 코드 변환 후 실행 한 줄씩 변환하여 실행
실행 속도 빠름 느림
예제 언어 C, C++ Python, JavaScript
장점 빠른 실행 속도 개발 편의성 높음
단점 수정 후 재컴파일 필요 실행 속도가 느림

 

📌 고급 언어 → 어셈블리어 → 기계어(0과 1) 변환 과정을 이해하는 것이 중요! 🚀


이 블로그 포스트를 통해 배운 점

  • 컴퓨터는 0과 1로 된 기계어만 이해한다.
  • 고급 언어(소스코드)를 기계어로 변환하는 과정이 필요하다.
  • 컴파일 언어(C, C++)와 인터프리터 언어(Python, JavaScript)의 차이점
  • 컴파일 과정과 인터프리트 과정이 어떻게 진행되는지 이해했다.

 

 

출처:
혼자공부하는 운영체제 - 강민철

+ Recent posts