컴퓨터 소프트웨어 기술의 발전으로 우리는 컴파일러라는 아주 똑똑한 통역사를 두게 되었다.
컴파일러는 프로그래머가 이해하는 언어를 프로세서가 쓰는 기계어로 번역해주며, 문법 오류 및 최적화까지 해준다.
그렇다면 컴파일러가 번역해 주는 프로세서의 언어에 대해서 알아본다
우리는 디버깅을 하면서 이미 프로세서를 접하고 있다.
디버깅을 하다보면 우리는 레지스터의 상태를 볼 수 있으며, 함수의 호출 스택도 확인할 수 있다. 또한 어떤 메모리에 어떤 값이 담겨있는지도 확인할 수 있다.
이런것들은 현재 프로세서의 상태를 나타내며, 이를 컴퓨터 구조적 상태(architectural state)라고 부른다.
실제로 우리가 디버깅시에 볼 수 있는 레지스터 및 메모리 상태나, 코드가 한줄씩 순차적으로 실행되는것처럼 보이는 이유는 프로세서와 프로그래머 사이의 약속이기 때문이다.
프로세서가 사용하는 언어를 기계어(machine language) 혹은 어셈블리어(assembly language)라고 부른다. 이것을 명령어 집합 구조(Instruction Set Architecture) 라고 부르며, 줄여서 ISA로 표현한다.
ISA는 프로세스마다 다르다.
인텔과 AMD프로세서는 x86이라는 ISA를 사용하는데, 동일한 ISA를 사용시에는 내부 구조가 다르다고 하더라도 x86 ISA를 이용해서 만든 프로그램들의 경우 Intel과 AMD 프로세서에서 별 문제 없이 프로그램이 작동한다.
반면, 다른 ISA를 사용해 만든 프로그램의 경우 새롭게 컴파일 하거나, 에뮬레이션을 거쳐야만 실행할 수 있다.
그렇기 때문에 우리는 운영체제와 독립적으로 프로그램이 작동할 수 있도록 프로그래밍 언어를 별도로 사용한다.
이런 프로그래밍 언어를 컴파일러 혹은 인터프리터의 도움을 통해서 프로세서가 이해할 수 있는 기계어로 변환한다.