Core War

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
컴퓨터 프로그램들이 서로 상대방을 파괴하기 위해 싸우는 게임. 1984년에 A. K. Dewdney가 발표했다.

여러 (근사)해가 서로 경쟁을 하는 것이 GeneticAlgorithm의 경쟁 시스템이고, 프로그램 자체가 진화를 하는 것이 Evolutionary Programming이다. 여기서 한 발 더 나아가, 프로그램끼리 서로 싸우도록 한 게임이 CoreWar다. 프로그램이 창조해 낸 가상의 캐릭터끼리 서로 싸우는 게임은 많다. 로봇전투(Wiki:RoboCode)나, 체스 등이 있다. (SeeAlso 체스두는컴퓨터.) 하지만 CoreWar는 프로그램 자체가 서로 치고박고 싸우게 된다.

see also:
  • [http]CoreWar FAQ
  • [http]CoreWar Links : 초보자를 위한 쉬운 가이드, 튜터리얼도 있다.
  • 1984년도 ScientificAmerican에 실린 Dewdney의 최초 [http]기사
  • Dewdney의 저서들
  • Would-Be Worlds: How Simulation Is Changing the Frontiers of Science, John L. Casti ISBN:0471196932 : CoreWar를 포함, 이와 유사한 실험에 대한 일반인을 위한 과학교양서적

어떤 유한한(하지만 양끝이 서로 고리로 맞물려있는, 즉 wrap-around 되는) 메모리 공간이 있다. 여기에 여러개의 프로그램들이 존재한다. 이 프로그램들은 한번에 한 명령씩 수행된다. 각 프로그램의 목적은 다른 프로그램들을 죽이는(종료시키는) 것이다.

가장 단순한 전사, 꼬마도깨비(Imp) 프로그램은 다음과 같다.

MOV 0,1

이 코드가 실행되면 자기자신(0번째, 즉 현재 실행되는 명령어 위치)을 바로 다음 메모리 공간(현재 위치+1)에 복사하게 된다. 그러면 다음과 같은 상태가 된다.

MOV 0,1
MOV 0,1

이제는 (여전히 동일한 내용의) 두번째 명령어를 실행하게 되고, 똑같이 MOV 0,1을 복사하게 된다. 그리고 다음 명령어(MOV 0,1)을 수행한다. 이걸 무한히 반복한다.

비유를 하자면, 이 꼬마도깨비 프로그램은 메모리 공간에서 자신의 족적을 남기면서 돌아다니는 것으로 볼 수 있다. 만약 그 와중에 다른 전사(다른 누군가가 만든 또 다른 프로그램)가 있었다면 그 전사를 죽이게 된다(자기 자신을 덮어 쓰게 된다).

이 꼬마도깨비보다 한 단계 나아간 프로그램이 난쟁이(Dwarf) 프로그램이다.

ADD #4, 3 
MOV 2, @2
JMP -2
DAT #0, #0

위의 프로그램을 자연언어로 옮기면 다음과 같다:
  1. 여기서 3을 더한 위치(즉 4번 위치)에 4를 더한다.
  2. 여기서 2를 더한 위치(4번 위치)에 있는 내용을 2를 더한 위치(4번 위치)에 있는 값이 지시하는 주소에 복사한다.
  3. 여기서 2 명령어 이전(즉 1번 위치)으로 돌아가라.
  4. 자료값 0의 저장 위치

1번이 실행되면 4번의 자료값이 4로 증가한다. 그러고 2번이 실행되면 4번의 내용(자료값 4)을 4번이 지시하는 메모리 위치(4번에서 4만큼 더 나아간 위치, 즉 8번 위치)에 복사한다. 3번이 수행되면 앞서의 1번, 즉 4번의 저장소에 다시 4를 더하는 명령을 수행한다. 이걸 반복하게 되면 난쟁이는 네 칸 씩 건너 뛰면서 DAT #0, #N을 복사한다. 이 프로그램은 총길이가 3이다(마지막 4번을 제하면). 따라서 메모리가 끝에서 다시 처음으로 이어져 있더라도, 만약 총 크기가 4의 배수이기만 하면 자기 자신을 손상하지 않고 무한 반복 가능하다.

난쟁이는 일정 간격을 두고 폭탄을 발사하는 프로그램으로 비유할 수 있다.

난쟁이와 꼬마도깨비가 전쟁을 하면 어떻게 될까? 어떤 프로그램은 전사 프로그램들간의 격전 장면을 그래픽으로 보여주기도 한다.

CoreWar의 확장형으로, 미래에는 StarCraft같은 전략시뮬레이션 게임이나 바둑같은 보드게임을 승리로 이끌어갈 수 있는 인공지능 엔진을 프로그래밍하여 서로 싸우게 하는 게임이 생길지 모릅니다.

구체적인 것은 대충 이렇게 생각할 수 있습니다.
  • 게임 제공 업자는 게임 개발자(user)들에게 그 게임의 모든 동작을 제어할 수 있게 하는 SDK를 제공합니다.
    • SDK에는 Unit.Move(), Unit.Attack(), Map.ObjectAt(), Main.ShowAuthor()(개발자의 이름+정보 보여 주기), 등등이 들어 있을 수 있습니다.
  • user들은 그 SDK로 일종의 동적 라이브러리를 compile할 수 있습니다. compile한 코드로 소스코드를 알아내기는 어렵도록(거의 불가능하도록) 되어 있습니다.
  • user들은 compile한 코드를 평가하기 위해:
    • 네트워크로 다른 user의 코드와 1:1로 겨뤄보게 할 수 있습니다.
    • compile한 코드를 게임 서버에 upload할 수 있습니다. 서버에 upload된 코드는:
      • 일정 주기마다 무작위로 선택된 다른 코드(자기 자신일 수도 있음)과 겨뤄서 그때마다 승무패 수와 승률이 매겨집니다.
        • 이건 Seminar:DotWar처럼 구현해도 괜찮을 것 같습니다.
      • 최초 N번 겨뤄서 승률이 기준 미달인 경우 조기탈락(서버에서 삭제)될 수 있습니다.
      • N번 이상 겨뤘지만 승률이 기준 미달로 떨어질 경우 탈락(서버에서 삭제)될 수 있습니다.

승리한 코드끼리의 교배가 가능하고 돌연변이 개념이 추가된다면 어떨까요? 하여간 제가 생각하는 것들이란 다... :) --아무개
저도 그 생각 했습니다. Genetic Mutant SDK를 만들어서 유전자화가 된 코드의 개발을 장려한 다음 그걸로 만들어진 코드들끼리는 교배를 시킬 수 있도록... WeHaveSomethingInCommon! :) --PuzzletChung


"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>