WarCraft 3: Осваиваем jass (0-1)

Осваиваем jass (0-1)
» Раздел: Основы

0. Вступление

Этот цикл статей посвящен изучению языка jass (создание текстовых триггеров, так называемых скриптов). Хотя про jass уже написано достаточное число статей, но многие картостроители все равно не желают его изучать. И я их вполне понимаю – для тех, кто не занимается программированием в тех статьях, которые имеются, разобраться довольно сложно. Не хватает некоторых базовых знаний, не понятно, с чего начинать и т.д.
Любой учитель знает, что излагать предмет надо поэтапно и в определенной последовательности. Я выбрал последовательность в том порядке, в котором сам когда-то начал осваивать язык jass. Так что триггерщики, которые до сих пор не решаются приступить к изучению jass, смогут проделать тот же путь.
Эти статьи я написал для одного своего друга триггерщика. И друг вполне оправдал мои ожидания - не прошло и месяца, как он стал jass-ером.
Для удобства, я буду обращаться в статьях к читающему – «Читатель». Надеюсь, что читатель уже неплохо овладел триггерами, знает, что такое переменные, массивы и циклы.
Содержание:
  1. Вступление
  2. Что есть jass и для чего он нужен
  3. Локальные переменные
  4. Применение локальных переменных
  5. Условия, циклы в jass
  6. Функции на jass
  7. Устройство триггера с точки зрения jass
  8. Динамическое создание триггера
  9. События с малым периодом
  10. Полярные координаты (ликбез)
  11. Оптимизация: утечки памяти
  12. RETURN BUG (RB)
  13. Тип Handle
  14. Система Super Custom Value (SCV) или RB+cache
  15. Да здравствует SCV!
  16. Послесловие
  17. Приложение 1: проблемы Кеша и РБ
  18. Приложение 2: JESP стандарт
Осваиваем JASS - исправления и дополнения - также рекомендуется для ознакомления.

1. Что есть jass и для чего он нужен

Итак, Читатель, мы приступаем к освоению jass. Прежде всего, я хочу, чтобы ты понимал, что jass не является чем-то сверхъестественным и необычным. Многое, из того, что нам предстоит изучить уже будет знакомо по триггерам. И неудивительно – ведь каждое триггерное действие имеет свой аналог на jass.
Дело в том, что blizzard создали свой миниязык программирования jass. Они хотели упростить работу по программированию сценариев и их правил. Но даже такой упрощенный язык слишком сложен для многих картостроителей. Поэтому был создан редактор Trigger editor – где вместо того, чтобы набирать команды вручную, можно создавать триггеры путем выбора команд из списка. В редакторе мы работаем с триггерами, но когда игра запускает определенный сценарий, она читает не триггеры, а КОД, который создается путем перевода всех триггеров игры на язык jass.
По сути триггеры – это надстройка для языка jass упрощающая ввод команд. Но при любом упрощении происходит потеря функциональности. Т.е. возможности программирования игры триггерами в чистом виде заметно меньше, чем при программировании при помощи jass.
Итак, jass дает картостроителю новые возможности. Но стоят ли они того, чтобы их изучать? Это уже каждый картостроитель решает для себя. Jass может помочь в следующих случаях:
  1. Упростить создание сложных триггеров и триггерных систем, которые позволят полностью или почти полностью поменять правила оригинальной игры.
  2. Создавать триггерные заклинания, у которых нет аналогов в оригинальной игре.
  3. Оптимизировать карту, сделать, чтобы сложные триггеры не тормозили игру.
  4. Вставить на карту некоторые команды на jass, которые не имеют аналогов для обычных триггеров.
  5. Создавать собственные AI, более гибкие, чем в редакторе AI.
У некоторых бытует мнение, что на jass в игре можно сделать все. Конечно же, это не так. Более того, я не рекомендую писать все триггеры сценария исключительно на jass. Для многих задач редактор триггеров подойдет лучше – ведь это действительно очень удобная штука.

Просмотров: 82 073



» Лучшие комментарии


Reform #101 - 4 года назад 4
Спасибо за статью, очень помогла :)
theleon #102 - 4 года назад -7
привет нужно помощь помоги((((((((. я, снимал защиту map naruto chronicle 1.1.b. когда открыл эту карту с помощью jass new gen pack пишет: "эта карта была создана в другой версии Редактора warcraft3. она может содержать данные неподдерживаемые в этой версии. продолжить загрузку?"
Если продолжу карта открывается в Редактор warcraft 3 но когда сохраняешь карту она в игре не запускается даже тогда когда не чего не изменяя сохраняешь в этом программе!!! не работает помоги если сможешь. за ранее спасибо)))))))))))))))))
nvc123 #103 - 4 года назад 1
theleon, это статья про джасс а не про то как карты ломать
а если уж на то пошло то надо перед тем как в редакторе открывать, ручками с архивом поработать
theleon #104 - 4 года назад 0
спасибо бро!!! я карту не ломаю проста хорошая карта но нет суди и зрителя хочу добавить помоги еще чем сможешь!!! форум классная быстро отвечает и хороший советы))))
респект)))))))))
nvc123 #105 - 4 года назад 1
theleon, это не форум
и почитай правила, а то после
хороший советы
возникли вопросы по твоему знанию русского языка
и для вопросов есть модуль Q/A
Audes #106 - 4 года назад 2
Лучшая статья по WE!
gox69 #107 - 3 года назад 1
Как сделать инвентарь больше 6 слотов?
nvc123 #108 - 3 года назад 0
gox69, полноэкранный?
ну сначала пишем структуру инвентарь
потом структуру слот(юзаем динамичную текстуру)
потом структуру тип итема
потом взаимодействие между ними
потом создаём экземпляры этих структур в нужных количествах
всё
инвентарь готов
Это сообщение удалено
Singularity #110 - 4 месяца назад 12
Людей, которые делают свои первые шаги в освоении скриптового языка JASS, часто направляют именно сюда. Решил посмотреть, почему. Разочаровался.
Автор, это же одно из несущих руководств сайта по обучению JASS. Это - первое, что предстаёт взору начинающих JASS-скриптовальщиков. А качество у него ниже среднего. Не подумайте, пожалуйста, что я придираюсь. Цель моих замечаний только в том, чтобы помочь улучшить данный материал.
Сейчас я поведу речь только о секции 0-1 (далее - статья), то есть конкретно о данной части рассматриваемого цикла статей.
Заметки на полях:
» Осторожно, много текста!
  1. На протяжении всей статьи автор предпочитает писать "JASS" маленькими буквами. Регистр букв вносит понимание того, что речь идёт об аббревиатуре. То есть, для правильной подсознательной передачи смысла стоит писать не jass, не Jass, а именно JASS. Повторюсь - грамотное написание облегчает восприятие. Любопытный факт - в заголовке официальной статьи о JASS в Википедии аббревиатура не написана в верхнем регистре. Во всех прочих местах статьи написание аббревиатуры верное.
  2. Нигде во вводной части статьи не сказано о том, что JASS расшифровывается как Just Another Scripting Syntax ("Ещё Один Синтаксис Скриптования"). На русский язык аббревиатура JASS переводится как ЕОСС, но так как заимствование английского сокращения гораздо привычнее как в рамках этого сайта, так и в рамках некоторых других сообществ, имеющих WarCraft III в списке своих тематик, мы просто оставим англоязычную аббревиатуру JASS.
  3. Совсем нелишне будет добавить словарик "сленга" (специфических терминов среди тех, кто использует JASS). Далеко не каждый знает, что такое:
    • Джассер (джасскодер, скриптер, кодер) - человек, знающий и умеющий применять JASS.
    • Сетить (реже - ассигнить) - присваивать значение какой-либо переменной.
    • ЯП - аббревиатура от словосочетания "язык программирования".
    • Гуй (гуи, триггер) - графический интерфейс для работы с JASS. Сленговое определение возникло из англоязычной аббревиатуры GUI (Graphical User Interface), которая переводится как "Графический интерфейс пользователя" как в данном (относительно JASS), так и в общем контексте (в программировании в целом это общепринятый термин).
    • Компилировать (сейвить, собирать, компилить) - обычно означает сохранять карту для дальнейших проверок работоспособности кода, написанного на JASS. Общее определение компиляции как подготовки кода для обработки процессором сюда не подойдёт, так как JASS работает через посредника - он инструктирует движок, на котором написан WarCraft III, как нужно использовать свои функции, а уже сам движок работает непосредственно с процессором. Таким образом, компиляция JASS - это подготовка кода для корректной работы с движком WarCraft III. Не от всего защищает, правда, но это уже другая история, требующая более детального разбора языка.
    • Нативки - функции JASS, которые перечислены в файле common.j: эти функции обращаются к функциям ядра WarCraft III напрямую, без привлечения дополнительного кода JASS. Эти функции используются большинством других, которые написаны пользователями (исключая, разумеется, функции, где используется только арифметика) и являются основой JASS.
    • БЖ - функции JASS, которые перечислены в файле blizzard.j (отсюда и название - BJ или БЖ): подавляющее большинство этих функций активно используют нативки. Некоторые из этих функций действительно полезны и являются дополнительным облегчением нелёгкого труда программиста, другие являются "дубликатами" нативок (БЖ-функция называется так же, как и нативка, которая в ней содержится, с добавлением приставки BJ, иногда с небольшими изменениями аргументов). Из-за того, что большинство БЖ-функций не умеют правильно работать с памятью, их ругательно называют говнокодом. БЖ-функции были изначально созданы для адаптации нативок к GUI (редактору триггеров), чтобы несведующему картоделу было легче разобраться в сути инструкций, которые предоставляет JASS. Небольшой пример - в GUI работа с цветами и альфа-каналом для облегчения восприятия осуществляется в процентах (интенсивность цвета задаётся от 0% до 100%), в то время как нативки работают с целочисленными значениями от 0 до 255 по компьютерному стандарту представления цветов, который известен большинству программистов из школьного курса информатики. Одни ветераны JASS-фронта рекомендуют отказаться от использования BJ-функций вообще, другие - внимательно смотреть их содержание. Сам отношусь к последним.
    • Начинка - содержание той или иной функции.
    • Обнуление (реже - нуллификация) - очистка значения переменной-ссылки (типа, сводящегося к типу handle), то есть присвоение ей значения null.
    • Кастом (реже - КС или CS) - понятие, означающее Custom Script (пользовательский код). Это понятие больше относится к GUI, поскольку означает прямое прописывание строки JASS без конвертации всего триггера в код. Назван по одноимённой функции в арсенале GUI Варкрафта.
    • Хендл - любой сводящийся к handle тип переменной в JASS (коих 99%, существует только 4 нехендловых типа переменных: integer, real, boolean, string). В силу своей природы и страсти к засорению памяти (к сожалению, сборщик мусора в JASS не реализован), программистам напоминают о необходимости чистки кода, то есть ручном удалении хендлов после их использования. Сленговое понятие возникло из названия родительского типа handle и является его транскрипцией на русский язык.
    • Хардкод - код, вшитый в ядро, содержание которого мы не можем посмотреть. Зачастую является причиной непонятных вещей в работе программы, потому что программист, увы, не может узнать, что находится за стеной, которой программисты намеренно отделили исходный код ядра от пользователей JASS. Мы не знаем, как код работает с памятью - можем только догадываться. Поэтому хардкод наиболее рационально трактовать как часть кода, скрытая от глаз программиста в каких-либо целях.
    • Утечки - использованные, ненужные, но не очищенные из памяти объекты, приводящие к падению производительности кода. Начинающие JASS-программисты часто добавляют сюда и понятие висячих ссылок, что неправильно, потому что утечка памяти и висячая ссылка - разные вещи.
  4. Думаю, нет необходимости дважды писать содержание статьи. Тем более, что верхнее кликабельно.
  5. Ссылка Осваиваем JASS - исправления и дополнения не кликабельна. Скорее всего, статья настолько старая, что помнит ещё эру XGM.RU (известно из истории сайта).
  6. Не бойтесь ссылаться на источники. Смело давайте ссылки на то, что позволит читателю больше узнать об используемом термине. Взять, к примеру, вот этот абзац:
Дело в том, что blizzard создали свой миниязык программирования jass. Они хотели упростить работу по программированию сценариев и их правил. Но даже такой упрощенный язык слишком сложен для многих картостроителей. Поэтому был создан редактор Trigger editor – где вместо того, чтобы набирать команды вручную, можно создавать триггеры путем выбора команд из списка. В редакторе мы работаем с триггерами, но когда игра запускает определенный сценарий, она читает не триггеры, а КОД, который создается путем перевода всех триггеров игры на язык jass.
Эту кучу текста можно сделать намного лаконичнее, вот таким образом:
Для того, чтобы сделать создание карт для WarCraft III более гибким, компания Blizzard Entertainment, создавшая эту игру, также произвела на свет простой событийно-ориентированный язык программирования JASS. В процессе сборки и сохранения карты World Editor проверяет, может ли игра корректно обработать написанный код. Если запуск проверяемого кода не представляется возможным, карта в игре не будет запущена.
Чтобы сэкономить создателям карт время сборки и потраченные нервы на отладку, Blizzard также разработала графический интерфейс для JASS. В редакторе его называют Trigger Editor (редактор триггеров). Если Вы - совсем новичок и делаете первые шаги в долгой, но увлекательной дороге картостроителя и до этого не имели дела с программированием, рекомендую начать своё обучение именно с ознакомления с редактором триггеров, потому что это заметно облегчит знакомство с JASS и его освоение.
Заметьте - несмотря на то, что текста больше, читается он намного легче. Присутствие ссылок на другие ресурсы (как в пределах XGM, так и на общепринятые (Википедия и т.п.)) подчёркивает то, что статья написана человеком, разбирающимся в вопросе, компетентным, ссылающимся на другие материалы ради облегчения восприятия.
  1. Гораздо лучше будет оформить плюсы JASS по сравнению с GUI. То есть сделать сводную таблицу. Посмотрите, как её сделали разработчики Discord. Такое сравнение в разы облегчит восприятие - читатель любит смотреть таблицы и картинки, когда сравниваются различные варианты.
    Стоит заметить, что разметка txt2, которую использует сайт, поддерживает вставку таблиц. Эту функцию здесь можно применить по назначению.
  2. У меня (как у читателя) сложилось ощущение, что автор не писал план содержания статьи заранее, а дописывал его уже по ходу дела. В результате из оглавления получился кавардак. По существу для общей статьи ознакомления с ЯП JASS из него потенциально полезны только разделы 0, 1, 2, 3, 4, 5, 6, 10, 12, 15. Разделы 2 и 3 по факту можно соединить в один раздел о локальных переменных.
    Между разделами должна наблюдаться связь. Один раздел должен вытекать из другого (либо все остальные разделы должны вытекать из первого). К примеру, при описании преимуществ JASS стоит выделить создание локальных переменных (отсылка к разделу 2-3), доступность большего количества типов для работы с ними (в особенности с типом trackable, для которого поддержка в GUI не предусмотрена), больше возможностей для удаления висячих ссылок (отсылка к разделу 10) и многое другое.
  3. Статья завершается вредным советом. Мне это показало, что автор сам не понимает, чего он хочет - открыть читателю, что такое JASS, или сказать, что JASS неповоротлив и сидеть в графическом редакторе лучше (неправда!) . Задача курса о JASS - мотивировать читателя научиться работать с JASS, с более глубоким уровнем программирования карт, нежели использование графического редактора; дать читателю понять, что было упрощено при помощи GUI.
    Автор, Ваша правда, на JASS невозможно сделать с WarCraft III всё, что угодно. Однако, JASS открывает максимальный потенциал World Editor'a. Скажем, создать такую карту, как Гран-при Азерота, одними лишь средствами GUI было бы крайне затруднительно - карта бы не была такой производительной без прямого использования JASS. Порекомендуйте читателю посмотреть исходник этой карты - там найдётся много интересного. У читателя появится мотивация разобрать этот исходник. Доверять Вам они будут из-за того, что карта сделана Blizzard - разработчиками игры, причём для демонстрации возможностей JASS. А Ваш цикл статей должен помочь в этом.
  4. Собственный гибкий AI можно строить и на GUI (есть необходимый функционал). Рифма получилась непреднамеренно... Это не является преимуществом JASS.
  5. Следите не только за подачей материала, но также за орфографией и пунктуацией (увы, здесь она уже столько лет - если верить сайту, с 2005 года, хромает).
Пока что по моим критериям оценивания эта статья заслуживает минус. Изменю свою оценку с повторным рецензированием, если автор поработает над ней кропотливее.
Успехов Вам в нелёгком труде написания статей, а читателям - в освоении материала!
Singularity, 16.06.2017
ZlaYa1000 #111 - 4 месяца назад 5
Singularity, прошло 12 лет) Достаточно субъективное мнение, надо бы чтобы кто-то отрецензировал и дополнил статью действительно.
Singularity #112 - 4 месяца назад (отредактировано ) 8
ZlaYa1000:
Singularity, прошло 12 лет) Достаточно субъективное мнение, надо бы чтобы кто-то отрецензировал и дополнил статью действительно.
Не претендую ни на последнюю инстанцию, ни на абсолютную истину, но... Срок давности никак не отменяет тот факт, что новичков сюда действительно посылают и они получают информацию в таком виде. Скорее, прискорбно, что вот уже 12 лет происходит такая несуразица. За 12 лет, несмотря на востребованность, статью не редактировали и не дополняли.
Если есть необходимость, могу найти время и оказать посильную помощь в улучшении этого цикла статей, в чём-то уже не актуального (к примеру, Return Bug был исправлен в патче 1.24).
Процветания и развития вашему ресурсу!
Singularity, 16.06.2017
AlexSan #113 - 4 месяца назад -2
Звучит больше как придирки, особенно пункты №1, 2, 4 и 6.
А вот со словариком я согласен, в свое время меня это немного сбивало с толку.
ZlaYa1000 #114 - 4 месяца назад 2
Singularity, это было бы полезно, но делать это нужно в связке с nvc123, который знает многие тонкости и имеет необходимые доступы. Напишешь ему?
Singularity #115 - 4 месяца назад (отредактировано ) 2
AlexSan:
Звучит больше как придирки, особенно пункты №1, 2, 4 и 6.
А вот со словариком я согласен, в свое время меня это немного сбивало с толку.
Знал, что буду так воспринят, поэтому заранее попросил прощения за расхождение в наших мировоззрениях. Меня учили думать, прежде чем делать.
Насчёт пунктов, воспринятых придирками:
  1. Лично Вам как было бы понятнее, если бы вы не знали смысла: ToEFL, toefl, TOEFL? Последнее больше подсознательно воспринимается как аббревиатура. И это просто личное наблюдение. Простите за граммар-нацизм, но искоренять это - моя обязанность.
  2. А разве плохо дать читателю знать, с чем он имеет дело? На разных ресурсах есть любители раздела Trivia (на русский язык переводится как "Это интересно"). Расшифровка аббревиатуры JASS относится именно к нему.
  1. Если бы Вы сдавали экзамен и Вам дали бы заполнять тест двойного объёма от обычного, неужели Вы не сказали бы, что совершена ошибка?
  1. Литературный и разговорный язык всё-таки вещи разные, согласитесь.
ZlaYa1000:
Singularity, это было бы полезно, но делать это нужно в связке с nvc123, который знает многие тонкости и имеет необходимые доступы. Напишешь ему?
Сначала нужно немножко освоиться в разделе, почитать и вывести сильные и слабые стороны статей. Так будет продуктивнее и будет меньше наслоений.
Singularity, 16.06.2017
AlexSan #116 - 4 месяца назад -4
Singularity:
AlexSan:
  1. Лично Вам как было бы понятнее, если бы вы не знали смысла: ToEFL, toefl, TOEFL? Последнее больше подсознательно воспринимается как аббревиатура. И это просто личное наблюдение. Простите за граммар-нацизм, но искоренять это - моя обязанность.
В случае который ты привел тут, лучше последний вариант (все в верхнем регистре). Но в случае с jass'ом, как мне кажется лучше все таки использовать нижний регистр, так как расшифровка не несет особой нагрузки.
  1. А разве плохо дать читателю знать, с чем он имеет дело? На разных ресурсах есть любители раздела Trivia (на русский язык переводится как "Это интересно"). Расшифровка аббревиатуры JASS относится именно к нему.
Мне просто всегда казалось что на эту статью человек приходит с мыслью "Нужно подучить jass", но не с мыслью "Хммм, а что это такое".
Вот в какой-то статье типа "Осваиваем редактор карт. Возможности и общее знакомство." такая инфа была бы очень даже к месту.
  1. Если бы Вы сдавали экзамен и Вам дали бы заполнять тест двойного объёма от обычного, неужели Вы не сказали бы, что совершена ошибка?
Кривая аналогия. Тем более что тут первое содержание играет роль навигации и присутствует во всех статьях цикла, а второе лишь как оглавление и показывает читателю, который уже начал читать и вошел в поток, что вообще ему может этот цикл статей дать.
  1. Литературный и разговорный язык всё-таки вещи разные, согласитесь.
Да, разный. Но разговорный все таки менее формален, и, как мне кажется, воспринимать новый материал в неформальной подаче в духе "вот давай я тебя сейчас все объясню" гораздо легче чем в форме статьи с википедии.
Да и в конце концов статья написана от лица автора, а не как абстрактная энциклопедическая статья.
Singularity #117 - 4 месяца назад (отредактировано ) 2
AlexSan:
Предлагаю не разводить флуд (тем более, флейм) на эту тему, такой спор может длиться вечно и истина в нём вряд ли родится. А вот оставить оба наших мнения здесь будет хорошо: тот, кто прочитает их, будет иметь более разносторонний взгляд на эту статейку.
В случае который ты привел тут, лучше последний вариант (все в верхнем регистре). Но в случае с jass'ом, как мне кажется лучше все таки использовать нижний регистр, так как расшифровка не несет особой нагрузки.
Несёт. Она показывает, что это Scripting Syntax, хоть он и Just Another. Смысл в себе несёт всякая аббревиатура, но не все его замечают.
Мне просто всегда казалось что на эту статью человек приходит с мыслью "Нужно подучить jass", но не с мыслью "Хммм, а что это такое".
Вот в какой-то статье типа "Осваиваем редактор карт. Возможности и общее знакомство." такая инфа была бы очень даже к месту.
Как бы так сказать... JASS - это JASS, это отдельная часть редактора карт. Общее знакомство не скажет о нём ничего больше общего обзорного определения, а затем предложит прочитать данный цикл статей по JASS.
Сам пришёл на эту статью с мыслью "Что же это такое по мнению автора? Может, есть, чему научиться?"
Кривая аналогия. Тем более что тут первое содержание играет роль навигации и присутствует во всех статьях цикла, а второе лишь как оглавление и показывает читателю, который уже начал читать и вошел в поток, что вообще ему может этот цикл статей дать.
Первое, по большому счёту, объединяет в себе оба вышеуказанных смысла. Не лучше ли будет тогда написать в "теле" статьи что-то вроде: "Прочитав этот цикл статей, вы освоите то-то, то-то, то-то и то-то"?
Да, разный. Но разговорный все таки менее формален, и, как мне кажется, воспринимать новый материал в неформальной подаче в духе "вот давай я тебя сейчас все объясню" гораздо легче чем в форме статьи с википедии.
Да и в конце концов статья написана от лица автора, а не как абстрактная энциклопедическая статья.
На самом деле, на вкус и цвет. Вы тоже правы по-своему, однако, следовать общим правилам гораздо лучше, потому что они охватывают больший процент читателей, давая правильное понимание описываемого. Вам ближе неформальная подача материала, мне ближе чёткий энциклопедический стиль. Оба стиля имеют право на жизнь, если верно излагают материал.
С уважением,
Singularity, 16.06.2017
Bornikkeny #118 - 4 месяца назад (отредактировано ) 0
Больная тема, нужно переписать эту статью. Я бы помог, да вот не считаю себя JASS-гуру :(
P.S. Всегда писал JASS в верхнем регистре. Смерти желаю тем кто называет JASS - jass'ом.
Singularity #119 - 4 месяца назад 2
Bornikkeny:
Больная тема, нужно переписать эту статью. Я бы помог, да вот не считаю себя JASS-гуру :(
P.S. Всегда писал JASS в верхнем регистре. Смерти желаю тем кто называет JASS - jass'ом.
Все мы далеки от совершенства. Важно лишь то, что конкретно мы делаем для того, чтобы стать на шаг или два ближе к нему.
» Небольшой постскриптум
Не стоит желать смерти людям, которые пишут JASS в нижнем регистре. Лучше пожелать им просветления. Ни Вы, ни я не можем знать наверняка - сегодня какой-нибудь человек пишет JASS в нижнем регистре, а завтра он изобретёт решение проблемы в JASS, которую никто до него не мог решить.
А всё потому, что Вы пожелали ему просветления, а не смерти. Всё ведь начинается с малого. :)
С уважением,
Singularity, 16.06.2017
quq_CCCP #120 - 4 месяца назад 0
Надо будет еще расписать про мемхак, хештаблицу и прочее.