기계어
별 다른 트랜스파일없이 CPU가 곧바로 이해할 수 있는 언어. 단, 기계어라해도 CPU의 종류에 따라 명령의 값이 다르다. 8051 CPU와 AVR CPU의 명령어에는 차이가 난다.
0x140010 => 0x14(명령) 00(메모리 주소) 10(값) 꼴로 작동한다.
어셈블리어
0x140010과 같은 명령어를 Move M(0), #10 과 같은 어셈블리어로 표현 가능하다. 어셈블리어는 기계어에 비해 인간이 일기 쉽고 실제로 어셈블리어를 이용해 코딩하는 경우도 있다. (자주는 아니다.)
그리고 기계어는 CPU가 채택한 ISA에 따라 다 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다. 또한 문법 아키텍처에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 제각각이다. 다른 아키텍쳐의 머신에게는 그 머신에게만 통용되는 별도의 어셈블리가 필요하다. 대부분 CPU 아키텍쳐로 현재 x86-AMD64, ARM을 많이 사용하고 있기는하다.
여튼 아무리 많이 x86, ARM을 사용한다고는 해도 2개인데 그렇다면 컴파일러는 기계를 인식하고 해당 기계가 사용하는 언어로 변환해야 한다. 이는 너무 비효율적이다.
이를 해결하기 위해 대부분의 컴파일러는 둘 사이에 최소한 하나의 레이어를 둔다. 컴파일러는 상위 레벨 프로그래밍 언어를 읽어서, 너무 상위 레벨도 아니면서 기계 코드의 레벨에서 동작하지도 않는 무언가로 번역한다. 이것을 중간 표현 형식 (IR: Intermediate representation) 이라고 한다.
주의하자
중간 언어 : 프로그래밍 언어와 기계어 사이에 있다고 해서 어셈블리어를 중간 언어라고 함
중간 형식 : 프로그래밍 언어를 적절한 어셈블리어로 변환하기 위한 IR
컴파일러의 프론트엔드는 상위 레벨 프로그래밍 언어를 IR로 번역한다. 컴파일러의 백엔드는 IR을 대상 아키텍쳐의 어셈블리 코드로 번역한다.
이런 의미에서 어셈블리어는 기계어에 비하여 고수준의 언어고 기계어는 저수준의 언어이다.
저수준/고수준 언어의 차이는 절대적인 것이 아니라 비교적인 개념으로 접근해야 한다.
어셈블리어에 비교하면 C언어는 고수준이다.
여기를 읽어보세요)
'💻 CS 일반 > 💻 CS 일반 (etc...)' 카테고리의 다른 글
Go로 살펴보는 메모리 정렬(alignment)과 메모리 패딩(padding) (0) | 2021.05.11 |
---|---|
Go로 살펴보는 오버플로, 언더플로, float간 비교 (0) | 2021.05.09 |
Cache의 개념 (0) | 2021.01.31 |
비트 연산자와 보수에 대하여 (0) | 2020.09.29 |
프로세스, 프로세서(CPU), Context Switching, 스레드, 멀티스레드 (0) | 2020.08.25 |