День 8. Отладка игры Жизнь

День 8. Отладка игры Жизнь

Советы М.Максимова. Свои замечания на эссе Михаила. Работа с локальными переменными. Макросы.

Сегодня на сайте SP-Forth нашел ссылку на статью в форуме в которой Михаил Максимов, за что ему отдельное спасибо, дает некоторые рекомендации по преодолению тех проблем, с которыми я встретился и описал в этом дневнике.

Некоторые из них уже стали не актуальными, а с другими стоит подразобраться. Насчет параметров цикла DO ... LOOP согласен, расположение, их рационально. Действительно, параметр ДО чаще требуется менять .

Книгу С.Н. Баранова, Н.Р.Ноздрунова скачал, чуть позже почитаю.

Вспомнил, что вчера при написании игры большой объем ошибок составляли операции манипулирования данными на стеке. Я их либо неправильно располагал, либо ошибался в действиях операторов. Еще много уходило времени на "рисование" стековых диаграмм. Появилась мысль – объединить стековые диаграммы с операторами манипулирования данными на стеке. Вообще, такая мысль появилась довольно давно. Пока пришло два варианта:

Хм, перечитал советы Максимова – есть еще вариант с локальными переменными. При первом знакомстве, вроде бы неплохая мысль, но после вчерашнего случая с библиотекой quick-swl2.f я как-то осторожно стал относится к расширениям...

Экономические проблемы Forth

Это Михаил (я, надеюсь, мне он простит некую фамильярность в публичных материалах) отослал к своему эссе в ответ на мои замечания о разнобое организации папки devel/ и малочисленных примеров, скудной документации.

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

Мне всегда хотелось, чтобы мне платили – без комментариев, все это хотят, в явном или не явном виде :)

... мне платили за реализацию своих идей – абсолютный неверный предпосылка! Карл Маркс в Капитале, конечно лучше и обстоятельнее, это объясняет. Но если, кратко, платеж – это окончателный акт операции обмена. Т.е. я, как покупатель, получаю то, что МНЕ нужно. Если же, Михаил, имеет в виду, реализацию идей Заказчика, то ... это и так давно в современном мире существует. Но, вообще, фраза выстроена не достаточно точно...

Этот подход позволяет сносно существовать крупным компаниям... – это правильный подход, и его нужно придерживаться в любом более или менее нормальном проекте. Все равно, по мере развития прийдешь к таком положению вещей. Так зачем изобретать это заново?

требуются не столько новаторы сколько специалисты... – именно! если мы говорим о реализации идей, потребностей Заказчика. Да, да, много раз да! В коммерческой работе, в работе за деньги, нет места творческим вздохам – есть сроки, есть требования и их нужно выполнять! Нужна стабильно работающая команда. Любой руководитель предпочтет стабильно работающих середнячков некоему гению, но с которым сложно что-либо спрогнозировать... И дальше пошли неверные выводы.

Значительные затраты уходят на рекламу... – поэтому их и покупают. А кто знает сейчас о Forth ?

Разработчики скрывают материал, который может быть полезен для дальнейших разработок – не всегда и не везде. Как пример, посмотрите по этому дневнику, как я пытался разобраться/ использовать чужие наработки. Вроде и не дурак, и не первый год программы создаю, а вот все заканчивается изобретение свого лосипеда... Вспомним, движение Open Source – достаточно мощное. Ой, сильно неправ здесь Максим.

При эволюционном развитии ИП совершенствуется проходя из рук в руки. Таким образом, я определяю понятие эволюционного развития ИП. Разработчики, при этом действуют по собственной инициативе и может делать с ИП все что хотят, результат их работы полностью открыт. – или сей документ был писан давно или Михаил явно не знаком с идеологией Open Source. Его этот посыл повторяют одну из центральных идей этого движения. Грустно, создается впечатление, что дальше будет попытка изобрести уже изобретенное. Еси, не ошибаюсь, Михаил из научных кругов. Там есть очень хороший принцип при создании чего-либо: сначала изучить все что было сделано до тебя по этой теме, провести их анализ, а потом, на основе проведенного анализа предлагать свое.

Солидные компании берутся за реализацию только тех идей, которые достигли определенного уровня эволюционного развития. – блин, ну известные вещи все это: стратапы, инкубаторы...

Я считаю неправильным, хорошего новатора отвлекать на оформление своих идей. Пусть он их представляет в том виде, в котором ему удобно, а оформлением пусть занимается тот, кто умеет это хорошо делать. – это то что я чуствую постоянно в Forth . Первое, это чистейшей воды снобизм. Второе, криво оформленая идея умрет со своим же новатором. Вы сомневаетесь во мне как в новаторе? Я тоже придумываю массу интересных вещей, зачем мне чужие изобретения да еще копаться в этом? За деньги? Вот мы и пришли к крупной компании, от которой Михаил и собирался уйти. Утопия, чистейшей воды утопия. Как наглядный пример посмотрите становление геометрии Чебышева. Очень полезно.

неправильное понимание замыслов автора может означать появление новой идеи – верно подмечено.

Отдельным этапом является декларирование и рекламирование. – ню, ню ... и как же собираетесь рекламировать, если не можете Это даже не описано?

В предлагаемой мной системе, никто ничего не должен. – GPL, Freeware и иже с ними.

Выставил я три продукта на http://www.plati.ru/asp/seller_goods.asp?id_s=12195 Есть не просят. Вся услуга бесплатна. – и о них никто не знает. Зашел, посмотрел, толкового описания нет, чего и как тоже, зато денег просят. Небольших, но просят – а это уже коммерческие отношения, и жить в коммерческом мире нужно по его же законам.

В качестве вывода. У меня сложилось мнение, что Михаил и сам не верит в то, что написал. Замечу также (наверное, это прописная истина), отношение к вашим работам у других будет не лучше чем у вас к ним же. Если вы пренебрежительно относитесь к ним, то остальные их ладе рассматривать не будут. А первым впечатлением об отношении автора к своей работе является ее оформление...

Дальнейшее отлаживание игры

Быстро выяснилось, что ошибка была в определении относительной координаты элемента: ординату элемента я умножал на высоту матрицы вместо ширины. Исправил, на примере слова ЭлМатрицы

: ЭлМатрицы  ( х у адрМатр )    \ координаты начинаются с 0 !!!
  ...........
   2 PICK ШиринаМатрицы * + \ преобразовали двумерные координат в одномерные
  ...........
;

Следующий блок ошибок, содержаляс в фрагменте проверки выхода координат за дипазон в слове =ЭлМатрицы – не до конца очищался стек, поэтому в нештатных ситуациях стек рос, и это приводило к ошибкам.

Но программа все равно толком не работала – заполнялось полполя по горизонтали. Искал ошибку долго. Очень долго. В основном это было вызвано неочевидностью стековой нотации, и, соответсвенно, приводило к разночтению меня и компилятора. Поэтому ушло много времени на согласование стековой нотации между тем ЧТО мне нужно было и тем ЧТО получалось.

Ошибка была логической, в двойном цикле

 DUP ВысотаМатрицы 0 DO
 DUP ШиринаМатрицы 0 DO
        I J 2 PICK ЭлМатрицы .
 LOOP
 LOOP

я считал, что I – это высота матрицы, а J – ее ширина. А на самом деле все наоборот. I – это индекс самого внутреннего цикла, т.е. в данном случае это позиция элемента в строке матрицы, абцисса!

И вот в каждом слове, мысленно делаешь подстановку "I – это абсцисса". Понятно, что так недалеко и до ошибки, что и было в самом деле.

Исправил. Все заработало как и хотелось... Блин, но сколько времени ушло.

Решил попробовать переписать слова ЭлМатрицы и =ЭлМатрицы с использованием локальных переменных, как советовал Михаил.

Просто супер. Заметно ускорило написание программы. Избавляет от очистки стека. Особенно, за слежением за его состоянием. Улучшает читабельность листинга. Это то, что мне хотелось. Нужно включить это по умолчанию в spf.ini

\ Библиотека работы с локальными переменными
 REQUIRE { lib\ext\locals.f

Нашел в файле samples\ans\chess.f простой макрос и ниже как его использовать. Разобрался с ним быстро.

\ Wil Baden implements wbMACRO for portably inlining code
: wbMACRO  ( "name  ccc" – )
  : CHAR PARSE  POSTPONE SLITERAL  POSTPONE EVALUATE
  POSTPONE ; IMMEDIATE ;

\ Пример его использования wbMACRO хМатр " I"

Правда, какие-то ссылки на макросы я встречал в справке, но что-то я не понял как их использовать.

В итоге, библиотека для работы с матрицами заметно упростилась и приобрела следующий вид. Это с применением локальных переменных и макросов.

 REQUIRE { lib\ext\locals.f  \ подключил расширение для работы с локальными переменными

: СоздатьМатрицу { ширин высот адрМатр \ адрПамяти } \ ширин и высота -- кол-во элементов, поэтому отсчет 1! адрМатр @ 1000 > IF \ Освобождение памяти, если есть указатель - адрМатр @ FREE \ какое-то относит. большое положит. число THEN

высот 1 < IF 1 -> высот THEN ширин 1 < IF 1 -> ширин THEN

ширин высот * 1+ \ получили длину + 2 ячейки под размер матрицы CELL * \ Получили длину в байтах ! ALLOCATE IF 0 адрМатр ! \ если не удалось выделить память -- выход, и нулевой адрес EXIT THEN -> адрПамяти

ширин адрПамяти ! \ сохранил ширину матрицы высот адрПамяти CELL+ ! \ сохранил высоту матрицы адрПамяти адрМатр ! \ сохранил адрес матрицы в переменной ;

: ШиринаМатрицы ( адрМатр ) @ \ получил адрес памяти матрицы @ \ только теперь ширину ; ( шир )

: ВысотаМатрицы ( адрМатр ) @ CELL+ @ ; ( выс )

: ЭлМатрицы { х у Матр } \ координаты начинаются с 0 !!!

х 0< IF 0 EXIT THEN \ Проверка вхождения в диапазон х Матр ШиринаМатрицы 1- > IF 0 EXIT THEN у 0< IF 0 EXIT THEN у Матр ВысотаМатрицы 1- > IF 0 EXIT THEN

у Матр ШиринаМатрицы * х + \ преобразовали двумерные координат в одномерные 2+ \ с учетом 2-х служебных ячеек CELL * \ получили адрес элемента относит блока памяти Матр @ \ адрес блока памяти + @ \ абс. адрес элемента и его значение ;

: =ЭлМатрицы { знач х у Матр } \ координаты начинаются с 0 !!!

х 0< IF EXIT THEN \ Проверка вхождения в диапазон х Матр ШиринаМатрицы 1- > IF EXIT THEN у 0< IF EXIT THEN у Матр ВысотаМатрицы 1- > IF EXIT THEN

знач у Матр ШиринаМатрицы * х + \ преобразовали двумерные координат в одномерные 2+ \ с учетом 2-х служебных ячеек CELL * \ получили адрес элемента относит блока памяти Матр @ + \ адрес блока памяти ! \ запоминаю его значение ;

\ Wil Baden implements wbMACRO for portably inlining code : wbMACRO ( "name ccc" – ) : CHAR PARSE POSTPONE SLITERAL POSTPONE EVALUATE POSTPONE ; IMMEDIATE ;

wbMACRO ПереборВсехЭлМатрицы " Матр ВысотаМатрицы 0 DO Матр ШиринаМатрицы 0 DO" wbMACRO _ПереборВсехЭлМатрицы " LOOP LOOP" wbMACRO хМатр " I" wbMACRO уМатр " J"

: ОчиститьМатрицу { Матр } ПереборВсехЭлМатрицы 0 хМатр уМатр Матр =ЭлМатрицы _ПереборВсехЭлМатрицы DROP ;

: ПоказатьМатрицу { Матр } ПереборВсехЭлМатрицы хМатр уМатр Матр ЭлМатрицы . LOOP CR LOOP ;

\ --------------- Тестирование --------------- USER A

20 10 A СоздатьМатрицу

\ A ШиринаМатрицы . \ A ВысотаМатрицы . 4 1 1 A =ЭлМатрицы 1 1 A ЭлМатрицы

A ОчиститьМатрицу A ПоказатьМатрицу

Потихоньку продвигается изучение. Как и слюбым другим языком, методом проб и ошибок, отладкой своих программ. Листание чужих листингов. Не быстрее, но и не сложнее других языков. Были случаи и по жестче. Толковая книжка, руководство заметно бы облегчили жизнь.

<<< Предыдущий Начало   Следующий >>>
Copyright © Alex Furashev 2004

При цитировании, ссылка на оригинальный текст обязательна. Допускается копирование материалов только целиком, без внесения каких-либо изменений в оригинальный текст, меняющих смысл, структуру материала и проч.

Hosted by uCoz