728x90
컴파일러는 실행할 플랫폼에 맞는 기계어 코드를 생성해야한다.
하지만 운영체제와 CPU 아키텍처마다 명령어 세트, 실행 방식이 다르기에 동일한 소스코드라도 각 플랫폼에 맞게 다르게 변환된다.
주요 원인
1. CPU 아키텍처의 차이 - CPU 마다 지원하는 명령어 세트가 다름
대표적 아키텍쳐 종류
x86 = 데스크톱, 서버에서 사용
ARM = 스마트폰, 임베디드 시스템
같은 코드라도 x86 과 ARM 에서 실행되는 코드가 다르게 컴파일 됨
int Add(int a, int b)
{ return a + b; }
====== x86 ======
mov eax, edi ; // a 값을 eax 레지스터에 저장
add eax, esi ; // b 값을 더함
ret ; // 함수 반환
====== ARM64 ====
add w0, w0, w1 ; // w0(a) + w1(b) 결과를 w0에 저장
ret ; // 함수 반환
x86 은 mov, add 등 여러 명령어를 사용하지만
ARM 은 add 하나의 명령어로 수행된다.
2. 운영체제 차이
운영체제마다 시스템 호출, 실행파일 형식, 라이브러리 등이 다름
따라서 같은 소스코드라도 OS 별로 다르게 컴파일됨
Windows 에서 컴파일된 실행파일 .exe 과 Linux 에서 컴파일된 실행 파일 .out
3. 컴파일러 최적화 방식 차이
동일한 소스코드라도 GCC, Clang, MSVC 같은 컴파일러가 다르게 변환할 수 있다.
4. 실행 환경차이 (32비트, 64비트)
32비트와 64비트는 CPU 레지스터의 크기, 주소 공간이 다르다
32비트는 eax, ebx 레지스터를 사용하고, 64비트에서는 rax, rbx 를 사용한다.
int Add(int a, int b)
{ return a + b; }
===== 32Bit =====
mov eax, dword ptr [esp+4] ; // a 값을 eax에 저장
add eax, dword ptr [esp+8] ; // b 값을 더함
ret
===== 64Bit =====
mov eax, edi ; // a 값을 edi 레지스터에 저장
add eax, esi ; // b 값을 더함
ret
32비트는 스택 메모리를 사용해 함수 인자를 전달하고, 64비트는 CPU 레지스터를 직접 사용한다.
'CS' 카테고리의 다른 글
절차지향 프로그래밍 POP (0) | 2025.02.13 |
---|---|
객체지향 프로그래밍 OOP (0) | 2025.02.13 |
컴파일러 Compiler (0) | 2025.02.10 |
DI & DIP 의존성주입과 의존관계 역전원칙 (0) | 2024.12.11 |
String 문자열의 불변성 (1) | 2024.09.02 |