.xX$$x.
        .x$$$$$$$x.
       d$$$$$$$$$$$
     ,$$$$$$$P' `P'
     $$$$$$P'   '
     $$$$$P    b     ,$$x     ,$$x    ,$$x
     Y$$$$'    `$.  $$$$$$.  $$$$$$  $$P~d$.
     `$$$$     ,$$ $$$$$$$b $$$P `$ $$$b.$$b
      `$$$    ,$$$,$$' `$$$ $$$'  ' $$P$XX$'
       `Y$b ,d$$$P `$b,d$P' `$$.    `$$.  ,
        `$$$$$$$'    $$$P'   `$$b    `$$$P

           .xX$$x.
        .x$$$$$$$x.
       d$$$$$x'x$$$              $
     ,$$$$$P    $P               x$
     $$$$$P    '                ,$$   ,$$x     ,$$x    ,$$x     ,$$x
     Y$$$$$$x'  $x   x$,$$$b,  ,$P   $$$$$$.  $$$$$$  $$P~d$.  $$$$$$
     $$$$$$$X'   $$ $$  $$  $$ $$'  $$$'`$$b $$$P `$ $$$b.$$b $$$P `$
     '$$$b        $$$   $$   $ $$'  $$' `$$$ $$$'  ' $$P$XX$' $$$'  '
       '$$b   .x $$ $$  $$  $$ $$L  `$b,d$P' `$$.    `$$.  ,  `$$.
         'x$$$$'x$   $x $$$$P   Y$$P' $$$P'   `$$b    `$$$P    `$$b
                        $$'
                        $$
Выпуск 1               $$
16/10/05
_______________________ $$ ________________________________________
                        $P

Это первый выпуск The Core Explorer. Новый журнал для содействия распостранению
игры CoreWar среди новых игроков. Мы начнём с самого начала и будем обьяснять много
различных стратегий, трюков и всяких штучек, чтобы вы стали продвинутым редкодером.

___________________________________________________________________
___ Roy's Top 10 Resources: _______________________________________

Известно, что для новичков бывет сложно найти хорошие ресурсы в Сети.
Вот наш список из 10 самых популярных сайтов и туториалов

-  The beginners guide to Redcode

-  Steve Bailey's Guides

-  Phillip Kendall

-  The Core Warrior

-  Steve Morrell

-  Corewar Lexiсon

-  Fizmo's CoreWar site

-  John Metcalfs Library

-  KOTH.org (Info Section)

-  rec.games.corewar (+FAQ)

Также IRC:

Сервер:     irc.koth.org:6667
Канал:      #corewars

Мы что-ниудь забыли? Пищите нам!


___________________________________________________________________
___ Исследуя репликаторов__________________________________________

    Привет всем! Сегодня иы будем обсуждать основы silk
engine для самокопирования и мультипоточности в репликаторах. После освения
основ мы покажем как написать простого бойца для несложного холма (для
новичков) и закинем его на холм 94b на http://sal.math.ualberta.ca для
тестирования. Начнём.
Первое что вы должны знать - это как создать требуемое количество потоков
в определённом месте в памяти. Это сущесвенно, если вам нужен боец требующий
определённого числа потоков для правильного функционирования, такой как
большинство "бумаг" (papers). Пускай вам надо создать два процесса.
Что вы будете делать? Просто. Достаточно spl 1, 0 и следующая инструкция
будет уже выполнятся в двух потоках. А если надо 4, что тогда? Хм, так как
4 = 2^2 = 2*2, можно просто повторить процесс.
То есть:

        spl 1, 0
        spl 1, 0
        ;(здесь уже 4 потока)

    Вобщем говоря, если вы хотите 2^n процессов, вы просто пишете
цепочку из n инструкций вида: spl 1, y. Заметьте что вы можете использовать
В-поле spl команды для хранения какого-нибудь числа, которое может понадобиться
вам позже, или раскрасить память (corecoloring) (используя предекременты или постинкременты),
так как это никак не повлияет на создание процессов. Теперь, если мы хотим
запустить Х процессов параллельно в некоторой ячейке, и Х <> 2^n? Есть способ
сделать это. Во-первых мы должны записать число нужных процессов в двоичном коде.
Если вы не знаете как это делается - вот пример:

            139 = 69*2 +       1
            69 = 34*2  +       1
            34 = 17*2  +       0
            17 = 8*2   +       1
            8  = 4*2   +       0
            4  = 2*2   +       0
            2  = 1*2   +       0
            1  = 0*0   +       1

    И, таким образом, 139 = 10001011 =
                            (10)       (2)

1*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0

    Надеюсь, вы поняли как это делается. Да, и зачем нам это надо?
Поступаем следующим образом - записываем (Х-1) в двоичном виде и соответственно
ему записываем цепочку инструкций, интерпретируя каждую "1" как spl 1,0
и каждый "0" как mov.i -1, 0. То есть, для 9 процессов мы пишем так:

9-1 = 8 = 1000
             (2)

            spl 1, 0    \
            mov.i -1, 0  \ эта последовательность spl и mov
            mov.i -1, 0  / создаёт 9 потоков.
            mov.i -1, 0 /

    Теперь мы знаем, как создать столько потоков, сколько нам надо.
Отлично. Продолжаем...

    Напишем простейший репликатор:

        00  spl 1, 0
        01  spl 1, 0
        02  spl pstep1, 0
        03  mov >-1, }-1
        04  mov <-2, {1
        05  jmp pstep2, 0

    Первая часть spl/mov реализует метод называемый silk copying
(копирование шёлка?). Большинство современных репликаторов используют его.
Как это работает? Сначала мы запускаем 4 потока. Потом выполлняется
инструкция 02. Она создаёт несколько новых процессов на расстоянии pstep1
ячеек от текущей позиции. Но там ничего нет! Пустая память, datы или кто
знает что ещё!
Тогда зачем мы это делаем? Потому что можем. :0 Порядок выполнения здесь
по-настоящему важен. После spl в ячейке 02 что будет выполняться? Именно
инструкция в ячейке ниже! И мы используем эту команду чтобы скопировать
код нашего маленького репликатора туда, где его ждут наши процессы -
на pstep1 ячеек дальше. Как мы это делаем? Я должен напомнить вам что у
нас есть 4 процесса на mov >-1, }-1 в ячейке 03. После того, как
первый процесс выполняет mov , память выглядит след. образом:

        00  spl 1, 0
        01  spl 1, 0
        02  spl pstep1+1, 1
        03  mov >-1, }-1
        04  mov <-2, {1
        05  jmp pstep2, 0
        .....
        .....
        (2+pstep1) spl pstep1, 0
        .....
        .....

    После второго выполнения (этого же mov)

        00  spl 1, 0
        01  spl 1, 0
        02  spl pstep1+2, 2
        03  mov >-1, }-1
        04  mov <-2, {1
        05  jmp pstep2, 0
        .....
        .....
        (2+pstep1) spl pstep1, 0
        (3+pstep1) mov >-1, }-1
        .....
        .....
    После того как все процессы выполнят этот mov, мы
        получим:

        00  spl 1, 0
        01  spl 1, 0
        02  spl pstep1+2, 2
        03  mov >-1, }-1
        04  mov <-2, {1
        05  jmp pstep2, 0
        .....
        .....
        (2+pstep1) spl pstep1, 0
    ;тут все потоки которые как раз будут выполянться

            (3+pstep1) mov >-1, }-1
        (4+pstep1) mov <-2, {1
        (5+pstep1) jmp pstep2, 0
        .....
        .....

    то есть, мы как раз успели скопировать код. Вторая часть нашего
небольшого репликатора делает то же, что и первая, только в обратном порядке
- код сначала копируется, а потом мы прыгаем на копию. Это делается для
того чтобы закрыть "бумагу" - не дать процессам убежать в неизвестную часть
памяти (которая может быть заполнена чем нибудь нам не нужным). Почему мы
делаем silk copying? Это немного быстрее И безопасней. Почему безоасней?
Ну, иногда нам бороться с этими назойливыми сканнерами, которые всегда
ищут наши копии чтобы атаковать и уничтожить. Поэтому если мы сначала
коопируем код, а потом туда прыгаем - мы даём противнику шанс обнаружить
и атаковать ещё до того как мы туда перейдём и выполним. Вот почему silk
copying работает лучше в бою. Надеюсь, что вы разобрались в этой статье
и сможете написать какой-нибудь простой silk-подобный репликатор сами.
Впрочем, чтобы написать хорошего бойца, нужна какая-нибудь атака, поэтому
вам прийдётся добавить бомбера внутрь и также увеличить число потоков на
одну копию. Мы постараемя показать как подготовить вашего будущего
репликатора к настоящей битве в следующей статье.
Просто продолжайте читать!

Nenad Tomasev

___________________________________________________________________
___ Core Explorer Боец #1__________________________________________

Создавая Бумагу
===============

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

Первый блок это так называемый frontend-silk (fsilk):

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

Вы можете добавлять столько fsilk'ов сколько хотите - и он будет по
прежнему работать, если у вас будет правильное число процессов (мы
вернемся к вопросу о числе процессов позже) То есть код ниже будет работать
нормально :

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

fsilk2  spl pStep2,     0
    mov.i   > fsilk2,   } fsilk2
    ...

Есть другой тип блока - например backend-silk (bsilk). Как видно
из имени, его стоит использовать в конце кода репликатора :

    ...
    mov.i   > fsilk2,   } bsilk1
bsilk1  jmp pStep3,     0

Теперь мы имеем :

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

fsilk2  spl pStep2,     0
    mov.i   > fsilk2,   } fsilk2

    mov.i   > fsilk2,   } bsilk1
bsilk1  jmp pStep3,     0

У этой "бумаги" 6 строк, то есть надо 6 потоков для правильной работы :

pGo spl 1
    mov.i   0,      -1
    spl 1

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

fsilk2  spl pStep2,     0
    mov.i   > fsilk2,   } fsilk2

    mov.i   > fsilk2,   } bsilk1
bsilk1  jmp pStep3,     0


Оба fsilk'а копируют первый spl на новую позицию (на расстояние
pStep1 и pStep2 ячеек) и потом копируют часть репликатора за silk'ом
туда же. Давайте я обьясню это более подробно.

fsilk1 копирует весь репликатор, но fsilk2 ведь нет. Он переносит все
инструкции между fsilk2 и bsilk1 и (!) две следующие ячейки. Обычно
это будут dat'ы, так что это может испортить код противника.

На текущий момент у нас получился не очень интересный боец. Он копирует себя
повсюду и надеется что этого хватит. Может стоит покидать чуть-чуть бомб:

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

fsilk2  spl pStep2,     0
    mov.i   > fsilk2,   } fsilk2

    mov.i   bomb,       < bStep

    mov.i   > fsilk2,   } bsilk1
bsilk1  jmp pStep3,     0

bomb    dat.f   < 1,        { 1

Так как у нас 8 строчек, не забываем запускать 9 процессов вначале:

pGo spl 1
    spl 1
    spl 1
...

Но как работают наши бомбы? Во-первых вы должны знать, чо вы можете включить
любую инструкцию между silk'ами, но обычно лучше всего использовать место
перед последним silk'ом.

То есть у нас есть два fsilk'а, который копируют бойца повсюду. Перед
тем как выполнить bsilk мы запускаем "бомбометание". Мы ставим не одну бомбу,
а 8 так как у нас именно такое число процессов. Чтобы избежать бомбардировки
одного и того-же места, мы изменяем указатель (bStep). Так как используется
предекремент, бомбы ложаться перед bStep.

Перед тестированием нашего бойца, следует подобрать константы для
pStep1,pStep2, pStep3 и bStep:

    pStep1  EQU 2341
    pStep2  EQU 2421
    pStep3  EQU 3241
    bStep   EQU 100

pGo spl 1
    spl 1
    spl 1

fsilk1  spl pStep1,     0
    mov.i   > fsilk1,   } fsilk1

fsilk2  spl pStep2,     0
    mov.i   > fsilk2,   } fsilk2

    mov.i   bomb,       < bStep

    mov.i   < fsilk2,   { bsilk1
bsilk1  jmp pStep3,     0

bomb    dat.f   < 1,        { 1

Эта версия зарабатывает 118 в бенчмарке WilFiz. Это не так уж и плохо.

Jens Gutzeit

___________________________________________________________________
___ SAL 94b update:         13.10.2005.________________________

Итак, давайте взглянем пристальней на холм новичков на SAL.
Сейчас на холме много репликаторов, и сканеры воспользовались этим,
и правят холмом. Dragonfly, test, Svarog, Yetima, Xenocitrum... Может
вам стоит попробовать пропихнуть сканера на холм и принять участие в
пиршестве. Но, обычно лучшим подходом будет атаковать бойцов из вершины
таблицы, поскольку это гарантирует больше еды вашему бойцу. Большинство
успешных сканеров на холме это oneshot`ы, и Dragonfly смотрится
лучше всех. Вас не трогает что он так рулит на этом холме? Не хочется его
попустить? Может стоит попробовать аггресивные "камни"/импы?
А может нет? Приглядимся к таблице очков... Dragonfly сильно проигрывает
некоторым бойцам. Почему? Потому-что у них хорошо развита стратегия
размещения decoy (теневых копий, обманок?). Вот и совет: спланируйте своего
бойца более устойчивым к oneshot'ам и вы побудите! Может быть лучше всего будет
атаковать хорощим сканером с некоторой защитой от oneshot'ов: большими
decoy, предзагрузкой, раскраской памяти, итп

Впрочем, "камни"/импы и "камни"/"бумаги" должны тоже справиться неплохо, если
хорошо их спроектировать. Мы покажем как сделать таких бойцов вскоре! Наш
репликатор из этого номера не влез на холм, потому-что у него не было никакого
противодействия imp`ам, и также не было qscan`а.
Мы расскажем про это позже. Попробуйте проанализирвовать и улучшить нашего бойца.
Это будет хорошим упражнением. По окончании, попробуйте влезть на 94b холм. И
помните: главное - стратегия: кого мы хотим побить этим бойцом? Где мы хотим
заработать очки для входа?... Итп.
Больше в следующем выпуске CoreExplorer. Оставайтесь с нами.


Состояние 94b холма @ SAL:
#   %W    %L    %T    Имя              Автор           Очки   Возраст
1   42.8  38.9  18.3  Dragonfly        S.Fernandes     146.7  1
2   40.3  42.0  17.7  test             Andreas Scholta 138.7  3
3   39.9  41.6  18.6  Svarog           Nenad Tomasev   138.1  104
4   30.3  24.1  45.7  Yatima v2.0.5    Jens Gutzeit    136.4  72
5   39.0  42.8  18.2  Xenocitrum_v0.8  inversed        135.3  16
6   27.0  19.2  53.9  D'n'B [v0.3]     inversed        134.7  8
7   38.4  42.8  18.8  Unknown          Neo             133.9  190
8   38.2  43.1  18.6  think twice v.2  el kauka        133.4  45
9   40.3  47.4  12.4  Star             Sascha Zapf     133.2  235
10  23.5  14.3  62.2  Snare_Rush_v0.7  Inversed        132.8  9
11  28.8  25.3  46.0  The Silent Death Anonymous       132.2  86
12  25.4  20.7  53.8  stealthbomb      Fizmo+Neutrino  130.1  103
13  26.8  23.5  49.7  Blotter          inversed        130.1  5
14  37.2  44.6  18.3  Blindfolded      Miz             129.8  14
15  26.9  24.5  48.7  Tom              David Moore     129.3  218
16  28.0  26.8  45.2  3[sm]md v0.2     inversed        129.1  2
17  36.4  45.6  18.1  dx42e            inversed        127.2  12
18  24.1  21.2  54.7  Barkosta[v0.3]   inversed        126.9  18
19  22.7  20.0  57.3  Enigma 2.1       brx/Roy         125.3  200
20  33.7  42.2  24.1  Spark_v0.4       inversed        125.2  21
21  20.7  16.4  62.9  Everybody must.. madjester       125.0  140
22  22.0  19.3  58.7  Biomass_v0.8     inversed        124.7  19
23  23.0  21.7  55.3  Envane [v0.5]    inversed        124.2  7
24  19.8  16.6  63.5  Break Down and.. Jens Gutzeit    123.0  73
25  31.7  42.3  26.1  bloodhunter      elkauka         121.0  4
___________________________________________________________________
Вопросы? Статьи? Предложения? Комплименты? Пишите нам!
Авторы: Nenad <tomasev at nspoint.net>
        Roy <roy dot van dot rijn at gmail>
        Jens <jens at jgutzeit dot de>



----
 Перевёл yGREK heretix <ygrekheretix at gmail dot com>
 30/10/2005