ТОМ2 - платформа для парсерных игр

Объявление

Открыт сайт tom2-game.ru.


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

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ТОМ2 - платформа для парсерных игр » Бета-тестирование » Отлов ошибок интерпретации в движке


Отлов ошибок интерпретации в движке

Сообщений 1 страница 12 из 12

1

Не удалось достаточно хорошо выразить заголовок темы, поэтому сначала опишу о чём пойдёт речь. Сейчас, если в исходнике игры есть какие-то ошибки, то движок либо выдаёт их при запуске, либо вообще игнорирует до тех пор, пока не дойдёт до выполнения ошибочного кода. Порой, если где-нибудь в начале кода не закрыть скобочку, то он выводит почти весь исходный текст с указанием, что где-то здесь ошибка. (Поправка: попытался для надёжности воспроизвести эту ситуацию, но как ни старался - не получилось. Неужели прикрыли? :) ). В большинстве случаев выдаёт неоднозначное "неизвестная ошибка!".
Нельзя ли как-нибудь научить движок давать более подробное место ошибки и её тип? Было бы ещё лучше, если сделать дополнительную функцию проверки исходного кода. Например, запускаешь функцию проверки из tom.dll, а она возвращает список мест, где в исходнике ошибки и их тип. Хотя-бы первую встреченную, если парсер не может обрабатывать код после ошибок. (Было-бы очень неплохо для редактора). Или у кого-то есть идеи получше?

2

"неизвестная ошибка!"
- сейчас это чаще всего связано с отказом от AnsiString в обработке исключений. (нестыковка нового интерфейса со старым движком)
В большенстве мест я переделал генерацию ошибок, но еще не везде...
Т.е. новый обработчик ошибок игнорирует сообщения AnsiString, а старый код их исправно генерит.
Если напишешь в каких местах возникают "неизвестные ошибки!" - буду благодарен.

Стандартная обработка ошибки - это строка кода, в которой встречена ошибка, плюс описание самой ошибки.
Да, в случае ошибки со скобками строка кода может оказаться очень большой  :D

Функцию проверки можно сделать только на синтаксис. Полную предварительную проверку сделать невозможно, т.к. язык позволяет очень многое изменить в процессе выполнения.

3

ASBer написал(а):

Функцию проверки можно сделать только на синтаксис.

Было-бы очень хорошо заиметь хотя-бы такую функцию. :)

ASBer написал(а):

Если напишешь в каких местах возникают "неизвестные ошибки!" - буду благодарен.

Ну что-ж, если это действительно будет полезным, то проведу небольшой тест-драйв ТОМа. :D

В большинстве случаев ТОМ игнорирует ошибки и продолжает выполнять код так, как-будто бы их нет, при этом оставляя некорректные данные. В одних случаях такое поведение - это хорошо, в других - плохо. Например, интернет-браузер должен как-можно правильнее отобразить HTML-страничку вне зависимости от криворукости веб-мастера и количества ошибок, сделанных им. В то же время калькулятор должен как можно точнее вычислять результат, и если введены неверные данные или есть неоднозначность во введённых данных, он должен вывести ошибку или предупреждение и не самовольничать. Я не стану решать, к какому типу относится ТОМ. Лично я склоняюсь ко второму: движок должен говорить обо всех ошибках ещё на стадии тестирования, чтобы игростроитель знал и исправлял их до релиза. Но это ИМХО.

Итак, приступим непосредственно к тестированию ТОМа :crazy:

Ошибка приведения типов
Код для воспроизведения:

var k = 5 + "это не число"

Результат: k = 5
Попытка обоснования: пытается привести "это не число" в число, не может этого сделать и возвращает 0. А 5 + 0 = 5.
Преступные действия: Игнорирование ошибки

Очень большое число
Код для воспроизведения:

var i = 234245224 * 23342342

Результат: i = -539749776
Попытка обоснования: Не проверяя на величину чисел сразу перемножает. При переполнении старшие биты срезаются и получается корявое число.
Преступные действия: Игнорирование ошибки
исправлено в версии 0.9.4.5

Неверный оператор
Код для воспроизведения:

var i = 222 *** 2333

Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Не может понять оператор *** и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5

switch без параметров
Код для воспроизведения:

switch()
  case("2") %2
  case("3") %3

Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Увидел, что нету параметров в switch и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5

2 одинаковых параметра в switch
Код для воспроизведения:

switch("2")
  case("2") %первое повторение
  case("2") %второе повторение

Результат: Игнорирование. Вывод только "первое повторение".
Попытка обоснования: Оператору switch безразличо присутствие перекрывающихся case. Выполняет первое подходящее.
Преступные действия: Нет

Незакрытая фигурная скобка в строке
Код для воспроизведения:

% это строка {hello

Результат: Вывод ошибки "в строке, переданной парсеру, скобки {} недопустимы!".
Попытка обоснования: Не найдя закрывающую скобку передаёт всю строку парсеру. Тому это не нравится и он ругается.
Преступные действия: Выводимое описание ошибки не раскрывает её суть
исправлено в версии 0.9.4.5
Начиная с версии 0.9.4.5 отключена система событий, извлекаемых из выводимого текста. Идея была интересная, но на текущем уровне развития не работающая (( ASBer

Пробелы в названии объекта
Код для воспроизведения:

уникальное лесной зверёк
{ %{name}
}

Результат: Вывод ошибки "неизвестная ошибка!".
Попытка обоснования: Нет предположений.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5

Неправильное имя объекта
Код для воспроизведения:

уникальное 22-й { }

Результат: Вывод ошибки "недопустимое имя объекта!".
Попытка обоснования: Видит цифры в начале имени и ругается.
Преступные действия: Всё ОК

Дефис в имени объекта
Код для воспроизведения:

уникальное лесная-птишка
{ title = "потерявшаяся птичка"
  %уникальное, Появись!
  %{name}
}
%Вот тайтл: {лесная-птичка.title}. Нету? Вот так-то!

Результат: Игнорирование объекта. При выполнении указанного кода выводится только "Вот тайтл: . Нету? Вот так-то!"
Попытка обоснования: Понимает, что лесная-птишка - это одно слово и в нём ошибка, но не может понять, что надо выводить ошибку.
Преступные действия: Игнорирование создаваемого объекта с ошибкой
исправлено в версии 0.9.4.5

Вывод несуществующего объекта
Код для воспроизведения:

%Вывод несуществующего значения: {GiGi}

Результат: "Вывод несуществующего значения: "
Попытка обоснования: Не найдя объект GiGi заменяет его на null и выводит как пустую строку.
Преступные действия: Как-то не интуитивно понятно

Рандом не с числом
Код для воспроизведения:

rnd("это не число")

Результат: Вылет ТОМа. Ошибка "Исключение unknown software exception (0xc0000094) в приложении по адресу 0x015d6135.".
Попытка обоснования: Без проверки передаёт строку каким-то небезопасным указателем в генератор случайных чисел. Тот, увидев не число сразу дохнет унося в могилу ТОМ.
Преступные действия: Вылет тома без обоснования причин
исправлено в версии 0.9.4.5

Складывание объекта с числом
Код для воспроизведения:

уникальное корзинка {}
корзинка + 2

Результат: Вывод ошибки "корзинка - изменилось число уникального объекта!"
Попытка обоснования: Пытаясь прибавить к корзинке ещё 2 штуки понимает, что корзинка не счётное и ругается.
Преступные действия: Всё ОК

Присвоение объекту числа
Код для воспроизведения:

уникальное корзинка {}
корзинка = 2

Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Пытаясь присвоить объекту число понимает, что нельзя и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5

Выход за пределы содержимого объекта
Код для воспроизведения:

уникальное корзинка {}
%второй предмет в корзинке: {корзинка.item[2]}

Результат: Игнорирование выхода за пределы "массива".
Попытка обоснования: Видит, что в корзинке нет 2-го предмета и возвращает пустой предмет.
Преступные действия: Всё ОК

Присвоение pers числа
Код для воспроизведения:

pers=2

Результат: Вывод ошибки "должен быть объект!"
Попытка обоснования: В качестве pers можно задать только объект. ТОМ это понимает и ругается, если кто-то пытается нарушить это правило.
Преступные действия: Всё ОК

Неверные символы
Код для воспроизведения:

разве?
{ }

Результат: Вывод ошибки ""'?' - ошибка синтаксиса!""
Попытка обоснования: Видит недопустимый символ "?" и полностью растерявшись в догадках всё же находит единственно правильное решение: высказать всё красным текстом.
Преступные действия: Всё ОК

Неверные операции с логикой
Код для воспроизведения:

%{null + false}

Результат: Вывод ошибки "bool x bool!"
Попытка обоснования: Видит, что нельзя так складывать и ругается каким-то экзотическим способом в надежде, что пользователь его поймёт.
Преступные действия: Всё ОК. Только сообщение об ошибке не очень внятное.

Задание числа в качестве класса
Код для воспроизведения:

unique Красная_Шапочка { }
Красная_Шапочка.cls = 2

Результат: Вывод ошибки "object.cls=number!"
Попытка обоснования: ТОМ пытается сказать, что класс не может быть числом.
Преступные действия: Всё ОК.

Ещё, если после какой-либо "красной" ошибки (например, "неизвестная ошибка!") ввести любую строку, то он продолжит выполнение некорректного кода. Т.е. если после ошибки исправить её в блокноте и набрать "заново", то программа отработает дважды: первый раз некорректная, оставшаяся в памяти, а потом вторая исправленная. Это может ввести в заблуждение незнающего юзера: "почему программа выполняется дважды?". исправлено в версии 0.9.4.5
Если забыть закрыть кавычки и после них по пути не будет встречена ни одна двойная кавычка, то ТОМ выведет весь текст после незакрытой кавычки. Это, порой бывает очень большой текст и проще получается принудительно закрыть том, чем дождаться вывода этого текста. Это тоже неудобно.

Все тесты проводились на ТОМ v.0.9.4.4 dev.

Ну вот и всё, что удалось накопать за пару часиков. Надеюсь, этот небольшой "баг-репорт" поможет в улучшении ТОМа.

4

Супер! Отличная работа! Можно выпускать следующую версию чисто как багфикс  :blush:

Alexandr написал(а):

В большинстве случаев ТОМ игнорирует ошибки и продолжает выполнять код так, как-будто бы их нет, при этом оставляя некорректные данные. В одних случаях такое поведение - это хорошо, в других - плохо. Например, интернет-браузер должен как-можно правильнее отобразить HTML-страничку вне зависимости от криворукости веб-мастера и количества ошибок, сделанных им. В то же время калькулятор должен как можно точнее вычислять результат, и если введены неверные данные или есть неоднозначность во введённых данных, он должен вывести ошибку или предупреждение и не самовольничать. Я не стану решать, к какому типу относится ТОМ. Лично я склоняюсь ко второму: движок должен говорить обо всех ошибках ещё на стадии тестирования, чтобы игростроитель знал и исправлял их до релиза. Но это ИМХО.

ТОМ в плане контроля ошибок пока не проработан как это нужно.
Вообще идеальный вариант, когда на стороне игрописателя ТОМ отслеживает ошибки в режиме "параноик", а на стороне игрока прощает все некритические или предполагаемые ошибки.

Еще есть такой момент: я позиционирую язык ТОМа как высокоуровневый.
Т.е. даже простейшие операции (приведение типов, например) выполняются с некоторой "интеллектуальной" обработкой.
Там, где любой низкоуровневый язык выдаст ошибку, ТОМ пытается вернуть некоторый результат. Это просто такая идеология языка.

5

Alexandr написал(а):

Ошибка приведения типов
Код для воспроизведения:

Код:
var k = 5 + "это не число"

Результат: k = 5
Попытка обоснования: пытается привести "это не число" в число, не может этого сделать и возвращает 0.
А 5 + 0 = 5.
Преступные действия: Игнорирование ошибки

Не считаю это ошибкой. Это просто такое правило приведения строки к числу.
В режиме параноик нужно выводить предупреждение.

Хотя немного подумав, строку не содержащую число, нужно приводить не к 0 а к 1:

Код:
var X = 0
X = X + "5 груш" 
X = X + "10 груш" 
X = X + "груша в кармане" 
X = X + "груша в зубах" 
%всего {X} груш.

Это пример подсчета груш, построенный на приведении строк к числу. Сейчас даёт неверный результат.

6

Alexandr написал(а):

Вывод несуществующего объекта
Код для воспроизведения:

Код:
%Вывод несуществующего значения: {GiGi}

Результат: "Вывод несуществующего значения: "
Попытка обоснования: Не найдя объект GiGi заменяет его на null и выводит как пустую строку.
Преступные действия: Как-то не интуитивно понятно

Отсутствие объекта, переменной, свойста объекта или его метода - это не ошибка! Абсолютно нормальная ситуация.
Можно всегда проверить: if(GiGi == null) {...}

7

ASBer написал(а):

Не считаю это ошибкой. Это просто такое правило приведения строки к числу.

ASBer написал(а):

Отсутствие объекта, переменной, свойста объекта или его метода - это не ошибка!

Ну я и не настаиваю. Большинство приведённых мной "ошибок" действительно не являются ошибками для ТОМа и были добавлены для массовки. :) Вдруг натолкнёт на какую-нибудь идею.

ASBer написал(а):

на стороне игрописателя ТОМ отслеживает ошибки в режиме "параноик"

Неплохой режим был-бы. Полезный. Вот только реализовать его будет не просто. Ведь столько моментов надо учитывать... :tired:

ASBer написал(а):

var X = 0
X = X + "5 груш"
X = X + "10 груш"
X = X + "груша в кармане"

Любопытно. Вот только не станет ли он к грушам в одну кучу скидывать и яблоки?

Код:
var X = 0
X = X + "5 груш" 
X = X + "10 яблок" 
X = X + "яблоко на дереве"

8

Alexandr написал(а):

Т.е. если после ошибки исправить её в блокноте и набрать "заново", то программа отработает дважды: первый раз некорректная, оставшаяся в памяти, а потом вторая исправленная.

Как такого добиться мне непонятно. Вывод ошибки полностью и безвозвратно прерывает выполнение кода.
Повторить не удалось... если есть примерчик, покажи плиз.  :jumping:

9

Alexandr написал(а):

Вот только не станет ли он к грушам в одну кучу скидывать и яблоки?

Да, конечно посчитает общее количество фруктов  :D
Это уже автор должен думать что тут он хочет считать таким образом :D

10

ASBer написал(а):

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

1. Создаём в блокнотике простенькую программу с ошибкой:

Код:
%Проверка повторного выполнения программы
%{33/0}

2. Сохраняем файл.
3. Запускаем его в ТОМе. Видим ошибку:

> запустить
33/0
деление на ноль!

4. Не закрывая ТОМ переключаемся в блокнотик, комментируем ошибочную строку:

Код:
%Проверка повторного выполнения программы
//%{33/0}

5. Сохраняем исправленную программу.
6. Переключаемся в ТОМ. Набираем "заново":

> заново
Проверка повторного выполнения программы
Проверка повторного выполнения программы

Программа отработала 2 раза.
исправлено в версии 0.9.4.5

11

Alexandr написал(а):

Программа отработала 2 раза.

Ok, спасибо!
Это текст от первого выполнения не чистится и выводится при первом возможном случае, исправлю.

12

Вот еще одна ошибка, приводящая к вылету :disappointed:

Код:
x = 12345678901234567890
%{x}

исправлено в версии 0.9.4.5


Вы здесь » ТОМ2 - платформа для парсерных игр » Бета-тестирование » Отлов ошибок интерпретации в движке