본문으로 바로가기

기계어

 

별 다른 트랜스파일없이 CPU가 곧바로 이해할 수 있는 언어. 단, 기계어라해도 CPU의 종류에 따라 명령의 값이 다르다.  8051 CPU와 AVR CPU의 명령어에는 차이가 난다.

 

0x140010 => 0x14(명령) 00(메모리 주소) 10(값) 꼴로 작동한다.

 

 

어셈블리어

 

0x140010과 같은 명령어를 Move M(0), #10 과 같은 어셈블리어로 표현 가능하다. 어셈블리어는 기계어에 비해 인간이 일기 쉽고 실제로 어셈블리어를 이용해 코딩하는 경우도 있다. (자주는 아니다.)

 

그리고 기계어는 CPU가 채택한 ISA에 따라 다 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다. 또한 문법 아키텍처에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 제각각이다. 다른 아키텍쳐의 머신에게는 그 머신에게만 통용되는 별도의 어셈블리가 필요하다. 대부분 CPU 아키텍쳐로 현재 x86-AMD64, ARM을 많이 사용하고 있기는하다.

 

여튼 아무리 많이 x86, ARM을 사용한다고는 해도 2개인데 그렇다면 컴파일러는 기계를 인식하고 해당 기계가 사용하는 언어로 변환해야 한다. 이는 너무 비효율적이다.

 

https://dongwoo.blog/2017/06/06/%eb%b2%88%ec%97%ad-%ec%96%b4%ec%85%88%eb%b8%94%eb%a6%ac-%ec%a7%91%ec%a4%91-%ec%bd%94%ec%8a%a4/

 

이를 해결하기 위해 대부분의 컴파일러는 둘 사이에 최소한 하나의 레이어를 둔다. 컴파일러는 상위 레벨 프로그래밍 언어를 읽어서, 너무 상위 레벨도 아니면서 기계 코드의 레벨에서 동작하지도 않는 무언가로 번역한다. 이것을 중간 표현 형식 (IR: Intermediate representation) 이라고 한다.

 

주의하자
중간 언어 : 프로그래밍 언어와 기계어 사이에 있다고 해서 어셈블리어를 중간 언어라고 함
중간 형식 : 프로그래밍 언어를 적절한 어셈블리어로 변환하기 위한 IR

 

컴파일러의 프론트엔드는 상위 레벨 프로그래밍 언어를 IR로 번역한다. 컴파일러의 백엔드는 IR을 대상 아키텍쳐의 어셈블리 코드로 번역한다.

 

https://dongwoo.blog/2017/06/06/%eb%b2%88%ec%97%ad-%ec%96%b4%ec%85%88%eb%b8%94%eb%a6%ac-%ec%a7%91%ec%a4%91-%ec%bd%94%ec%8a%a4/

 

 

이런 의미에서 어셈블리어는 기계어에 비하여 고수준의 언어고 기계어는 저수준의 언어이다.

저수준/고수준 언어의 차이는 절대적인 것이 아니라 비교적인 개념으로 접근해야 한다.

어셈블리어에 비교하면 C언어는 고수준이다.

 

 

 

여기를 읽어보세요)

 

 

[번역] 어셈블리 집중 코스

웹어셈블리가 어떻게 작동하는지를 이해하기 위해서는, 어셈블리가 무엇이고 컴파일러가 어떻게 그것을 생성해내는지를 이해하는 것이 도움이 될 것이다. JIT에 대해 설명한 글에서 나는 기계

dongwoo.blog

 

 

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체