C언어 이식성에 대해서 궁금한 게 있습니다.
C언어의 소스 코드를 컴파일러 없이
CPU가 직접 해석을 하는 건가요?
이식성이란 게 어떻게 이루어지는 건가요?
CPU에 컴파일 기능이 포함되어 있는 건가요?
프로그램 만든 것을 다른 하드웨어에서도 동작하는 것이 이식이라고 하나요
아니면 소스 코드를 다른 하드웨어로 옮겼을 때 컴파일 되는 것을 이식이라고 하나요..
만약 후자라면 컴파일은 어떻게 이루어지나요? CPU만으로?
CPU는 정확하게 2진수 바이러리를 인식합니다
01010001110 이런식의 바이너리를 인식하는것이죠
그리고 C언어는 int a; 이런식으로 코딩을 하는데요
CPU는 int a 이런게 뭔지 모릅니다
그래서 int a; 을 어셈블리어로 변환해주고 그리고 어셈블리를 바이너리 기계어로
번역을 해줍니다
근데 2진법은 우리 사람들이 알기 어렵기 때문에
디버그에서 해당 소스를 볼때 16진법을 사용합니다 ( 0-9,A-F)
그래서 c 언어이든 뭐든 코딩을 a=1+2 라고 했다면?
이걸 어셈블리어로 변경 mov ax,1;mov bx,2
어셈블리어를 기계어로 변경 01 23 ee 02 22 ef 이런식으로 바뀌는거죠
그래서 이 기계어를 CPU가 읽고 실행하는것입니다
즉 , C언어 실행하면? 내부적으로 어셈블리어로 변경후 다시 기계어로 최종변경이 되고
이 기계어는 CPU를 따라가기 때문에 intel 용이라면? risc 등에선 실행이 안됩니다
또한 같은 인텔cpu라고 해도 64비트 전용 cpu용 기계어라면? 당근 32비트 전용cpu에선 해당 기계어가
실행이 안됩니다!
Intel CPU, AMD CPU, ARM CPU마다 다른 명령어 구조와 집합을 가지고 있습니다. 그리고 컴퓨터마다 windows, linux, 등등 OS도 서로 다르구요. OS가 다르다는 말은 서로 명령어가 서로 다른다는 말과 같습니다.
우리가 같은 C언어로 작성을 해도 내부적으로 기계가 해석하는 게 컴퓨터 마다 서로 다르다는 걸 의미합니다. 그걸 컴퓨터에 맞게 기계어로 번역하는게 바로 컴파일러의 역할 입니다. CPU는 단지 컴파일러 해석한 기계어를 실행시키는 역할만 할 뿐입니다.