.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 http://vyznev.net/corewar/guide.html - Steve Bailey's Guides http://corewar.co.uk/sgb.zip - Phillip Kendall http://www.srcf.ucam.org/~pak21/corewar/resource.html - The Core Warrior http://www.corewar.info/corewarrior/corewarrior.htm - Steve Morrell http://www.koth.org/info/chapter1.html - Corewar Lexiсon http://www.corewar.info/lexicon - Fizmo's CoreWar site http://www.corewar.info - John Metcalfs Library http://corewar.co.uk/library.htm - KOTH.org (Info Section) http://www.koth.org/info.html - rec.games.corewar (+FAQ) http://groups.google.com/group/rec.games.corewar Также 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 Roy Jens ---- Перевёл yGREK heretix 30/10/2005