원문 캡처 · jamesfmackenzie.com
원문 캡처 · jamesfmackenzie.com

SNES용 Star Fox의 PC 포트를 만들던 중 네 용어가 혼용되는 점을 짚은 글이다. 디스어셈블리와 디컴파일은 원래 게임 코드를 분석해 복원하는 과정이고, 재컴파일은 새 플랫폼에서 실행할 프로그램을 만드는 기술이며, 포트는 그 결과를 가리킨다.

네 가지 방식은 대체로 출시된 게임의 기계어 코드에서 출발하며, 그중 세 가지는 게임을 PC에서 네이티브로 실행하는 결과로 이어질 수 있다. 하지만 무엇을 입력으로 삼고 무엇을 만들어 내는지에 따라 프로젝트가 할 수 있는 일과 필요한 작업이 달라진다.

코드 복원과 실행 방식

디스어셈블리(disassembly)는 게임의 기계어 코드를 어셈블리어로 바꾼다. 원래 CPU 명령을 하나씩 텍스트로 옮기는 과정은 도구로 처리할 수 있지만, 각 루틴의 기능을 파악하고 이름과 주석을 붙이는 데는 사람의 작업이 필요하다. 진지한 프로젝트는 다시 빌드할 수 있다. 예를 들어 pret의 pokered는 Pokémon Red와 Blue의 디스어셈블리 프로젝트라고 소개하며, 다시 조립한 ROM은 원본과 SHA1 해시가 일치한다. 다만 결과물은 여전히 원래 CPU용 코드이므로, 그 자체로는 원래 콘솔에서 게임을 다시 빌드하는 데 그친다.

디컴파일(decompilation)은 한 단계 더 나아가 보통 C 같은 고급 언어의 소스 코드를 복원한다. 이 코드는 컴파일했을 때 원래 게임을 재현해야 한다. pret은 pokeemerald를 Pokémon Emerald의 디컴파일 프로젝트라고 부른다.

이상적인 기준은 원본과 바이트 단위로 일치하는 디컴파일이다. Perfect Dark 프로젝트는 원래 개발자가 쓴 것과 같은 컴파일러로 빌드했을 때 결과물이 상용 게임과 바이트 단위로 같아야 한다고 설명한다. 이런 일치가 결과를 신뢰할 근거가 되지만, 함수별로 코드를 작성하고 원본과 대조해야 해 작업이 오래 걸린다. AI 코딩 도구도 작업에 쓰이고 있지만, 결과물은 읽고 유지보수할 수 있는 C 코드여야 하며 원본과 바이트 단위로 일치해야 한다. Super Mario 64 디컴파일은 2019년에 공개됐다. Ocarina of Time 프로젝트는 21개월 뒤인 2021년 11월 100%에 도달했고, Majora’s Mask 프로젝트는 2024년 12월 100%에 도달했다.

디컴파일은 포트와 같은 말이 아니다. Ocarina of Time 프로젝트는 PC 포트를 만드는 프로젝트가 아니며, 빌드 결과물은 N64 ROM이라고 명시한다.

정적 재컴파일(static recompilation)은 에뮬레이터에서 쓰이는 동적 재컴파일과 비슷한 번역을 게임 실행 전에 한 번 수행한다. 동적 재컴파일은 게임이 실행되는 동안 기계어를 호스트 컴퓨터의 기계어로 바꾸고 그 결과를 캐시한다. 정적 재컴파일은 이를 미리 해 새 플랫폼에서 실행되는 네이티브 프로그램을 만드는 방식이다. 실행할 때 에뮬레이터를 기반으로 삼지 않는다.

현재의 도구 대부분은 중간 단계로 C 코드를 만든다. N64Recomp는 N64 바이너리를 여러 플랫폼에서 컴파일할 수 있는 C 코드로 정적으로 재컴파일하는 도구라고 소개한다. 일반 컴파일러가 최종 프로그램을 만들고, 런타임이 원래 콘솔의 하드웨어를 대신한다. 플랫폼별 작업은 이 런타임에서 이뤄진다.

재컴파일러가 만드는 C 코드는 사람이 읽기 위한 것이 아니다. XenonRecomp는 출력물이 읽기 어렵고 런타임 없이는 제대로 작동하지 않는다고 설명한다. 이 코드는 포트를 수정하거나 확장하는 데 쓸 수 있지만, 최종 결과물이 아니라 중간 단계다. 디컴파일의 C는 읽고 유지보수하도록 작성하지만, 재컴파일의 C는 도구가 프로그램을 만드는 과정에서 생성한다는 점이 둘의 차이다.

정적 재컴파일의 큰 장점은 소스 코드가 필요 없다는 것이다. Zelda64Recomp FAQ는 디컴파일된 소스 코드 없이 포트를 만들 수 있다고 설명한다. 실제로는 두 접근법이 서로 보완되기도 한다. Zelda64Recomp는 Majora’s Mask 디컴파일 프로젝트의 헤더와 일부 함수 정의를 빌려오지만, 게임 코드 자체는 재컴파일러에서 나온다. 이 방식으로 만든 사례로 Zelda64Recomp(Majora’s Mask, 2024년 5월), Unleashed Recompiled(Xbox 360용 Sonic Unleashed, 2025년 3월), Starfox 64: Recompiled(2025년 12월)가 있다.

포트는 결과를 가리킨다

포트는 특정한 코드 변환 방식이 아니라, 원래 출시되지 않았던 플랫폼에서 게임을 네이티브로 실행하는 결과다. 이를 만들려면 새 플랫폼용으로 빌드할 수 있는 코드가 필요하며, 그 코드는 여러 경로로 얻을 수 있다.

  • 공식 소스 코드: id Software는 1997년 12월 Doom 소스 코드를 공개했다. 이를 바탕으로 한 프로젝트는 소스 포트라고 불린다. Chocolate Doom은 그중 하나이며, 원래 DOS 버전을 정확히 재현하는 것을 목표로 한다.
  • 디컴파일: sm64-port는 n64decomp/sm64를 현대 기기로 포팅한 프로젝트다. Ship of Harkinian도 Ocarina of Time 디컴파일을 기반으로 한다.
  • 재컴파일: Unleashed Recompiled는 정적 재컴파일 방식으로 만든 Xbox 360판 Sonic Unleashed의 비공식 PC 포트라고 설명한다.
  • 유출된 소스 코드: wipEout의 소스 코드는 2022년에 유출됐다. phoboslab은 이를 바탕으로 게임을 거의 전면 재작성해 Windows, Linux, macOS와 웹에서 실행되게 했다.

따라서 ‘포트인가’와 ‘디컴파일인가’는 서로 다른 질문이다. Ship of Harkinian은 디컴파일을 기반으로 만든 포트지만, 디컴파일 자체는 포트가 아니다.

혼동하기 쉬운 용어

에뮬레이션은 원본 게임을 수정하지 않고 가상의 콘솔에서 실행한다. 코드를 새로 빌드하지 않으며 게임이 실행되는 동안 에뮬레이터가 동작을 담당한다. 비일치 디컴파일은 원본과 같은 동작을 하는 C 코드지만, 컴파일 결과가 원본과 같은 바이트열은 아니다. 쓸모는 있지만 일치하는 디컴파일보다 신뢰하기 어렵다.

유출된 소스 코드는 개발자가 작성한 코드가 허가 없이 공개된 경우다. 코드를 새로 복원할 필요가 없으므로 디컴파일과 다르다. 재구현은 원래 게임 코드를 사용하지 않고 새 엔진으로 원본 게임의 데이터를 실행한다. OpenMW FAQ는 원본 실행 파일을 전혀 사용하지 않으며 Morrowind 원본을 별도로 보유해야 한다고 설명한다.

방식출발점결과물실행 환경사례
디스어셈블리출시된 기계어 코드이름과 설명이 붙은 어셈블리어원래 콘솔pokered
디컴파일출시된 기계어 코드원래 게임을 재현하는 읽기 쉬운 C 코드포트되기 전까지 원래 콘솔Super Mario 64, Ocarina of Time
정적 재컴파일출시된 기계어 코드생성된 C 코드와 하드웨어 런타임을 거쳐 빌드한 네이티브 게임새 플랫폼Zelda64Recomp, Unleashed Recompiled
포트빌드할 수 있는 모든 코드: 소스 코드, 디컴파일 또는 재컴파일네이티브로 실행되는 게임새 플랫폼Chocolate Doom, Ship of Harkinian
에뮬레이션수정하지 않은 출시 게임의 기계어 코드새로 만들어지는 결과물 없음에뮬레이터—

이런 프로젝트는 대부분 게임 자체를 포함하지 않는다. Super Mario 64 디컴파일, Zelda64Recomp, Unleashed Recompiled, Ship of Harkinian은 게임 에셋을 위해 사용자가 직접 게임 사본을 갖고 있어야 한다.

Star Fox 네이티브 PC 포트 제작기

Commander Keen 포트 프로젝트

PS Vita에서 실행하는 네이티브 Super Mario 64 포트