이식 (컴퓨팅)

이식(移植) 또는 포팅(porting)은 컴퓨터 과학에서 실행 가능한 프로그램이 원래 설계된 바와 다른 컴퓨팅 환경(이를테면 CPU, 운영 체제, 서드 파티 라이브러리 등)에서 동작할 수 있도록 하는 과정을 가리킨다. 이 용어는 소프트웨어나 하드웨어가 다른 환경에서 사용할 수 있게 변경되는 것에도 해당한다. 소스 하나로 여러 플랫폼에서 사용할 수 있는 것을 크로스 플랫폼으로 부른다. 컴퓨터에 있어서는 다양한 사상에 기초한 각종 컴퓨터 및 프로그래밍 언어는 다양한 제조 업체로부터 판매되고 있다. 옛날에는 IBM 등의 수많은 제조 업체가 메인 프레임 컴퓨터 시장에서 점진적으로 IBM 호환 기기 제조 업체로 집계되었다. 오늘날 개인용 컴퓨터의 대부분이 윈도우 또는 매킨토시 시리즈에 집약되어 대부분의 사용자는 자신이 사용하고 있는 PC의 운영 체제만을 생각하도록 되어 있다. 이 PC는 운영 체제에서 제공하는 API와 그들에 의해 이용되는 장치 작동 통해 제조 업체는 원래보다 하드웨어의 차이와 메모리 구성의 차이 등에 상관없이 모두 동일한 소프트웨어를 사용할 수 있다. 이들은 OS가 제공하는 표준화된 환경에서 동작하기 때문에, 제조 업체 및 모델의 차이는 관계가 없다. 그러나 윈도와 매킨토시 시리즈에서는 일부 소프트웨어를 제외하고는 동일한 소프트웨어가 작동하지 않는다. 이들은 운영 체제가 제공하는 환경이 다르기 때문이다. 이와 마찬가지로, 전 세계 다양한 프로그래밍 언어가 동일한 동작을 컴퓨터에 적용하기 위해서는 각각의 프로그래밍 언어 사양에 부합하는 프로그램을 작성하지 않으면, 동작하는 소프트웨어는 만들 수 없다. 예를 들면, 프로그래밍 기초 중의 기초가 되는 Hello world를 들 수 있다. 이 "Hello world!"로 표시하면, 불과 몇 십 자 정도의 프로그램은 프로그래밍에 사용하는 언어에 따라 다양하게 변화한다. 특히 동작 환경이 다른 컴퓨터에서 주로 동일한 동작 작업을 하기 때문에, 전혀 다른 프로그램을 만들어야 한다면 기존의 하드웨어 구성의 차이를 보정하는 OS 및 드라이버가 없었던 시대에는 같은 제조사별 시리즈의 컴퓨터 사이에서도 프로그램의 대부분을 수정하는 작업이 필요했다. 따라서 별도의 PC가 보급되기 시작하던 1980년대에는 각 소프트웨어 업체 모두 채산성에서 점유율이 낮은 기종 등 판매를 기대할 수 없는 기종은 소프트웨어의 이식을 하지 않는 경우도 볼 수 있었다. 한편, 채산성도 가지고 그렇다면, 아주 성능이 낮은 PC 전용도, 소프트웨어 제작자는 상당한 프로그래밍 기술과 시행 착오 둥 노력이 필요하지만 이식 소프트웨어를 만들고 유지했다. 일본의 PC 시장의 경우 1980년대 말에는 8 비트 세대가라는 세 강과 다양한 제조 업체에서 호환 MSX 시리즈의 과점화 경향이 정착하고 있었다. 반면 정보 기술 분야에서 다양한 컴퓨터 제조 업체에서 다양한 대형 소형을 불문하고 1970년대 이후 각종 컴퓨터 출시 공급되었지만, 플랫폼마다 조작 방법이 크게 다른 것을 벽역하는 이용자도 많았다. 그 중에서 다중 사용자 사상에서 태어난 유닉스는 널리 산관학 분야에 받아들여지고 각종 컴퓨터에 작동하는 유닉스의 흐름을 이어받은 운영 체제가 이식되었다. 그 안에는 가정용 PC에서도 동일한 운영 체제를 사용하고 싶다는 사용자들이 나타나면서, 리눅스나 FreeBSD 등, PC/AT PC상에서 동작하는 것도 개발되어 오늘에 이른다. 특히 리눅스에 이르러 가정용 게임기와 휴대 기기 과거의 컴퓨터 하드웨어 등으로 동작시키는 것이 일부 마니아 사이에서 시험하고 개발한 결과, 엑스박스와 플레이 스테이션에서도 실행할 수 있게 개발되고 있다. 컴퓨터 게임의 게임 소프트웨어는 한 종류의 게임기에서만 지원하기 때문에 다른 기종에 동일한 내용의 게임을 제공하기 위해 소프트웨어 개발 업체, 또는 외주 내지 라이선스를 받은 다른 소프트웨어 개발 업체 (타사)의 이식이 필요하다. 이식 패턴은 다음과 같이 4가지이다. 과거의 게임을 현행 기종에 이식하는 경우 비교적 최근의 소프트웨어를 보다 대중적인 지금의 기계로 이식하는 경우 아케이드 게임 하드에서 가정용 게임기로 이식하는 경우 같은시기에 대중적인 여러 가정용 게임기에 이식하는 것을 처음부터 전제로 만들어진 경우 여러 기종으로 이식은 경우에 따라서는 같은시 기에 출시하기 위해 병행하여 이식을 하는 경우도 있다. 한때는 8 비트 세대가 같이 중요한 플랫폼이 긴장 상태로 여러 존재 시장을 다투고 있던 시대에는 제조 업체의 개발진에 여력이 있는 경우, 신제품의 소프트웨어를 여러 기종에 같이 동작하도록 개발하고, 거의 동시 발매 (예 : DAIVA)도 자주 행해졌지만, 너무 규모가 크지 않은 기업에서도 1 기종 선행 판매하고, 눈사태 식에 다음 기종으로 이식 작업을 계속 다음들에게 많은 기종 전개하는 메이커도 볼 수 있었다 (예 : 레리쿠스). 또한 외주 및 라이선스를 하여 결과적으로 여러 기종 확장 사례도 볼 수 있다.) 게임의 이식에서 자신의 문제는 연산 장치이다. 컨트롤러의 버튼 수와 그 배치, 아날로그적 입력의 유무 등 기종마다 다르기 때문에 위화감이 없는 작업을 재현하기 위해 이식된 기계에 맞춘 편곡이나 조정이 필요한 경우가 있다. 각 기종 간의 프레임 속도, 해상도의 차이도 큰 문제가 될 수있다. 이러한 이식되는 게임기(가정용)의 성능과 사양의 차이에 의한 게임 내용 변경 등도 한때 자주 행해지고 있었다. 예를 들어, 8 비트 PC의 시대에는 '타이니제비우스'(→ '제비 우스')와 같이 게임 규칙은 변경하지 않고 게임의 영상면을 대폭 생략하거나 패밀리 컴퓨터 '그라디우스'처럼 작업 장치 (입력 장치)의 차이로 인해 아케이드 게임에서는 3 버튼 (파워업 공중 공격 지상 공격)이던 것이 2 버튼 (파워업 공중과 지상 공격)으로 변경된 것이다.이러한 다운 그레이드적인 수정은 컨슈머 제품의 기능을 아케이드 게임기에 미치지 못하는 시대에는 종종 볼 수 있었지만, 2000년대 무렵부터 1980- 1990년대의 오래된 게임을 최신 기종에 이식하는 경우는 반대 그림과 음악의 업그레이드를 도모할 수 있다 (아래 참조). 또한 이식시 버그 (비법으로 인식되는 플레이어 - win 것도 포함) 수정과 밸런스 조정 요소 추가 등이 실시되는 경우도 많다. 예를 들어 아케이드 게임에서는 "적과의 접촉이 바로 실수"였다. 게임 라이프 제 도입에서 "적과의 접촉을 할 경우 생명이 줄어들어 게임 오버"가 된 것도 있다. 이 경우 게임 규칙 수정 등도 있어, 원작을 바탕으로 다른 내용의 작품을 만들어내는 리메이크와의 구별이 애매하다. 플레이 스테이션 등 세대에서 하드웨어의 성능 향상에 따라 제조 업체는 다른 기종에서 완전 이식을 목표로 하고 있지만, 제조 업체 이식 정도는 제각각이며, 일부는 치명적인 버그를 포함한 이식 프로그램이나 혹은 진짜 리메이크있는 것도 존재한다. 또한 카세트 테이프 또는 CD-ROM 등 기록 매체의 정보량 증가에 따라 주가되는 소프트웨어는 리메이크 그들이지만, 오리지널 모드라고 하여 원작의 충실한 이식 판을 포함하는 소프트웨어를 그대로 나타내주는 'Space'와 '팩맨 '등 한때 유명한 게임은 여러 모드를 가지고 있는 프로그램도 있다. 엄밀한 의미에서 이주에 관해서는, 특히 아케이드 게임 이식을 기다리고 있는 사용자들은 이 이식도 힘든 경향도 보인다. 예를 들어 아케이드 게임 해 포함 플레이를 즐기는 선수에게는 입력 기기의 조작감의 차이도 있지만, 아케이드 게임에서 갈고 닦은 기술을 사용할 수 없다고 불평을 토로하고, 아케이드 버전에서 버그 내지 설정 미스 등의 형태로 존재하고 있던(별로 중요시되고 보이지 않는) 요소가 이식시 수정되어 있거나 하면 재현성의 차이에 악평을 언급 것과 같은 경우이다.이러한 경향은 게이머 중에서도 코어 게이머 (소정 작품에 애착이 강한 게임 매니아)에 나타나는 요소이다. 단, 컴퓨터 게임 프로그램 개발이 점차 대규모로 되어가는 과정에서 다른 플랫폼에서 동일하게 동작하는 환경을 미리 구축하고 그 위에 게임을 동작시키려는 움직임도 있다. 게임 엔진이라고 하는 일반적인 프로그램은 게임 소프트웨어 개발의 수고를 줄이기 위해 사용되고 있지만, 반면에 자주 이용되는 게임 엔진은 다양한 플랫폼에 이식하는 것으로, 그 게임 엔진을 이용하여 게임 소프트웨어 이식에 필요한 노력과 비용 절감에도 도움이 되고 있다. 크로스 플랫폼 WOCA 콘솔 에뮬레이터