나는 호환성 보단 이식성이라 부르고 싶은데..


왜냐면 이것은 언어 자체의 특성이고 일단 바이너리로 바뀌면 전혀 상관없기 때문임


즉 이미 바이너리 화 한 프로그램, 즉 빌드된 프로그램은 호환성이 일단 날아가버린거고


여기서 말하는 호환성, 즉 이식성은 소스를 컴퓨터의 컴파일러나 어셈블러에게 먹히느냐 안먹히느냐 가 기준임




어셈블리를 먼저 보자

어셈블리 소스    ->    어셈블러    -> 바이너리

ARM 어셈블리 소스를 MIPS 어셈블러(MIPS 바이너리로 빌드된)에게 던지고 어셈블 하라고 해보자.

안된다. MIPS 어셈블리랑 ARM 어셈블리가 명백히 다르기 때문인데 더 쉽게 따지면 C# 을 C++ 컴파일러에게 던진 정도임


그럼 이번엔 ARM 에서 짠 C 소스를 MIPS C 어셈블러(역시 MIPS 바이너리로 빌드된)에게 던지고 컴파일 시키면?

C 소스    ->    C 컴파일러    ->    바이너리

된다. C는 이식성이 좋은 언어, 즉 고급 언어거든. 전처리 할거 하고 준비 다 된 C언어를 공통 C 문법으로 MIPS 바이너리로 바꾸는 거다.

이렇게 ARM에서 짠 C 소스, 뭐 사실 어디에서 짜든 상관은 없지만 결국 C가 다른 컴퓨터 환경에서도 이식된거임


여기서 말하는 다른 컴퓨터 환경은 즉 아키텍쳐인건 다 알았을거고.




그럼 자바의 경우는?

자바는 위의 두 경우랑 좀 다르다. 위 두개는 결국 실행하려면 일단 바이너리 화 되야하는데 바이너리 되는순간 즉시 (아키텍처 간) 호환성은 소멸한다. 자바는 다르다. 자바의 구조는 아래와 같음.

JAVA 소스    ->    자바 컴파일러    ->    자바 바이트코드

컴파일러는 원래 부터 어떤 언어간 이라도 일단 A 언어가 B 언어로 바뀌면 컴파일러임. 자바가 그런 컴파일러인데 진짜 그 아키텍처의 바이너리, 또는 기계명령(머신 인스트럭션)이 되는것이 아니다. 자바 바이트코드라는게 되는데,

자바하면 자바가상머신, JVM을 알거야. 이 가상 머신, 이것도 일종의 컴퓨터를 구현한거니깐 당연히 해당하는 기계명령이 있고 그게 자바바이트코드다. 이 가상머신이 자바 바이트코드를 실행하는거지. 이 가상머신은 당연히 해당 컴퓨터에 맞는 바이너리고, 그러니깐 처음 자바를 실행할때 필요한 자바런타임(JRE)는 각 아키텍처에 맞게 설치해야 하는거야.


전체적으로 실행을 보면

자바 바이트코드    ->    자바 가상 머신    ->    해당 아키텍처의 바이너리로 구동되는 자바 가상 머신이 그걸 처리

어떻게 보면 에뮬레이터 라고 보면됨. 다른 명령,연산을 소프트웨어적으로 구현하는게 에뮬레이터 인데 자바 가상 머신이 그렇지. 그렇기에 성능이 당연히 떨어지는거고. 근데 자바 자체가 느린건 아냐. 자바 바이트코드를 하드웨어상으로 처리하는 CPU를 자바 프로세서 라 하는데 이걸로 돌리면 네이티브 적으로 하드웨어 적으로 처리하는거니깐 다른 아키텍처들하고 비슷한 성능의 CPU면 당연히 비슷하게 처리하겠지.