Синтаксис, семантика, ошибки и комментарии¶
В прошлой статье мы разобрались с базовым объявлением новых акторов — объектов мира.
Перед тем, как идти дальше, необходимо упомянуть о понятиях синтаксиса и семантики, а также о комментариях, самой важной возможности в любом языке программирования.
Синтаксис и семантика кода¶
Часто эти два понятия употребляются рядом.
- Синтаксис — это формальные правила записи кода; то, как он должен выглядеть, чтобы компьютер в нём разобрался.
- Семантика — это переданный смысл, то есть то, как его на самом деле воспринимает человек и что в результате по нему делает компьютер.
Напомним, что итоговый код из предыдущей статьи выглядел примерно так:
class ImpulseFloorLamp: Actor replaces Zombieman {
Default {
+SOLID;
+BRIGHT;
Radius 8;
Height 48;
}
States {
Spawn:
TLP2 A 30;
TLP2 BCD 4;
Loop;
}
}
Синтаксис¶
В коде выше слова вроде States, class, числа, а также символы по типу { } и ; стоят в строго заданных местах друг относительно друга. Эти позиции определяются жёсткими формальными правилами записи, по которым строится язык программирования. Это — синтаксис.
Ошибка (или "баг") в правилах записи называется синтаксической ошибкой. Такие ошибки движок без труда определяет и, так как в этом месте возникает критическая неясность, так как он не может распознать, что в этом месте от него требуется, то просто отказывается запускаться вместе с проектом.
Синтаксические ошибки
Список ошибок такого типа, а также общие рекомендации по их разрешению, можно посмотреть в статье "Список ошибок компилятора".
Семантика¶
Вместе с тем, в коде выше намётанному глазу также сразу видны:
- Объявление нового актора и замена им другого;
- Логический блок свойств сверху, определяющей непроходимую декорацию;
- Блок стейтов, показывающий простую зацикленную анимацию.
Да, записывается это всё синтаксическими конструкциями, но передают смысл объекта. Это — семантика.
Ошибка (баг) в логике называется семантической ошибкой. Они несравнимо сложнее для автоматического отлова, движок только в самых очевидных случаях может определить некорректность написанного. Зачастую такие ошибки проявляются непосредственно во время игры, а не при запуске проекта; иногда поначалу даже неясно, при каких условиях так или иная ошибка появилась.
Семантические ошибки
- Если игра вылетает в консоль, то общие методы решения можно посмотреть статье "Ошибки и вылеты при игре".
- Если движок намертво зависает — вероятнее всего, где-то бесконечный цикл. Обобщённый процесс отладки описан в ещё не созданной статье 2.7, а отладки в стейтах — в тоже пока не существующей статье раздела Actor.
- Если проект не запускается, то их, как и в случае с синтаксисом, можно поискать в статье "Список ошибок компилятора".
- Во всех остальных случаях ошибка где-то в логике, методы поиска описаны в пока отсутствующей статье 2.7.
- Крайне редко попадается что-то напрочь неотлаживаемое. Тогда можно попробовать найти соответствие в статье "Странные и специфические ошибки", но следует помнить, что обычно это излишне.
Процесс избавления от ошибок называется отладкой (дебагом). Зачастую, чем запутаннее код, тем сложнее в нём будет найти внезапно появившийся баг, и, соответственно, тем дольше впоследствии придётся заниматься отладкой.
Поддерживать порядок в коде и отлаживать подозрительные места помогут комментарии.
Комментарии¶
Комментарии — это текстовая информация прямо в коде, которую движок всегда игнорирует. С помощью них можно простым текстом передавать суть того или иного участка кода другим разработчикам (или себе из будущего), оставлять заметки, сохранять пока не нужные участки кода.
В ZScript есть два вида комментариев.
- Однострочные комментарии начинаются с последовательности
//и продолжаются до конца текущей строки; - Многострочные начинаются с последовательности
/*и продолжаются, пока не будет встречена последовательность окончания*/.
// Это однострочный комментарий. Для того, чтобы продолжить
// его на следующей строке, нужно в начало ещё раз поставить
// тот же символ.
/* Это многострочный комментарий. Он продолжается, пока не
будет встречен соответственный символ окончания строки.
Здесь всё ещё продолжается тот же, предыдущий,
комментарий, и оканчивается он только тут. */
// Оба вида комментария можно начинать с любой позиции.
/* Кстати, многострочный может занимать и всего одну строку. */
Теперь можно полностью описать пример кода выше (все комментарии, если это руководство открыто на сайте, будут рисоваться тёмно-серым цветом):
// Новый актор "ImpulseFloorLamp", заменяет всех зомби-рядовых на уровне:
class ImpulseFloorLamp: Actor replaces Zombieman {
/* Блок флагов и свойств актора: */
Default {
+SOLID; // Флаг непроходимости объекта.
+BRIGHT; // Флаг того, что объект всегда освещён.
Radius 8; // Радиус и высота актора.
Height 48; // Иногда комментарии выравнивают по одной вертикальной линии, чтобы их было удобнее читать (но это необязательно).
}
/* Блок стейтов. Доскональный пересказ анимации:
- Сначала 30 тактов находится в "A" (это 6/7 секунды);
- Потом на 4 такта переходит в "B";
- Потом на 4 такта переходит в "C";
- Потом на 4 такта переходит в "D";
И затем переходит снова в начало.
*/
States {
Spawn:
TLP2 A 30;
TLP2 BCD 4; // <-- Сам импульс длительностью 3×4 = 12 тактов.
//TROO C 2; // А эта строчка по какой-то причине не подошла, но, предположим, выкидывать её пока жалко...
Loop;
}
}
Разумеется, настолько подробно, как выше, расписывать комментарии практически никогда не требуется. Однако хорошим тоном считается, когда программа самозадокументирована, то есть когда сразу видно и понятно, что делает любая логически обособленная часть кода. И без комментариев к коду здесь обойтись трудно.
Комментарии будут крайне часто использоваться в последующих главах. Также информацию по ним можно найти в главе 3.1.
Теперь можно двигаться вперёд, к стейтам и созданию простого актора-противника!