Redcode

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Redcode — язык программирования, созданный специально для игры «Бой в памяти»[1]. Автор языка – Александр Киватин Дьюдни (англ. Alexander Keewatin Dewdney), который в соавторстве с Дэвидом Джонсом впервые написал руководство к игре со списком восьми команд языка, опубликованное в журнале Scientific American в марте 1984 года. Синтаксически Redcode похож на ассемблер. Существует несколько различных стандартов, определяющих систему выполнения команд: ICWS'86, ICWS'88[2], ICWS'94, также существуют системы, не соответствующие полностью им.

Список команд языка[править | править код]

Стандарт ICWS'94 определяет следующие 19 команд (приведены в алфавитном порядке; в круглых скобках — англоязычная расшифровка команды), синтаксис некоторых из них существенно отличается от других стандартов:

ADD – (add) команда сложения; пример: ADD A B — прибавить число A к числу по адресу B и сохранить результат по адресу B
CMP – (compare) = SEQ; пример: CMP A B — если A=B, пропустить следующую команду
DAT – (data) остановить процесс; пример: DAT A — # А
DIV – (divide) команда деления; пример: DIV A B – разделить число по адресу B на число A и сохранить результат по адресу B, если результат не равен нулю (иначе остановить процесс)
DJN – (decrement and jump if not zero) перейти к адресу в случае ненулевого значения после уменьшения на 1; пример: DJN A B — уменьшить число по адресу B, если в итоге B≠0, перейти по адресу A (иначе продолжить со следующего адреса)
JMN – (jump if not zero) перейти к адресу в случае ненулевого значения; пример: JMN A B — если B≠0, перейти по адресу A и продолжить выполнение с него (иначе продолжить со следующей команды)
JMP – (jump) перейти к адресу; пример: JMP A — перейти к адресу A и продолжить выполнение с него
JMZ – (jump if zero) перейти к адресу в случае нулевого значения; пример: JMZ A B — если B=0, перейти по адресу A и продолжить выполнение с него (иначе продолжить со следующей команды)
LDP – (load from p-space) загрузить число из пользовательского пространства; пример: LDP A B — загрузить число из адреса A пользовательского пространства по адресу B ядра
MOD – (modulus) взять остаток деления; пример: MOD A B – разделить число по адресу B на число A и сохранить остаток по адресу B, если остаток не равен нулю (иначе остановить процесс)
MOV – (move) переслать данные с одного адреса на другой; пример: MOV A B — переслать данные из А в В
MUL – (mutlilpy) команда умножения; пример: MUL A B – умножить число A на число по адресу B и сохранить результат по адресу B
NOP – (no operation) нет операции
SEQ – (skip if equal) пропустить следующую команду в случае равенства чисел; например: SEQ A B — если A=B, пропустить следующую команду
SLT – (skip if lower than) пропустить следующую команду, если первое число меньше второго; например: SLT A B — если A<B, пропустить следующую команду
SNE – (skip if not equal) пропустить следующую команду в случае неравенства чисел; например: SNE A B — если A≠B, пропустить следующую команду
SPL – (split) начать отдельный процесс; пример: SPL A — сначала продолжить текущий процесс выполнением следующей команды и начать отдельный процесс по адресу A (в случае достижения предельно допустимого количества процессов SPL экваивалетно NOP)
STP – (save to p-space) сохранить число в пользовательское пространство; пример: STP A B — сохранить число из адреса B ядра по адресу A пользовательского пространства
SUB – (subtract) команда вычитания; пример: SUB A B — вычесть число A из числа по адресу B и сохранить результат по адресу B

Примечания[править | править код]

  1. Shen. Игры настоящих кодеров. «Хакер» (15 октября 2003).
  2. http://members.gaponline.de/w.zimmer/Mars/tutorial.txt