четверг, 1 ноября 2012 г.

Хобби для настоящих программистов - CoreWars


Минуло уж много лет с тех пор, как на свет появился первый компьютерный вирус. Теперь их присутствие уже никого не удивляет. В общем, времена меняются, мир растёт, но часто хочется чего-нибудь тёплого, лампового.
И в этой статье, как и обещал, расскажу о игре для программистов Corewars: о том, что это и как играть. А ещё мы рассмотрим некоторые примеры(на Redcode) и тактики игры.



Бой в памяти (Core War) — разновидность компьютерной игры «Дарвин» разработанная Александром К. Дьюдни. Помогал разрабатывать игру Дэвид Джонс, студент кафедры информатики университета Западной Онтарио, где преподавал Дьюдни.
В данной игре игроки разрабатывают компьютерные программы на специальном языке программирования, похожем на ассемблер — Redcode. Программы размещаются в циклически замкнутом участке памяти (core), состоящей из 8000 ячеек и зацикленной в кольцо. Каждая команда занимает одну ячейку. Redcode-программы работают под управлением MARS (англ. Memory Array Redcode Simulator — Симулятор Массива Памяти Redcode). Программы загружаются по случайным адресам в памяти.

Итак, как вы уже поняли, состязание представляет из себя битву программ за память. Используемый язык очень прост и включает в себя менее 20 инструкций(в изначальной реализации).

 Инструкция
     Аргументы        
          Описание
 MOV A B - переслать содержимое ячейки с адресом A в ячейку с адресом B
 ADD A B - прибавить содержимое ячейки с адресом A к ячейке с адресом B
 SUB A B - вычесть содержимое ячейки с адресом A из ячейки с адресом B
 MUL A B - умножить содержимое ячейки с адресом A на ячейки с адресом B
 DIV A B - разделить содержимое ячейки с адресом A на ячейки с адресом B
 MOD A B - делит содержимое ячейки с адресом A на ячейки с адресом B
           с остатком
 JMP A   - передать управление на адрес A
 JMZ A B - передать управление на адрес A, если содержимое ячейки
              с адресом B равно нулю
 JMG A B - передать управление на адрес A, если содержимое ячейки
              с адресом B больше нуля
 DJZ A B - вычесть единицу из содержимого ячейки с адресом B и передать
              управление на адрес A, если содержимое  ячейки с адресом B
              равно нулю
 CMP A B - сравнить содержимое ячеек с адресами A и B, если они не равны,
              пропустить следующую инструкцию
 SEQ A B - сравнить содержимое ячеек с адресами A и B, если они равны,
              пропустить следующую инструкцию
 SLT A B - сравнить содержимое ячеек с адресами A и B, если первое
              меньше второго, пропустить следующую инструкцию
 SNE A B - то же самое, что и CMP 
 SPL   B - породить новый поток по адресу B
 STP A   - сохранить содержимое ячейки с адресом B в складе ячеек
 LDP A   - загрузить содержимое ячейки с адресом B из склада ячеек
 DAT   B - неисполняемое выражение, B — данные.  При попытке выполнения
              программа останавливается
 NOP - нет операций
Всё, что после ; - комментарии 
 
Отдельно нужно обозначить инструкцию SPL: она позволяет запустить
ещё один поток выполнения.
Это позволяет программам размножаться, но следует помнить о том,
что скорость выполнения каждой задачи в отдельности падает пропорционально.
Если поток натыкается на что-то отличное от инструкции(ячейку данных),
то исполнение потока прерывается. Кстати да, для тех, кто хочет чего-то
более привычного есть специальная версия с ассемблером 8086.
 
Ну-с теперь к практике.Начнём с HelloWorld.
 

Imp

Самым простым программой - воином в этой игре является так называемый Imp,
состоящий всего из одной комманды.




;redcode
;name Imp
;author A. K. Dewdney
;strategy imp
;history The "Hellow World" of warriors
 
 mov 0, 1

Выполняясь, этот код перемещает сам себя вперёд на одну ячейку.
Таким образом пробегая вперёд и заполняя собой память. 


Midget 

Теперь  ознакомимся со стратегией Bomber. Помните, я писал, что поле того, как поток исполнения натыкается на DAT, он завершается. На этом и основана данная стратегия.

;redcode
;name Midget
;author Chip Wendell
;strategy stone (bomber)
;history Third place at the 1986 ICWS tournament
Bomb    dat    #0,    #-980
Spacer    equ    28
Start    mov    Bomb,    @Bomb ; Бросаем бомбу по адресу Bomb
    sub    #Spacer,Bomb ; Bomb=Bomb-Spacer
    jmp    Start,    #0 ; Переходим в ячейку Start   
    end    Start   


Mice 



 Это уже не такой простой воин. Его тактика называется replicator - т.е. создаёт свою копию в другой части памяти и запускает новый поток выполнения.

 ;redcode
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
; Top,Start,Loop и т.д. - метки
Top    dat    #0,    #0 ; Данные (Здесь используется как счетчик)
Start    mov    #12,    Top ; установим в счётчик значение 12

Loop    mov    @Top,    <Target ; копируем инструкциию по относительному адресу
    ;лежащему в Top с предекрементом Target

    djn    Loop,    Top ;вычесть единицу из содержимого ячейки с адресом Top
    ; и передать управление на адрес Loop, если содержимое ячейки с адресом Top!=0

    spl    @Target,0;Создаём новый поток
Spacer    equ    653
    add    #Spacer, Target ; Прибавляем Spacer к  ячейке Target
    jmz    Start,    Top; передать управление на адрес Start,
;если содержимое ячейки с адресом Top больше нуля

Target    dat    #0,    #833
    end    Start ; Точка входа в программу - Start

Чтобы разобраться  нам понадобятся модификаторы инструкции
  • MOV.A -- moves the A-field of the source into the A-field of the destination
  • MOV.B -- moves the B-field of the source into the B-field of the destination
  • MOV.AB -- moves the A-field of the source into the B-field of the destination
  • MOV.BA -- moves the B-field of the source into the A-field of the destination
  • MOV.F -- moves both fields of the source into the same fields in the destination
  • MOV.X -- moves both fields of the source into the opposite fields in the destination
  • MOV.I -- moves the whole source instruction into the destination
Конечно, это не весь список тактик, но для начала хватит. Если вас заинтересовал Redcode, то вам совершенно точно нужно почитать эту замечательную справку.

Кстати, да, апогеем развития войнов Redcode считается момент создания первой полиморфной программы, которые впоследствии стали самыми эффективными.

Что скачать, чтобы попробовать?



Скачать всё необходимое можно ЗДЕСЬ.
Для пользователей мелкомягкой системы можно для начала побаловаться с Core Win, которая проста в обращении и не требует настройки.

Для продвинутых CoreWars-хакеров существуют целые отладочные пакеты,  которые вы также найдёте по ссылке выше.


Развлекайтесь интеллектуально, друзья!

Комментариев нет:

Отправить комментарий