Programming Language hierarchy
- C와 같은 High-Leve Language로 작성된 코드 는 컴파일러에 의해 Assembly Language로 변환되고, 이는 어셈블러에 의해 Machine Language로 변환된다.
- Linker는 컴파일러, 어셈블러에 의해 변환된 Object file을 하나의 실행파일로 연결(i.e. .EXE)
- 생성된 실행 파일은 운영체제에 의해 메모리에 로드되고, CPU는 기계어를 실행
- 이 때, CPU의 아키텍쳐에 따라 기계어의 해석이 진행된다(ex. X86, Arm 등)
Machine language란?
- CPU가 해석할 수 있는 numeric language
- 모든 X86 프로세서는 공통적인 기계어(X86에 해당하는 기계어)를 해석할 수 있음
Assembly Language와 Machine Language의 관계
- 어셈블리어는 ADD, MOV, SUB, CALL과 같은 짧은 mnemonics(니모닉)들로 작성된 명령어로 구성됨
- 어셈블리어는 기계어와 1 : 1(one-to-one) 관계를 가지고 있다
C++(High-level Language)과 Assembly Language와의 관계
- High-level Language는 어셈블리어와 1대다(one-to-many) 관계를 가지고 있음
- C++의 명령어 하나는 여러개의 Assembly 언어와 기계어로 확장된다
- 예시)
int Y;
int X = (Y + 4) * 3;
mov eax, Y ; Y의 값을 eax 레지스터로 이동
add eax, 4 ; eax 레지스터에 4를 더한다
mov ebx, 3 ; 3을 ebx 레지스터로 이동
imul ebx ; eax에 ebx의 값을 곱한다
mov X, eax ; eax의 값을 X에 대입
어셈블리 언어의 특징
- non-Portable
- 특정 Processor family를 위해 디자인됨 (X86 어셈블리어를 다른 아키텍쳐 Processor에서 읽을 수 없음)
- ex) 인텔 프로세서에서 작성된 기계어를 Apple Silicon의 프로세서가 읽을 수 없음
- embedded program을 작성하는데 유리함
- 메모리를 효율적으로 관리할 수 있음
- real-time application을 작성하는데 유리함
- High-level 언어로 작성된 코드는 컴파일러에 의해 기계어로 번역되기 때문에 정확한 control을 할 수 없다
- 어셈블리어는 프로그램 코드를 보다 정확하게 지정할 수 있다
- Console-game 코드를 작성하는데 유리함
- 하드웨어에 직접적으로 접근할 수 있기 때문에, 속도 향승을 위한 직접적인 코드 작성이 가능함
오늘날 프로그램의 작성
- 과거에는 memory가 적고, 프로세서의 연산 처리가 느렸기 때문에 대부분 어셈블리어로 코드를 작성함
- 오늘날에는 하드웨어의 성능이 좋아졌기 때문에 프로그램들이 복잡해지고, 어셈블리어로 큰 규모의 프로그램을 작성하는 것은 쉽지 않음
- 속도 향상을 위해 프로그램의 특정부분을 최적화 하거나, 하드웨어에 직접 접근하기 위해 어셈블리어를 사용한다