Skip to content

Введение

VBrazhnik edited this page Jan 3, 2019 · 1 revision

Короткий экскурс в историю

В 1984 году в журнале «Scientific American» появилась статья Andrew Dewdney с описанием игры «Core Wars». Статья начиналась следующими словами:

Две программы в своей естественной среде обитания — компьютерной памяти — гоняются друг за другом от адреса к адресу. Иногда они выслеживают врага; иногда закладывают батареи цифровых бомб; иногда они копируют сами себя в другое место памяти, чтобы избежать опасности или останавливаются, чтобы поправить нанесенный противником ущерб. Эту игру я называю «Core Wars»…

Источник: Глава 2. Часть 1. Сражение на «ферромагнитных сердечниках» или MARS — бог войны.

Обзор проекта «Corewar»

Именно на основе этой довольно популярной в узких кругах игры построен проект «Corewar», который состоит из трех обязательных частей:

  • Чемпион (The Champion)
  • Ассемблер (The Assembler)
  • Виртуальная машина (The Virtual Machine)

Чемпион

Суть данного раздела заключается в написании кода на языке ассемблера, который затем будет помещен в файл с расширением .s.

На самом деле мы пишем код на языке псевдоассемблера. То есть на созданном специально для этого задания языке, который похож на настоящий ассемблер, но все же им не является. Но для соответствия тексту задания, простоты и в целях экономии шести букв мы тоже будем называть этот язык ассемблером.

Созданный код это и есть наш чемпион, цель которого — сражаться с другими чемпионами, написанными нами или другими людьми.

Код каждого чемпиона имеет следующую структуру:

  1. Имя
  2. Комментарий
  3. Исполняемый код

Он может выглядеть, например, вот так:

.name       "Batman"
.comment    "This city needs me"

loop:
        sti r1, %:live, %1
live:
        live %0
        ld %0, r2
        zjmp %:loop

В данном проекте у нас нет цели создать самого сильного и непобедимого чемпиона. Это задача для совершенно другого проекта под названием «Corewar Championship».

В «Corewar» мы создаем своего чемпиона только для того, чтобы продемонстрировать понимание темы и умение писать код на ассемблере. А не для того, чтобы он мог кого-то победить.

Наша задача — написать код без ошибок, чтобы программа asm смогла превратить его в байт-код, который затем бы выполнила виртуальная машина.

Цели выиграть битву или продемонстрировать хоть сколько-нибудь достойный результат в сражении перед нами не стоит.

Ассемблер

Задача этого раздела — создание программы, которая будет транслировать написанный на языке ассемблера код чемпиона в байт-код — кучу чисел в шестнадцатеричной системе исчисления.

С эльфийского это задание можно трактовать как «перевести команды с языка понятного человеку (ассемблера) на язык, понятный виртуальной машине (байт-код)».

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текст программы и т. д.

Источник: Транслятор — Википедия

То есть мы должны создать программу с именем asm (от слова «assembler»), которая будет получать в качестве параметра файл с кодом на языке ассемблера и создавать на его основе новый файл с байт-кодом.

Файл с кодом нашего чемпиона, написанный на ассемблере, должен иметь расширение .s. На его основе программа asm создаст новый файл с расширением .cor, где и будет находиться созданный байт-код.

Имя самого файла останется неизменным. То есть после вызова команды ./asm batman.s рядом с файлом batman.s должен появиться файл batman.cor. Конечно же, если во время трансляции не возникнет какой-либо ошибки.

Виртуальная машина

После того, как мы получили файл с байт-кодом, наступает время работы виртуальной машины.

Виртуальная машина это тоже программа, исполнительный файл которой должен называться corewar.

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

А затем следить за ходом битвы, чтобы объявить чемпиона-победителя после её завершения.

Бонусы

Как всегда количество бонусов и их суть ограничивается исключительно фантазией автора.

Вот несколько из тех, которые можно было бы реализовать:

Расширенные сообщение об ошибках

Если во время генерации байт-кода произошла ошибка, то желательно, чтобы в этом случае программа asm повела себя как настоящий транслятор, которым она на самом деле и является. То есть вывела осмысленное сообщение — в какой строке при работе с файлом .s произошла ошибка и какой ее тип.

Возможность дизассемблировать байт-код

Сделать возможным получение исходного кода на ассемблере имея в распоряжении файл с байт-кодом. То есть реализовать функцию обратную той, для которой предназначена программа asm.

Визуализатор

Создать программу, которая будет отображать состояние памяти, а также изменение ключевых игровых параметров во время сражения.

К этому также можно добавить различные звуковые эффекты, чтобы акцентировать внимание на таких ключевых моментах, как смерть каретки или объявление победителя.

Полезные ссылки

На сайте «University of Useless Knowledge» есть серия из трех статей, которая описывает идеи и принципы игры «Core Wars». Также в этих статьях есть примеры кода чемпионов и разбор того, как этот самый код может сражаться и наносить ущерб. Правда все это на языке настоящего ассемблера.

Но в целом это неплохое введение в тему, которое подробно рассказывает, в чем заключается суть «битвы в памяти»: