1. 서론: 디지털 고고학의 새로운 이정표

2025년 11월, 소프트웨어 보존과 컴퓨터 게임 역사의 중대한 전환점이 마련되었다. 마이크로소프트(Microsoft)는 액티비전(Activision) 및 인터넷 아카이브(Internet Archive)와 협력하여, 인터랙티브 픽션의 효시이자 전설적인 텍스트 어드벤처 게임인 Zork I, Zork II, Zork III의 소스 코드를 MIT 라이선스 하에 깃허브(GitHub)를 통해 공식적으로 공개하였다. 이 사건은 단순한 고전 게임의 재배포를 넘어, 현대 컴퓨팅의 기초가 된 파싱(Parsing) 기술, 가상 머신(Virtual Machine) 아키텍처, 그리고 초기 인공지능(AI) 연구의 실체를 투명하게 드러낸 학술적 쾌거로 평가받는다.

마이크로소프트의 오픈소스 프로그램 오피스(OSPO)와 개발자 커뮤니티 부사장 스콧 핸설먼(Scott Hanselman)이 주도한 이번 프로젝트는, 수십 년간 '어밴던웨어(Abandonware)'의 모호한 법적 지위 속에 있던 역사적 코드들을 양지로 끌어올려 '캐논(Canon)'으로서의 지위를 부여했다는 점에서 그 의의가 깊다. 본 보고서는 Zork의 탄생 배경인 1977년 MIT의 연구 환경부터, 상업적 성공을 위해 고안된 혁신적인 기술 아키텍처인 Z-머신(Z-Machine), 그리고 이번에 공개된 ZIL(Zork Implementation Language) 코드의 구문론적 분석까지 포괄적으로 다룬다. 또한, 한국의 웹소설 및 서사 중심 게임 시장과의 연관성을 통해 이 고전적 유산이 현대 디지털 콘텐츠 산업에 미치는 파급력을 심층 진단한다.

2. 기원과 형성: MIT 다이내믹 모델링 그룹의 유산 (1977-1979)

2.1 PDP-10 메인프레임과 해커 문화의 태동

Zork의 기원을 이해하기 위해서는 1970년대 후반 매사추세츠 공과대학교(MIT)의 컴퓨터 과학 연구소(LCS) 내 '다이내믹 모델링 그룹(Dynamic Modeling Group)'의 독특한 문화를 선행적으로 고찰해야 한다. 당시 이 그룹은 DEC(Digital Equipment Corporation)사의 PDP-10 메인프레임을 운용하고 있었으며, 이 거대한 기계는 당시로서는 혁신적인 시분할 운영체제인 ITS(Incompatible Timesharing System) 위에서 구동되었다.

1976년 윌 크로더(Will Crowther)와 돈 우즈(Don Woods)가 만든 Colossal Cave Adventure(이하 Adventure)가 ARPANET을 통해 MIT에 전해졌을 때, 팀 앤더슨(Tim Anderson), 마크 블랭크(Marc Blank), 브루스 대니얼스(Bruce Daniels), 데이브 레블링(Dave Lebling) 등 네 명의 핵심 개발자들은 이 게임을 단 2주 만에 분석하고 클리어하였다. 그러나 그들은 Adventure의 기술적 한계, 특히 '동사+명사'로 이루어진 2단어 파서(Two-word parser)의 조악함과 서사의 부족함에 불만을 가졌다. 이는 MIT 해커 문화 특유의 경쟁심리를 자극하였고, "우리는 이것보다 더 나은 것을 만들 수 있다"는 동기가 Zork 개발의 시발점이 되었다.

2.2 프로젝트 'Dungeon'과 MDL 언어의 실험

1977년 5월부터 본격적으로 개발이 시작된 이 프로젝트의 초기 명칭은 Dungeon이었으나, 후에 MIT 내부의 은어로 '망가진 것' 혹은 '불특정한 물건'을 지칭하는 단어인 Zork로 변경되었다. Zork가 기술적으로 Adventure와 차별화될 수 있었던 결정적인 요인은 프로그래밍 언어의 선택에 있었다. Adventure가 정적인 FORTRAN으로 작성된 반면, Zork는 MIT에서 개발된 LISP의 방언인 MDL(Muddle) 언어로 작성되었다.

MDL은 LISP의 강력한 리스트 처리 능력에 더해, 벡터(Vector), 문자열(String) 등 더욱 정교한 데이터 타입을 지원하는 함수형 언어였다. 이는 개발자들로 하여금 복잡한 재귀 함수와 고차원적인 데이터 구조를 게임 로직에 구현할 수 있게 해주었다. 1977년부터 1979년 사이 개발된 이른바 '메인프레임 Zork'는 약 1MB에 달하는 거대한 단일 프로그램이었으며, 현재 상업적으로 분할된 Zork I, II, III의 모든 콘텐츠를 포함하고 있었다. 이번 마이크로소프트의 공개 대상은 상업용 ZIL 버전이지만, 그 뿌리가 되는 MDL 버전의 아키텍처는 현대 프로그래밍 언어론적 관점에서도 매우 중요한 연구 대상이다.

구분 Adventure (Colossal Cave) Mainframe Zork (Original) Commercial Zork (I, II, III) 개발 연도 1976 1977-1979 1980-1982 주요 언어 FORTRAN MDL (LISP Dialect) ZIL (Zork Implementation Language) 실행 환경 PDP-10 PDP-10 (ITS OS) Z-Machine (Virtual Machine) 파서 성능 2단어 (동사+명사) 자연어 처리 (전치사, 형용사 포함) 최적화된 자연어 처리 배포 방식 메인프레임 공유 메인프레임 공유 플로피 디스크 (상업 패키지)

3. 기술 아키텍처의 혁신: 가상 머신과 크로스 플랫폼 전략

3.1 상업화의 장벽과 메모리 제약

1979년, 개발진은 인포컴(Infocom)을 설립하고 Zork의 상업화를 시도하였다. 그러나 당시 개인용 컴퓨터(PC) 시장을 주도하던 애플 II(Apple II)나 TRS-80과 같은 기기들은 수십만 달러짜리 PDP-10 메인프레임과 비교할 때 계산 능력과 메모리 용량이 현저히 부족했다. 메인프레임 버전의 Zork는 1MB에 달했지만, 당시 가정용 PC의 RAM은 고작 32KB에서 48KB 수준이었다.

이러한 물리적 제약을 극복하기 위해 인포컴은 두 가지의 급진적인 엔지니어링 결단을 내렸다. 첫째는 거대한 단일 게임을 Zork I: The Great Underground Empire, Zork II: The Wizard of Frobozz, Zork III: The Dungeon Master라는 3부작으로 분할하는 것이었다. 둘째이자 더욱 혁신적인 결정은 바로 Z-머신(Z-Machine)이라는 가상 머신 아키텍처의 도입이었다.

3.2 Z-머신과 ZIL: 20년을 앞선 'Write Once, Run Anywhere'

마크 블랭크와 조엘 베레즈(Joel Berez)가 고안한 Z-머신 아키텍처는 현대의 자바 가상 머신(JVM)이나 닷넷(.NET) 프레임워크의 개념을 20년이나 앞서 구현한 선구적인 시스템이었다.

  • ZIL (Zork Implementation Language): MDL을 기반으로 하되, 게임 로직 작성에 특화되도록 간소화된 도메인 특화 언어(DSL)이다. 개발자들은 ZIL을 사용하여 소스 코드를 작성한다.

  • Z-Code Compiler (ZILCH/ZILF): ZIL로 작성된 소스 코드는 특정 CPU의 기계어가 아닌, 'Z-Code'라는 바이트코드로 컴파일된다.

  • ZIP (Z-Machine Interpreter Program): 각기 다른 하드웨어(Apple II, Commodore 64, IBM PC 등)에 맞춰 작성된 인터프리터이다. 이 인터프리터는 Z-Code를 읽어 해당 기계에서 실행한다.

이 구조 덕분에 인포컴은 게임을 한 번만 개발하면(ZIL), 인터프리터가 존재하는 모든 플랫폼에 즉시 배포할 수 있었다. 이번에 마이크로소프트가 깃허브에 공개한 것은 바로 이 ZIL 소스 코드 파일들로, zork1.zilsyntax.zilparser.zil 등의 파일들이 포함되어 있어 당시의 가상화 전략이 어떻게 코드 레벨에서 구현되었는지를 명확히 보여준다.

3.3 컴파일 프로세스의 복원

2025년 공개된 리포지토리는 단순히 코드 텍스트만을 제공하는 것이 아니라, 현대의 시스템에서 이 코드를 어떻게 빌드할 수 있는지에 대한 방법론도 시사한다. 연구자들은 오픈소스 커뮤니티에서 유지보수되어 온 ZILF 컴파일러와 ZAPF 어셈블러를 사용하여, 공개된 .zil 파일들을 실제 구동 가능한 .z3 스토리 파일로 변환할 수 있다.

  1. 소스 준비: zork1.zil을 포함한 모든 의존성 파일(gmacros.zilsyntax.zil 등)을 준비한다.

  2. 컴파일: zilf.exe zork1.zil 명령어를 통해 어셈블리 코드인 .zap 파일을 생성한다.

  3. 어셈블: zapf.exe zork1.zap 명령어를 통해 최종 바이너리인 zork1.z3를 생성한다.

  4. 실행: 생성된 파일은 Frotz와 같은 현대적인 Z-머신 인터프리터에서 실행된다.

이러한 빌드 파이프라인의 복원은 소프트웨어 고고학적 관점에서 '죽은 코드'를 '살아있는 소프트웨어'로 전환시키는 핵심적인 과정이다.

4. 심층 코드 분석: ZIL의 구문론과 게임 로직

4.1 객체 지향의 원형: 룸(Room)과 객체(Object) 정의

공개된 소스 코드 중 rooms.zil 혹은 dungeon.zil 파일에서는 Zork의 세계를 구성하는 장소와 사물들이 리스프(LISP) 특유의 S-표현식(S-Expression)으로 정의되어 있다. 다음은 Zork의 가장 상징적인 장소인 '거실(Living Room)'에 대한 코드 구조 분석이다.

Lisp
<ROOM LIVING-ROOM
    (LOC ROOMS)                         ; 부모 위치 (전역 룸 리스트)
    (DESC "Living Room")                ; 화면에 출력될 방 이름
    (EAST TO KITCHEN)                   ; 동쪽 이동 시 주방으로 연결
    (WEST TO STRANGE-PASSAGE IF CYCLOPS-FLED ELSE "The wooden door is nailed shut.")
                                        ; 조건부 이동: 사이클롭스가 도망친 경우에만 통로 개방
    (DOWN PER TRAP-DOOR-EXIT)           ; 함수(PER)를 통한 복잡한 이동 로직 처리
    (ACTION LIVING-ROOM-F)              ; 방 내부 이벤트 처리를 위한 핸들러 함수
    (FLAGS RLANDBIT ONBIT SACREDBIT)    ; 속성 플래그: 육지, 조명 있음, 도둑이 훔치지 않음
    (GLOBAL STAIRS)                     ; 전역 객체 참조
    (THINGS <> NAILS NAILS-PSEUDO)>     ; 의사 객체(Pseudo-items) 정의

이 코드는 1980년 당시로서는 매우 진보된 객체 지향적 개념을 담고 있다. FLAGS 속성을 통해 방의 상태(빛의 유무, 지상/지하 여부 등)를 비트마스크로 관리하였으며, ACTION 슬롯에 특정 함수(LIVING-ROOM-F)를 바인딩함으로써 이벤트 중심(Event-driven) 프로그래밍을 구현하였다. 특히 WEST 방향의 이동 로직에서 볼 수 있듯, IF-ELSE 구문을 데이터 정의 내에 직접 포함시켜 동적인 게임 환경을 조성하였다.

4.2 자연어 처리(NLP) 파서의 해부

Zork의 파서는 단순한 패턴 매칭을 넘어선 구문 분석(Syntax Analysis)을 수행했다. 소스 코드의 parser.zil과 syntax.zil은 입력된 문장을 동사(Verb)직접 목적어(Direct Object)간접 목적어(Indirect Object)로 분해하는 과정을 보여준다.

예를 들어, 사용자가 "Kill troll with sword(칼로 트롤을 죽여라)"라고 입력했을 때, 파서는 다음과 같은 과정을 거친다:

  1. 토큰화(Tokenization): 입력 문자열을 KILLTROLLWITHSWORD로 분리한다.

  2. 어휘 분석(Lexical Analysis): KILL은 동사 ATTACK의 동의어로, TROLL은 객체 TROLL-OBJECT로 매핑된다.

  3. 구문 매칭(Syntax Matching): ATTACK <OBJECT> WITH <WEAPON>이라는 구문 패턴을 syntax.zil 테이블에서 찾는다.

  4. 의미론적 검증(Semantic Check): SWORD가 무기 속성(WEAPONBIT)을 가지고 있는지, 플레이어가 소지하고 있는지 확인한다.

이러한 과정은 현대의 대규모 언어 모델(LLM)이 확률에 기반하여 텍스트를 생성하는 것과 달리, 명시적인 규칙과 논리에 기반한 기호주의 인공지능(Symbolic AI)의 정수를 보여준다. 마이크로소프트의 스콧 핸설먼은 이러한 점을 들어 Zork의 파서가 현대 AI 챗봇의 원시적인 조상임을 강조하였다.

4.3 그루(Grue)의 알고리즘적 실체

Zork를 상징하는 어둠 속의 괴물 '그루(Grue)'는 시각적으로 묘사되지 않음으로써 오히려 공포를 극대화한 존재이다. 공개된 소스 코드는 그루가 실제로 존재하는 몬스터 객체가 아니라, 어둠 상태를 관리하는 전역 데몬(Daemon) 프로세스임을 밝혀준다.

Lisp
<ROUTINE I-GRUE ()
    <COND (<AND <NOT <FSET? ,HERE ,ONBIT>> <NOT <LIT? ,HERE>>>
           <TELL "It is pitch dark. You are likely to be eaten by a grue." CR>
           ; 일정 턴 이후 플레이어 사망 처리 로직 (JIGSUP 호출)
          ...)>>

이 코드는 플레이어가 위치한 방(HERE)이 조명 플래그(ONBIT)가 없고, 플레이어가 광원을 소지하지 않았을 때(NOT <LIT?>) 작동한다. 텍스트 출력 후 확률적으로 JIGSUP(사망 처리 함수)을 호출하는 이 간결한 로직은, 1980년대 하드웨어의 메모리 제약 속에서 복잡한 그래픽 없이도 긴장감을 조성하기 위해 고안된 천재적인 해결책이었다.

5. 개발자들의 유머와 코드 속의 이스터 에그

소스 코드를 직접 열람함으로써 발견할 수 있는 또 다른 즐거움은 개발자들의 주석과 숨겨진 유머이다. 이는 당시 MIT 해커들의 문화적 코드를 엿볼 수 있는 중요한 사료이다.

  • XYZZY: Adventure에서 순간이동 주문으로 쓰였던 "xyzzy"를 입력하면, Zork의 코드는 "A hollow voice says 'Fool.'(공허한 목소리가 '바보'라고 말한다)"와 같은 냉소적인 반응을 출력하도록 프로그래밍되어 있다. 이는 경쟁작에 대한 라이벌 의식과 Zork의 세계관이 더 현실적이고 냉혹하다는 것을 암시하는 장치이다.

  • 자본주의적 풍자: "EAT MONEY(돈을 먹어라)"라는 명령어에 대해 소스 코드는 "Talk about eating rich foods!(정말 값비싼 식사군요!)"라는 언어유희적 반응을 리턴하도록 작성되어 있다.

  • 불가능한 명령: "COUNT LEAVES(나뭇잎을 세어라)"와 같은 엉뚱한 명령에 대해서도 "There are 69,105 leaves here(여기 69,105개의 나뭇잎이 있습니다)"와 같이 구체적이고 뻔뻔한 숫자를 제시함으로써, 파서가 마치 지능을 가진 것처럼 착각하게 만드는 '지능의 환상(Illusion of Intelligence)'을 구현하였다.

6. 2025년 오픈소스화의 법적, 문화적 함의

6.1 마이크로소프트와 액티비전의 전략적 선택

2025년 11월 20일의 발표는 마이크로소프트가 액티비전 블리자드 인수 이후 확보한 막대한 IP 포트폴리오를 어떻게 관리할 것인지를 보여주는 첫 번째 사례 연구이다. 상업적 가치가 희석된 고전 소프트웨어를 MIT 라이선스로 공개함으로써, 마이크로소프트는 저작권 분쟁의 소지가 있는 '어밴던웨어' 문제를 해결하고, 개발자 커뮤니티와의 우호적인 관계를 구축하는 '문화적 자본'을 획득하였다. 특히 제이슨 스콧(Jason Scott)과 같은 저명한 디지털 아키비스트와 협력하여 인터넷 아카이브의 기존 저장소에 '업스트림 풀 리퀘스트(Upstream Pull Request)'를 보내는 방식은, 기업이 커뮤니티의 자생적인 보존 노력을 존중하고 인정한다는 강력한 메시지를 전달하였다.

6.2 한국 시장과 인터랙티브 픽션의 재조명

이번 소스 코드 공개는 텍스트 기반 콘텐츠 소비가 활발한 한국 시장에서도 시사하는 바가 크다. 한국은 '웹소설(Web Novel)' 시장이 고도로 발달해 있으며, 독자의 댓글 반응이 작가의 집필에 실시간으로 영향을 미치는 상호작용성이 특징이다. 서구권의 '인터랙티브 픽션'과 한국의 '웹소설'은 그 기술적 구현 방식은 다르지만, 텍스트를 매개로 가상 세계를 구축하고 독자(플레이어)의 참여를 유도한다는 본질을 공유한다.

특히 한국의 레트로 게임 커뮤니티와 인디 개발자들에게 Zork의 소스 코드는 게임의 서사 구조 설계와 분기 처리 로직을 학습할 수 있는 최고의 교재이다. 최근 한국 게임 업계에서 '스토리 중심 게임'이나 '비주얼 노벨' 장르가 성장함에 따라, Zork가 보여준 비선형적 스토리텔링과 상태 관리 기법은 현대적인 모바일 텍스트 RPG나 챗봇 기반 게임 개발에 직접적인 영감을 줄 수 있다. '인터랙티브 픽션'이라는 용어 자체가 한국에서는 낯설 수 있으나, 공상과학 소설이나 팬타지 장르의 웹소설이 게임화되는 과정에서 Zork의 아키텍처는 중요한 참조 모델이 될 수 있다.

7. 결론: 끝나지 않는 모험

Zork I, II, III 소스 코드의 오픈소스 전환은 단순한 과거의 회상이 아니다. 그것은 1977년의 메인프레임 연구실과 2025년의 깃허브 생태계를 연결하는 디지털 다리와도 같다. 공개된 코드를 통해 우리는 1MB의 메모리 제약을 극복하기 위해 고안된 천재적인 압축 기술, 현대 객체 지향 프로그래밍의 원형, 그리고 사용자의 입력을 이해하기 위해 고군분투했던 초기 자연어 처리 기술의 실체를 목격할 수 있다.

이제 이 위대한 지하 제국의 지도는 모두에게 공개되었다. 학생들은 이 코드를 통해 컴파일러와 가상 머신의 원리를 배우고, AI 연구자들은 기호주의 AI의 한계와 가능성을 재확인하며, 게이머들은 텍스트만으로 무한한 상상력을 자극했던 그 시절의 순수한 몰입감을 되새길 것이다. 마이크로소프트의 이번 결정은 소프트웨어가 단순한 제품이 아니라 보존되어야 할 인류의 문화유산임을 천명한 것이며, 그루가 어둠 속에서 우리를 기다리는 한, Zork의 모험은 영원히 계속될 것이다.

기술 데이터 및 비교 분석

표 1. Zork 시리즈의 버전별 기술 사양 비교

특징 Mainframe Zork (1977) Commercial Zork I (1980) Modern ZIL Build (2025) 기반 언어 MDL (Muddle) ZIL (Zork Implementation Language) ZIL (Open Source) 실행 플랫폼 PDP-10 (ITS) Z-Machine (ZIP Interpreter) Modern Z-Machine (Frotz, Lectrote) 파일 크기 약 1 MB (통합본) 약 80~100 KB (분할본) 컴파일 옵션에 따라 가변 파서 복잡도 최상 (연구용) 상 (메모리 최적화) 상 (원본 코드 복원) 라이선스 비공식/학술용 상용 저작권 (Activision) MIT License (MS/Activision) 참조

표 2. Zork 소스 코드의 주요 파일 구조 (GitHub 리포지토리 기준)

파일명 역할 및 기능 비고 zork1.zil 게임의 메인 진입점(Entry Point) 및 로드 순서 정의

컴파일의 시작점 

syntax.zil 파서가 이해할 수 있는 명령어 구문 및 문법 정의

동사-목적어 패턴 매칭 

parser.zil 입력된 텍스트를 토큰화하고 해석하는 핵심 엔진

자연어 처리 로직 

dungeon.zil 룸(Room), 객체(Object)의 위치 및 속성 데이터

세계관 구성 데이터 

actions.zil 각 객체나 상황에 따른 구체적인 행동 함수

이벤트 핸들러 

gmacros.zil 전역 매크로 및 편의 함수 정의

코드 재사용성 증대 

표 3. Zork 프로젝트의 주요 인물

이름 역할 주요 기여 내용 Dave Lebling 공동 창작자

초기 파서 설계, 세계관 설정, 지형 디자인 

Marc Blank 공동 창작자

Z-머신 아키텍처 설계, '도둑(Thief)' AI 구현 

Tim Anderson 공동 창작자

게임 시스템 코딩, MDL 언어 활용 

Bruce Daniels 공동 창작자

구현 세부 사항, 초기 던전 디자인 

Scott Hanselman MS 부사장

2025년 오픈소스 공개 프로젝트 총괄 및 추진 

Jason Scott 아키비스트

인터넷 아카이브의 Zork 자료 보존 및 MS와 협력