🔥 컴퓨터가 소스코드를 실행하는 과정
우리가 사용하는 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)
✅ 실습 방법
- 고급 언어(C, Python) 소스코드를 입력
- 오른쪽 창에서 어셈블리어 코드 변환 결과 확인
- CPU 아키텍처(x86, ARM 등)에 따라 변환된 코드가 달라지는 것도 확인 가능
📌 실습을 통해 확인할 수 있는 것
- 고급 언어가 어셈블리어로 변환되는 과정
- CPU 아키텍처별 명령어 차이
- 컴파일러 옵션에 따라 기계어 코드 최적화 여부
🏁 정리: 소스코드와 명령어 변환 과정
📌 고급 언어 → 기계어로 변환하는 과정이 필요함
📌 컴파일 언어 vs 인터프리터 언어 비교
비교 항목 |
컴파일 언어 | 인터프리터 언어 |
변환 방식 | 전체 코드 변환 후 실행 | 한 줄씩 변환하여 실행 |
실행 속도 | 빠름 | 느림 |
예제 언어 | C, C++ | Python, JavaScript |
장점 | 빠른 실행 속도 | 개발 편의성 높음 |
단점 | 수정 후 재컴파일 필요 | 실행 속도가 느림 |
📌 고급 언어 → 어셈블리어 → 기계어(0과 1) 변환 과정을 이해하는 것이 중요! 🚀
✍ 이 블로그 포스트를 통해 배운 점
- 컴퓨터는 0과 1로 된 기계어만 이해한다.
- 고급 언어(소스코드)를 기계어로 변환하는 과정이 필요하다.
- 컴파일 언어(C, C++)와 인터프리터 언어(Python, JavaScript)의 차이점
- 컴파일 과정과 인터프리트 과정이 어떻게 진행되는지 이해했다.
출처:
혼자공부하는 운영체제 - 강민철
'Computer Science > Computer Structure' 카테고리의 다른 글
혼공 운영체제) 02.데이터 02.0과 1로 숫자를 표현하는 방법 2 (0) | 2025.02.18 |
---|---|
혼공 운영체제) 02.데이터 01.0과 1로 숫자를 표현하는 방법 1 (0) | 2025.02.18 |
혼공 운영체제) 01.컴퓨터 구조 시작 02.컴퓨터 구조의 큰 그림 (0) | 2025.02.18 |
혼공 운영체제) 01.컴퓨터 구조 시작 01.컴퓨터 구조를 알아야 하는 이유 (0) | 2025.02.18 |