Бой в памяти

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 46.159.82.247 (обсуждение) в 20:08, 4 июля 2014 (Redcode: Продолжаю разбираться.). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Core War
Скриншот программы Core War
Игра «Core War» под управлением симулятора pMARS
Тип Игра для программистов
Авторы Д. Г. Джонс и А. К. Дьюдни
Первый выпуск 1984
Аппаратная платформа Linux
Лицензия BSD, GNU GPL и бесплатное программное обеспечение

Бой в памяти (англ. Core War) — разновидность компьютерной игры «Дарвин» разработанная Александром К. Дьюдни. Помогал разрабатывать игру Дэвид Джонс, студент кафедры информатики университета Западной Онтарио, где преподавал Дьюдни.

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

Каждая программа может иметь несколько активных потоков, причём поток может порождать другие потоки с помощью инструкции SPL. Потоки, принадлежащие одной программе, выполняются по очереди, поэтому скорость их выполнения обратно пропорциональна количеству потоков. Поток завершается, если пытается выполнить некорректную инструкцию. Программа, все потоки которой завершились, считается проигравшей.

Статьи, посвящённые игре, публиковались в журнале Scientific American в 19841987, в колонке Computer Recreations (Занимательный компьютер). Игра вызвала значительный интерес у читателей, и впоследствии было основано международное общество International Core War Society со штаб-квартирой в США и отделениями во многих странах мира, включая СССР. Также было разработано несколько стандартов, описывающих правила игры. Разработать «Бой в памяти» Дьюдни побудила история о двух противоборствующих программах CREEPER и REAPER (см. компьютерный вирус). Обстоятельства разработки CREEPER/REAPER дошли до Дьюдни в несколько искажённом виде, так по словам Р. Томлинсона, ни заражения ARPANet, ни «поединка» между двумя программами в действительности не было.

Redcode

Тут представлен стандарт 94 (последний). Все инструкции имеют 2 аргумента A и B (не все используют оба, но значение хранят и совершают операции адресации (инкремент/декремент)), предполагается что A источник, B назначение.

Инструкции (<Инструкция> <Используемые аргументы> - <Описание>):

   DAT     - Останавливает выполнение потока.
   MOV A B - Скопировать источник по адресу в назначение по адресу. 
   ADD A B - Прибавить источник к назначению. 
   SUB A B - Вычесть источник к назначению. 
   MUL A B - Умножить назначение на источник. 
   DIV A B - Разделить назначение на источник. (При B 0 останавливает выполнение потока).
   MOD A B - Вычесть модуль из назначения через источник. (При B 0 останавливает выполнение потока).
   JMP A   - Переместится по адресу. 
   JMZ A B - Если B 0 перейти по адресу A.
   JMN A B - Если B не равно 0 перейти по адресу A.
   DJN A B - Вычесть 1 от B и если B неравно 0 то перейти по адресу A.
   SPL A   - Создать новый поток по адресу A (Начнёт выполнение после всех остальных потоков, включая проигравшего инструкцию)
   SEQ A B - Сравнить источник с назначением и если равны то пропустить следующую инструкцию.
   SNE A B - Сравнить источник с назначением и если не равны то пропустить следующую инструкцию.
   SLT A B - Сравнить источник с назначением и если первое число меньше чем второе, то пропустить следующую инструкцию.
   LDP  - load from p-space (loads a number from private storage space)
   STP  - save to p-space (saves a number to private storage space)
   NOP  - Ничего не происходит. 

Адресация (префиксы к аргументам):

 # - Число.
 $ - Адрес (можно не указывать).
 * - A аргумент инструкции по адресу. 
 @ - B аргумент инструкции по адресу. 
 { - A аргумент инструкции по адресу. Аргумент с начало декрементится, а потом берётся. 
 < - B аргумент инструкции по адресу. Аргумент с начало декрементится, а потом берётся.    
 } - A аргумент инструкции по адресу. Аргумент с начало берётся, потом инкрементится. 
 > - B аргумент инструкции по адресу. Аргумент с начало берётся, потом инкрементится. 
 
 Режимы адресации являются частью инструкции, а не аргумента. Когда берутся значения через *@{<}>, то предполагается что это адрес. Сама адреса относительны инструкций где определены.

Модификаторы (постфиксы инструкций):

 .A  - Взять A аргумент из источника в A аргумент назначения.
 .B  - Взять B аргумент из источника в B аргумент назначения.
 .AB - Взять A аргумент из источника в B аргумент назначения.
 .BA - Взять B аргумент из источника в A аргумент назначения.
 .F  - Взять AB аргументы из источника в AB аргументы назначения.
 .X  - Взять AB аргументы из источника в BA аргументы назначения.
 .I  - Взять весь источник в назначение.

Ссылки

Статьи

Сайты