본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제" 책과 강의를 기반으로 작성하였습니다.
저급언어
- 기계어 : 0과 1로 이루어진 명령어로 구성 (2진수, 16진수)
- 어셈블리어 : 기계어를 읽기 편한 상태로 번역한 저급언어
- 0101 0101 → Push rbp
- 1100 0011 → ret
고급 언어
컴퓨터가 이해할 수 있는 기계어로 변환하기 위해 인터프리터나 컴파일러가 필수적으로 요구됨
- 컴파일 언어
- 인터프리터 언어
✓ 컴파일 언어
- 코드가 실행되기 전 컴파일러를 거쳐서 기계어로 변환되어 실행되는 프로그래밍 언어
- 소스 코드를 전체적으로 컴파일하여 목적 코드(기계어 또는 중간 코드)로 변환
- 컴파일 과정에서 최적화(주석 제거 등)가 가능하며, 목적 코드는 특정 하드웨어 아키텍처에 최적화되어 실행
- C, C++(바이트 코드), Java(바이트 코드), Swift
❖ 컴파일러란?
고급언어를 기계어로 번역해주는 도구, 또는 논리적 장치
❖ 바이트 코드란?
가상 컴퓨터(VM : 컴퓨팅 환경을 소프트웨어로 구현)에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다. 자바와 C#에서 바이트 코드 형태로 컴파일되어 저장되며, 실행 전에 JIT 컴파일러에 의해 기계 코드로 번역된다. 번역으로 인한 지연시간이 발생하지만 인터프리터보다 훨씬 좋은 성능을 보인다.
하드웨어 독립성을 위해 사용한다.
✓ 인터프리터 언어
- 런타임 때 코드를 한 줄씩 읽어 기계어로 번역하며 실행하는 언어
- 매 실행마다 소스 코드를 해석해야 하므로, 반복적으로 실행되는 부분에서 오버헤드 발생
- 컴파일러 언어 보다 느린 이유 → 최적화 기회가 부족하며, 매번 실행 시 다시 하므로 캐시 활용 어려움
- 컴파일 과정이 생략되기 때문에 빠르게 수정할 수 있다.
- 대표적 언어로는 Python과 자바스크립트기 있다.
고급언어를 컴파일 해보기
Compiler Explorer
godbolt.org
▶︎ C언어 컴파일
x86-64는 CPU를, gcc 13.2 는 컴파일러를 나타낸다.
사진을 보면 소스코드가 어셈블리어로 변환된 것을 볼 수 있다. GCC 컴파일러는 소스코드를 바로 기계어로 변환하는 것이 아니라 어셈블리 코드를 생성하고, 어셈블리 코드를 목적 코드로 변환 후 최종적으로 링크작업을 통해 실행 파일을 생성한다.
▶︎ Java 컴파일
컴파일러 작업 수행 과정
컴파일러라고 컴파일 작업만 수행하는 것이 아니다. 일반적으로 여러 단계의 프로세스를 포함한다.
1. 전처리 (Preprocessing): 소스 코드에 대한 주석제거, 빈 줄 제거, 매크로 확장 등 수행
2. 컴파일(Compilation): 전처리된 소스 코드를 어셈블리어 코드로 컴파일
3. 어셈블(Assembly) 어셈블리어 코드가 어셈블러에 의해 기계어로 변환
4. 링크(Link) : 여러 개의 목적 파일이나 라이브러리를 하나로 묶어 최정적인 실행 파일 생성
목적 파일 : 소스 코드를 컴파일한 결과물 중하나로, 최종 기계어로 변환된 파일이다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
컴퓨터 구조 #6 - CPU 내부 구성(ALU, 제어 장치) (0) | 2024.01.27 |
---|---|
컴퓨터 구조 #5 - 명령의 구조와 주소 지정 방식 (0) | 2024.01.26 |
컴퓨터 구조 #3 - 0과 1로 문자를 표현하는 방법 (1) | 2024.01.24 |
컴퓨터 구조 #2 - 0과 1로 숫자를 표현하는 방법 (2) | 2024.01.24 |
컴퓨터 구조 #1 - 대략적인 컴퓨터 구성(CPU, 메모리, 레지스터) (1) | 2024.01.24 |