Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 22 1 2 3 11 ... ПоследняяПоследняя
Показано с 1 по 10 из 216
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    Pawn compiler (3.10)

    Модифицированная версия компилятора Pawn с исправлением множества багов.

    Наиболее примечательные баги, которые были исправлены:
    • Ошибка на строках кода длиннее 511 символов (лимит увеличен до 4095).
    • Падение компилятора при использовании #emit sysreq.c, если указанная функция не использовалась ранее (с некоторых пор баг снова стал проявляться, однако новый патч #157 (https://github.com/Zeex/pawn/pull/157) уже ждёт принятия).
    • Ошибка при использовании строк в тернарных выражениях.
    • Падение компилятора при использовании #emit call.
    • Падение компилятора из-за неправильного названия инструкции в #emit.
    • Условная компиляция (#if/#elseif/#else/#endif) не работала с директивой #emit.
    • Ошибка при передаче глобальной переменной в функцию до определения функции, из-за которой компилятор принимал переменную за неиспользуемую и удалял её из файла .amx (#131).



    Нововведения:
    • Добавлен ключ командной строки "-R", использование которого включает отображение отчёта о находящихся рекурсиях в скрипте (#121).
    • Добавлена поддержка отрицательных чисел и чисел с плавающей запятой в #emit (#128, #133).
    • Реализована возможность ограничивать видимость перечисления в пределах одного файла (удобно при создании инклудов).
      Пример:
      1. static enum eMyEnum
      2. {
      3. myEnumFieldA,
      4. myEnumFieldB,
      5. myEnumFieldC
      6. };
    • Убрана автоматическая защита от повторного подключения включаемых файлов. Это было сделано из-за различий в работе такой защиты на разных ОС.
      Данную защиту можно включить, активировав режим совместимости с помощью флага "-Z" или директивы #pragma compat.
    • Новые встроенные константы:
      • __line - номер текущей строки в исходном файле;
      • __PawnBuild - номер текущего билда компилятора;
      • __compat - флаг режима совместимости: 1, если включена компиляция в режиме совместимости (с ключом -Z), иначе 0;
      • __file - содержит строку с названием текущего исходного файла (например, "main.pwn" или "my_include.inc");
      • __date, __time - содержат дату и время компиляции соответственно (время запуска компилятора).


    • Директива #pragma compat позволяет активировать режим совместимости, в котором включена автоматическая защита от повторного подключения файлов.
    • Добавлена возможность показывать предупреждающие сообщения с помощью директивы #warning, по аналогии с уже существующей директивой #error, но без прерывания компиляции:
      Пример:
      1. #warning Эта строка будет выведена в отчёте компилятора

      Результат:
      Код:
      warning 237: user warning: Эта строка будет выведена в отчёте компилятора
    • Также реализована многофункциональная директива #pragma warning, с помощью которой можно отключать предупреждения компилятора (#pragma warning disable <номер>), а также запоминать/восстанавливать состояние активации предупреждений (#pragma warning push/pop).
      Пример:
      1. #warning Эта строка будет выведена в отчёте компилятора
      2.  
      3. #pragma warning push // Запоминаем состояние предупреждений
      4. #pragma warning disable 237 // Отключаем все пользовательские предупреждения (код 237)
      5. #warning Эта строка выведена не будет
      6. #pragma warning pop // Восстанавливаем прежнее состояние
      7.  
      8. #warning Эта строка тоже будет выведена

      Результат:
      Код:
      warning 237: user warning: Эта строка будет выведена в отчёте компилятора
      warning 237: user warning: Эта строка тоже будет выведена
    • Директива #pragma naked отключает предупреждения вида "function must return a value". Отличие от #pragma warning disable в том, что #pragma naked действует только в пределах одного файла.
      Данная возможность может пригодиться при использовании #emit retn. Добавление return 1 в таких случаях тоже скроет предупреждение, но приведёт к генерации неиспользуемого (недостижимого) байткода.
    • Добавлена прогрессивная инициализация для двухмерных массивов.
      Пример (взято отсюда):
      1. new a[5][10] = {{0, 1, 2, ...}, {0, 2, 4, ...}, ...};

      В полной записи данный массив будет выглядеть так:
      1. new a[5][10] = {
      2. {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
      3. {0, 2, 4, 6, 8, 10, 12, 14, 16, 18},
      4. {0, 3, 6, 9, 12, 15, 18, 21, 24, 27},
      5. {0, 4, 8, 12, 16, 20, 24, 28, 32, 36},
      6. {0, 5, 10, 15, 20, 25, 30, 35, 40, 45}
      7. };
    • Также реализована возможность объявления четырёхмерных массивов (ранее был лимит в 3 измерения).
      Пример:
      1. new arr[3][1][2][3] =
      2. {
      3. { { { 1, 2, 3 }, { 4, 5, 6 } } },
      4. { { { 7, 8, 9 }, { 10, 11, 12 } } },
      5. { { { 13, 14, 15 }, { 16, 17, 18 } } }
      6. };
    • Добавлен новый оператор __emit.
      С описанием работы данного оператора можно ознакомиться здесь: https://github.com/Zeex/pawn/pull/18...ment-323531746
      (Примечание (DC): В скором времени будет подготовлена русскоязычная статья по использованию оператора emit, я добавлю ссылку сюда по мере готовности.)
    • Ускорена компиляция больших массивов, все элементы которых инициализированы одним и тем же значением.
      Теперь в ассемблерном листинге подобные массивы записываются как "dumpn <кол-во> <значение>".
    • Теперь при возврате массивов неизвестного размера компилятор выдаёт ошибку.
      Пример:
      1. #include <a_samp>
      2.  
      3. GetGenderName(gender_id)
      4. {
      5. static const gender_names[3][] = { {"male"}, {"female"}, {"undefined"} };
      6. if (0 == gender_id)
      7. return gender_names[0];
      8. if (1 == gender_id)
      9. return gender_names[1];
      10. return gender_names[2];
      11. }
      12.  
      13. main()
      14. {
      15. for (new i = 0; i < 3; ++i)
      16. printf("#%d: %s", i, GetGenderName(i)); // error 092: functions may not return arrays of unknown size (symbol "GetGenderName")
      17. }

      Здесь компилятор выдаёт ошибку из-за того, что не знает размер последнего измерения массива gender_names. Чтобы устранить ошибку, достаточно лишь указать размер последнего измерения массива:
      1. static const gender_names[3][10] = { {"male"}, {"female"}, {"undefined"} };

    • Значительно ускорена обработка исходного кода за счёт хранения глобальных идентификаторов (переменных, констант, функций) в хеш-таблице.
    • Добавлен параметр командной строки "-E" для интерпретации предупреждений от компилятора как ошибок.
    • Добавлена директива #pragma option, с помощью которой можно указывать параметры командной строки из скрипта.


    Скачать: https://github.com/Zeex/pawn/releases
    Исходный код на GitHub: https://github.com/pawn-lang/compiler

    Источники информации: What's new, https://github.com/pawn-lang/compile... compiler bugs.
    Статью подготовил: Daniel_Cortez

    Отдельная благодарность ziggi за описания некоторых ошибок и нововведений.

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 24.05.2013 в 20:15.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 7 пользователя(ей) сказали cпасибо:
    HarrWe (15.07.2016) Osetin (24.05.2013) Ruskadance (23.06.2013) seriu (05.11.2017) vovandolg (24.03.2017) Web (08.09.2018) Геннадий Литвинов (10.09.2019)
  3. #2
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    v3.10.1
    Build 1

    Начиная с этого релиза, в версии компилятора располагается номер сборки вместо даты, то есть "1" в "3.10.1" означает "build 1". Номер сборки будет увеличиваться с каждым релизом.

    Изменения относительно предыдущей версии:
    • Исправлена ошибка при передаче глобальной переменной в функцию до определения функции, что вызывало удаление переменной из AMX файла как неиспользуемую (#131)
    • Добавлена опция -R использование которой включает отображение отчёта о находящихся рекурсиях в скрипте (#121)
    • Добавлена поддержка отрицательных чисел и чисел с плавающей запятой в #emit (#128, #133)
    • Добавлена константа __PawnBuild которая содержит номер сборки текущей версии компилятора (#132)


    https://github.com/Zeex/pawn/releases

  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Ещё с прошлой недели понемногу готовлю обновление для сей статьи - сегодня-завтра собираюсь закончить, благо появилось свободное время. Не против, если использую часть твоего текста?

    UPD: Буквально пару минут назад внесён коммит, добавляющий константы __file, __date и __time.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Не против, если использую часть твоего текста?
    Конечно не против.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    UPD: Буквально пару минут назад внесён коммит, добавляющий константы __file, __date и __time.
    О, это довольно полезно.

  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Обновил статью. Знаю, что обещал ещё месяц назад; личные обстоятельства внесли свои коррективы.
    По поводу самой статьи - вполне возможно, что упустил что-нибудь, особенно на фоне того, что у меня сейчас 2 часа ночи. Дайте знать, если заметили какой-нибудь недочёт или ошибку.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Добавлена возможность выводить пользовательские ошибки с помощью директивы #error.
    Так это же, вроде, и в "дэфолтном" компиляторе есть, не?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #7
    Аватар для Alpano
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.02.2017
    Сообщений
    123
    Репутация:
    16 ±
    recursion detected: function 40000004!=40000004 directly calls itself
    recursion detected: function 40000004/0 directly calls itself
    recursion detected: function 40000004*0 indirectly calls itself:
    40000004*0 <- AntySH <- 40000004*0
    recursion detected: function -40000004 indirectly calls itself:
    -40000004 <- GetCoordBonnetVehicleEx <- -40000004
    recursion detected: function AddOshive indirectly calls itself:
    AddOshive <- UpdDBM <- AddOshive
    ...
    И как понять где рекурсия?)
    p.s. и ещё, функции AddOshive и UpdDBM ОБСАЛЮТНО не связаны... почему на них может ругаться?
    MyProject:
    DriftEmpire©

    Ленивые всё делают быстро, чтобы поскорее избавиться от работы.
    И делают качественно, чтобы потом не переделывать.

  9. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Забавно...
    Должно быть что-то типа такого:
      Открыть/закрыть
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #9
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Падение компилятора при использовании #emit sysreq.c, если указанная функция не использовалась ранее.
    Она до сих по не исправлена (я тестировал версию из мастер-ветки), поэтому буквально десять дней назад я отправил PR с исправлением, который до сих пор не приняли.

  11. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Alpano Посмотреть сообщение
    И как понять где рекурсия?)
    p.s. и ещё, функции AddOshive и UpdDBM ОБСАЛЮТНО не связаны... почему на них может ругаться?
    Покажи код.

 

 
Страница 1 из 22 1 2 3 11 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •