컴퓨터 프로그램들이 서로 상대방을 파괴하기 위해 싸우는 게임. 1984년에 A. K. Dewdney가 발표했다.
여러 (근사)해가 서로 경쟁을 하는 것이 GeneticAlgorithm의 경쟁 시스템이고, 프로그램 자체가 진화를 하는 것이 Evolutionary Programming이다. 여기서 한 발 더 나아가, 프로그램끼리 서로 싸우도록 한 게임이 CoreWar다. 프로그램이 창조해 낸 가상의 캐릭터끼리 서로 싸우는 게임은 많다. 로봇전투(RoboCode)나, 체스 등이 있다. (SeeAlso 체스두는컴퓨터.) 하지만 CoreWar는 프로그램 자체가 서로 치고박고 싸우게 된다.
see also:
- CoreWar FAQ
- CoreWar Links : 초보자를 위한 쉬운 가이드, 튜터리얼도 있다.
- 1984년도 ScientificAmerican에 실린 Dewdney의 최초 기사
- Dewdney의 저서들
- The Armchair Universe 0716719398
- The Magic Machine 0716721449
- The Armchair Universe 0716719398
- Would-Be Worlds: How Simulation Is Changing the Frontiers of Science, John L. Casti 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
위의 프로그램을 자연언어로 옮기면 다음과 같다:
- 여기서 3을 더한 위치(즉 4번 위치)에 4를 더한다.
- 여기서 2를 더한 위치(4번 위치)에 있는 내용을 2를 더한 위치(4번 위치)에 있는 값이 지시하는 주소에 복사한다.
- 여기서 2 명령어 이전(즉 1번 위치)으로 돌아가라.
- 자료값 0의 저장 위치
DAT #0, #N
을 복사한다. 이 프로그램은 총길이가 3이다(마지막 4번을 제하면). 따라서 메모리가 끝에서 다시 처음으로 이어져 있더라도, 만약 총 크기가 4의 배수이기만 하면 자기 자신을 손상하지 않고 무한 반복 가능하다.난쟁이는 일정 간격을 두고 폭탄을 발사하는 프로그램으로 비유할 수 있다.
난쟁이와 꼬마도깨비가 전쟁을 하면 어떻게 될까? 어떤 프로그램은 전사 프로그램들간의 격전 장면을 그래픽으로 보여주기도 한다.
CoreWar의 확장형으로, 미래에는 StarCraft같은 전략시뮬레이션 게임이나 바둑같은 보드게임을 승리로 이끌어갈 수 있는 인공지능 엔진을 프로그래밍하여 서로 싸우게 하는 게임이 생길지 모릅니다.
구체적인 것은 대충 이렇게 생각할 수 있습니다.
- 게임 제공 업자는 게임 개발자(user)들에게 그 게임의 모든 동작을 제어할 수 있게 하는 SDK를 제공합니다.
- SDK에는 Unit.Move(), Unit.Attack(), Map.ObjectAt(), Main.ShowAuthor()(개발자의 이름+정보 보여 주기), 등등이 들어 있을 수 있습니다.
- SDK에는 Unit.Move(), Unit.Attack(), Map.ObjectAt(), Main.ShowAuthor()(개발자의 이름+정보 보여 주기), 등등이 들어 있을 수 있습니다.
- user들은 그 SDK로 일종의 동적 라이브러리를 compile할 수 있습니다. compile한 코드로 소스코드를 알아내기는 어렵도록(거의 불가능하도록) 되어 있습니다.
- user들은 compile한 코드를 평가하기 위해:
- 네트워크로 다른 user의 코드와 1:1로 겨뤄보게 할 수 있습니다.
- compile한 코드를 게임 서버에 upload할 수 있습니다. 서버에 upload된 코드는:
- 일정 주기마다 무작위로 선택된 다른 코드(자기 자신일 수도 있음)과 겨뤄서 그때마다 승무패 수와 승률이 매겨집니다.
- 이건 DotWar처럼 구현해도 괜찮을 것 같습니다.
- 이건 DotWar처럼 구현해도 괜찮을 것 같습니다.
- 최초 N번 겨뤄서 승률이 기준 미달인 경우 조기탈락(서버에서 삭제)될 수 있습니다.
- N번 이상 겨뤘지만 승률이 기준 미달로 떨어질 경우 탈락(서버에서 삭제)될 수 있습니다.
- 일정 주기마다 무작위로 선택된 다른 코드(자기 자신일 수도 있음)과 겨뤄서 그때마다 승무패 수와 승률이 매겨집니다.
- 네트워크로 다른 user의 코드와 1:1로 겨뤄보게 할 수 있습니다.
저도 그 생각 했습니다. Genetic Mutant SDK를 만들어서 유전자화가 된 코드의 개발을 장려한 다음 그걸로 만들어진 코드들끼리는 교배를 시킬 수 있도록... WeHaveSomethingInCommon! --PuzzletChung