사설/사설

버전간 모드 호환이 안 되는 이유 (by Vazkii)

알 수 없는 사용자 2015. 2. 24. 16:12
어떤 유저가 레딧에 다음과 같은 글을 올렸습니다.

전 마인크래프트 모드에 초짜나 마찬가집니다. 모드 포럼을 돌아다녀 보면 모드 소개글에 개발자들이 '이 모드는 마인크래프트 버전 X.X.X 와 호환됩니다" 라고 써놓은 것을 자주 볼수 있어요. 이게 왜 그런지 궁금하네요. 그러니까, 이전 버전의 마인크래프트와 호환이 안 될수도 있다는건 이해해요. 모드가 이전 버전의 마인크래프트에 없는 컨텐츠를 사용하고 있을 수도 있으니까요. 하지만 어째서 이후 버전의 마인크래프트와도 호환이 안 되는 거죠? 모든 컨텐츠가 다 남아 있다는 가정하에?

여러분도 많이 궁금하셨을 겁니다. 알고 계시다면 모드 전문가시라고 자신을 칭하셔도 됩니다. 하여튼, 이 질문에 대해 성질 더러운(유저: 테라블레이드 설마 테라리라에서 나온 건가요??? 바즈키: 응. 알았으면 닥쳐바즈키(Vazkii)가 모범답안을 내놓았습니다. 이게 웬 일이래. 세렌님의 번역 읽어 보시죠.

마인크래프트 버전 간
모드 호환이 되지 않는 이유에 관하여
저자: 바즈키(Vazkii)
번역: 세렌디피티(Phanthalassa)

모드 마인크래프트의 세계에 오신 것을 환영합니다새로 버전 업이  마인크래프트와 모드간의 호환성이 개발살나는 데에는 두가지 정도의이유가 있어요가급적 코딩과 관계 없는 일반인이 이해할  있는 말로 설명해 볼까요.

 

1. 소프트웨어 난독화 (Obfuscation)

마인크래프트 코드를 대충 프로그램 하나 사용해서 열어 보면 말도  되고 이해도 불가능한 온갖 잡다한 문자열이 튀어나옵니다자바로 만들어진 프로그램들이 이런 경향이 아주 심해요마인크래프트는 자바로 만들어졌고자바로 만들어진 프로그램들은 열어서 코드를 들춰 보는게정말 쉽기 때문이죠이렇게 코드를 열어보는걸 '디컴파일링이라 하고이렇게 열어 봐도 뭐가 뭔지 이해할  없게 코드를 개발살내 놓는  '난독화' (obfuscation) 이라고 합니다인간은 읽을  없어도 기계들은 이걸 제대로 이해할  있죠.

예를 들어 볼까요크리퍼의 클래스 (class 뭔지 모르는 사람들은 그냥 코드 조각이라 생각하세요 MCP,  마인크래프트 코더 팩을 사용하면 EntityCreeper.class  나와 있습니다하지만 마인크래프트 코드를 그냥 열어 보면  크리퍼는 마인크래프트 1.7.10에서 wl.class 나와요도저히 이해할 수가 없는 거죠.

이런 걸론 작업을 할수 없습니다모드를 만드는 모더들은 수백에서 수천개의 마인크래프트 파일과 작업을 해야 하죠거기에 함수랑 필드도더해서이걸 전부  외우려고 한다고 생각해 보세요.

여기서 MCP,  마인크래프트 코더 팩이 중요한 겁니다이제는 모장 직원이  Searge 개발하고 아직도 유지 중인 것으로모더들의 커뮤니티를 통해  이해불가능한 코드들을 모더들이 읽을수 있는 코드로 바꿔 주는 겁니다코드를 찾고분류하고이해하는것에 필수적이기에모더들은  MCP 떨어져  수가 없어요또한 MCP 양방향이라모더들이 작성하는 코드를 다시 마인크래프트가 사용하는 난독 코드로바꿔주는 역활을 합니다. MCP 있기 때문에 여러분이 모드를 받아다가 모드 폴더에 넣고 마인크래프트를 실행하면 마인크래프트가 새로 추가된  모드를 감지하고 게임에서 보여줄  있는 거지요.

여기서 발생하는 문제가 있는데바로  난독화가 자주 바뀐다는 겁니다모장이 뭔가 새로운  집어 넣을 때마다 난독화가 바뀌고기존의이해 불가능한 코드들이 전혀 다른 이름을 가진 이해 불가능한 코드들고 바뀝니다예를들어 1.7.10 버전에서 크리퍼가 wl.class 였다면, 1.8에서는 크리퍼가 sz.class  바뀔 수도 있다는 거에요그럼 마인크래프트 코더 팩이 이걸 해석할 수가 없죠그래서 버전이 바뀔 때마다 MCP 메인 개발자인 Searge, 웨일라와 OPIS 개발자 뫼비우스, IngisKahn, Fesh0r, ZeuX, R4wk  여섯 명이 중노동을 해야 하는 겁니다물론 모장의 도움이 있지만 (Searge 이제 현직 모장 직원이기도 하고아무래도 여가 시간에 하는 거니까 시간이 걸릴  밖에 없어요.

또한 MCP 바뀌면 MCP 통해 마인크래프트와 상호교환을 하는 모드들도 당연히 망가지게 됩니다예를들어 모드가 EntityCreeper.class 어떻게 바꾸는  한다고  봐요그럼 이걸 1.7.10버전의 MCP 통해 wl.class 찾게 되는데크리퍼는 이제 wl.class 아닌 sz.class 니까 해당 명령은 길을 잃어버리게 되죠그리고 마인크래프트는 크래시를 냅니다이게 첫번째 이유.

 

2. 코드가 바뀌었다!

위에 '모든 컨텐츠가  남아 있다는 가정 하에 모드들이 이후 버전의 마인크래프트와 호환이  되는 거죠?' 라고 물어보셨죠간단합니다 가정 자체가 틀리기 때문이에요마인크래프트를 구성하는 코드는  버전마다 바뀌고삭제되고옮겨지고추가되고이름이 바뀌고복제됩니다버전이 바뀔 때마다 항상 무언가가 바뀌어요바뀌지 않는다면  버전이 나올 필요가 없겠죠그리고 뭔가 바뀔 때마다 바뀐 내용을 참조하던 모든 모드가 망가집니다.

예제를  들어 보죠마인크래프트가 1.5에서 1.6으로 올라가면서엔티티 (블럭이 아닌 모든  – 크리퍼좀비그림아이템 떨군 것들경험치 구슬 등등) 작동하는 방식을 모장이 바꿨습니다어트리뷰트 (Attribute) 시스템의 등장이죠만약에 1.5 버전에서 몹의 체력을 참조하는 모드가 있었다면 모드는 1.6 버전에서도 똑같이 몹의 체력을 참조하려고  겁니다하지만 몹의 체력을 담당하는 시스템이 어트리뷰트시스템으로 새로 개선됨에 따라 기존 시스템을 참조하려는 모드는 자신이 찾는 것을 찾을  없어 그대로 크래시를 내게 되죠.

마인크래프트 1.6에서 1.7 사이에는 블럭ID 시스템이 완전히 바뀌었습니다다들 아시다시피이제까지 마인크래프트의 모든 블럭은 번호를가지고 있었습니다베드록은 0돌은 1흙은 2 등등하지만 1.7 이후로는 이것들이 이런 번호 대신 String 문자열 바뀌었습니다 (stone)  이제 1 대신 stone 이란 string 가지고 있고나무 판자들은 planks 가지고 있죠그래서 1.7 이전의 방식대로 '블럭ID 배분으로 블럭을 추가하려는 모드 있다면해당 모드는 1.7에서 사용할 수가 없죠블럭ID 번호라는 개념이 완전히 사라졌으니까요 외에도 정말 많지만  둘이 일단은 최근의 변경점입니다.

 

대부분의 마인크래프트 모드들은 '플랫폼위에서 돌아가도록 설계되어 있습니다일단 현재 가장 유명한 플랫폼을 두개 꼽으라면 마인크래프트 포지 라이트로더 있겠죠들어 본적 있어요이것들 위에서 모드들이 돌아가기에마인크래프트 버전이 올라가면  플랫폼들도 같이버전 업이 되어야 합니다그리고 버전이 바뀔 때마다 항상 무언가는 바뀌게 되죠.

물론 항상 예외가 있습니다모드들이 마인크래프트 자체에서 돌아가는게 아니라 플랫폼들 위에서 돌아가기에 가끔 버전이 달라도 호환이 되는 경우가 생겨요다들 아시겠지만 몇몇 모드는 1.7.2 1.7.10에서 동일하게 작동합니다하지만 마인크래프트 포지 자체는 1.7.2 버전을 마인크래프트 1.7.10버전에서  보면 폭발해 버리죠이는 포지는 마인크래프트 자체와 직접 상호작용을 하는 반면포지 위에서 돌아가는 모드들은 단순히 포지가 제공하는 기능을 사용하기 때문입니다해당 모드가 사용하는 포지의 코드가 1.7.2 1.7.10버전의 포지에서 동일하고해당 모드가 바꾸는 마인크래프트의 특정 부분이 1.7.2버전과 1.7.10버전의 마인크래프트 사이에서 바뀌지 않았다면 모드는 양쪽 버전에서 돌아갈 겁니다.

예라고 하긴 뭐하지만 마인크래프트 코드 자체를 하나도 사용하지 않고 오직 포지 코드만 참조하는 마인크래프트 모드를 만들어본 적이있습니다그게 가능하냐고요가능합니다당연히  모드는 마인크래프트에 새로운 컨텐츠를 추가한다던가 하는 기능이 전혀 없어요하지만  모드를 마인크래프트 1.3  만들었고, 1.7.10  지금도  모드는 돌아갑니다 모드의 버전간 호환성은 해당 모드가 무엇을 바꾸는지무엇을 참조하는지무엇이 바뀌었는지에 따라 결정 된다는 뜻입니다대부분의 경우 무언가는 바뀌기에 호환이 불가능한 것이죠.

 

길어서  읽은 글러먹은 게으름뱅이들을 위한 요약마인크래프트는 자기 코드가 어떻게 보이는지를  버전마다 바꿉니다덕분에 버전이 올라갈 때마다 이전 버전처럼 생긴 마인크래프트 생각하는 모든 모드들이 망가진다는 거죠.




짝짝! 마지막이 바즈키다운 표현이지만 정말로 훌륭한 답안이군요. 이걸 번역하신 세렌님에게 경의를...


바즈키에 의하면 모장은 어른좀비 걸어가는 속도보다 느리게 모딩 API를 향해 나아가고 있습니다. 무려 1.3(!)에서 시작된 변화인데, 1.3에선 서버와 클라이언트가 통하되었고 1.5에선 스프라이트가 바뀌었으며, 1.6에선 어트리뷰트와 텍스쳐 시스템이 등장했고 런쳐가 변화했습니다. 1.7에선 블럭ID가 삭제되었으며 1.8에선 메타데이터가 삭제되고 코드에 대격변이 일어났습니다. 즉, 1.8도 1.7만큼의, 혹은 그 이상의 대격변을 가져올 거라는 말. "세상을 바꾼 업데이트"라는 1.7.2 업데이트는 2013년 10월 25일에 나왔고 2014년 7월은 되어서야 대부분의 모드들이 1.7로 업데이트되기 시작했으니(아직 써멀 등은 나오지 않았고), 1.8로 모드들이 포팅되려면 적어도 2015년 여름은 되야 할 것 같습니다... cpw가 빠져나간 후 포지 팀도 인력난에 처해 있고...


* 예전에 제가 우마공에 올렸던 글입니다. 사진이 없어서 옮기기도 쉽고 내용도 좋기에 옮겨 봤습니다. 2015년 봄이 시작되려는, 거의 모든 모드들이 1.7.10으로 올라온 현재에 있어서도 매우 좋은 글일 듯 하군요. 다시 한 번 세렌님께 경의를