C 크로스 플랫폼 바이너리

feanor의 이미지

최근 "자바와 C 어쩌구" 하는 재밌는 쓰레드가 계속되고 있는데요,

자바를 쓰지 않더라도 크로스 플랫폼 바이너리가 있으면 아주 좋을 것 같습니다. C 언어에는 이에 해당하는 것이 없는지 정말로 궁금합니다.

애플에 universal binary라는 게 있어서 인텔 맥과 PPC 맥에서 둘 다 동작하는 것 같은데 이것은 어떻게 동작하는 것인가요?

id Software의 Quake도 C로 만든 게임 모듈을 서로 다른 운영체제, CPU에서 돌릴 수 있도록 했던 것으로 기억합니다.

neogeo의 이미지

quake 에서 C 로 만든 모듈이 뭘 의미하는지는 모르지만, DATA 만 호환되지 바이너리는 이종 기계나 이종 OS 에서 호환되지 않습니다.

다만 현재의 게임 엔진들은 사용자에게 특정 언어를 강조하기보다 게임 엔진에 내장된 VM 과 스크립트 언어로 게임을 제작하면 여러가지 환경에서 돌 수 있음을 보여줍니다.

대표적인 케이스가 현재 가장 널리 쓰이는 언리얼 3 엔진입니다. PS3 , XBOX360 , PC 에서 똑같은 게임을 돌릴 수 있지요.

그러나 결과적으로 바이너리만은 각 플랫폼용 컴파일러로 컴파일 한겁니다. 이기종 호환 바이너리를 만드는건 C 언어의 문제가 아니라 컴파일러와 바이너리 포맷 , OS 에 얽혀 있으므로 VM 을 만들지 않는 이상 쉽지 않은 일입니다. ( 애초에 파일하나에 여러가지 기종의 바이너리를 담아버리던가요. )

Neogeo - Future is Now.

Neogeo - Future is Now.

segfault의 이미지

퀘이크 3 엔진에는 VM이 내장되어 있습니다. 게임과 관련된 로직은 엔진에 포함되어 있지 않고 따로 바이트코드로 만들어져서 VM 위에서 동작합니다.

관리 코드라서 잘못된 메모리 접근을 막을 수 있는 데다가 MOD 제작자들이 따로 멀티플랫폼을 고려하지 않아도 멀티플랫폼으로 MOD를 만들 수 있습니다.

ANSI C로 만들고 컴파일러로는 LCC의 개조된 버젼을 사용합니다. 퀘이크 3 SDK에 들어 있죠.

http://en.wikipedia.org/wiki/Quake_3_Arena#Virtual_machine

----
http://www.planetmono.org

김동수의 이미지

애플의 Universal Binary의 경우, 각각의 플랫폼의 코드를 모두 내장하는 식으로 설계되었습니다.
즉, 파일을 실행할때, OS가 그 파일의 헤더를 보고 Universal Binary 라고 판단되면, 아키텍쳐에 따라 파일의 다른 지점부터 실행을 시작합니다. (즉, 각각의 플랫폼별 코드 영역이 샌드위치처럼 쌓여 있는 구조라고 생각하시면 됩니다. 엔트리 포인트는 OS가 알아서 정해줍니다.)
이런쪽의 바이너리 호환 프로젝트(??)의 경우 여러가지 방법론이 있는데 앵간한 벤더들은 한번씩 시도했고, 지금도 사용하고 있습니다.
뭐 주요 밴더 별로 간략히 살펴보면..
애플은 각 플랫폼의 바이너리를 모두 빌드하여 하나의 파일로 합친 후 OS가 플랫폼별로 엔트리 포인트를 선택하는 방식
MS는 x86플랫폼의 바이너리를 읽어서 타겟 플렛폼(비x86) 의 네이티브 바이너리로 번역하는 방식
썬, IBM은 타겟 플렛폼을 내부적으로 에뮬레이션 하는 방식을 선택했습니다.
어떤 방법이 가장 좋은지는 말하기 어렵지만, 지금 거의 모든 벤더가 선택한 방식은 타겟 플렛폼의 에뮬레이팅입니다.

-------------------------------------
김동수 - Prototype for Evolution

김동수 - Prototype for Evolution