PDA

Просмотр полной версии : [Урок] Приёмы для исследования кода на Pawn



Daniel_Cortez
09.10.2015, 21:40
В данной статье приведены методы, которые будут использоваться в доказательствах в предстоящем цикле уроков по скриптингу (http://pro-pawn.ru/showthread.php?12680).
Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
Касаемо pawn.cfg, ключи компилятора записываются в нём в одну строку через пробел (пример: -d0 -O2 -v2).


1. Получение ассемблерного листинга.

В папке с компилятором создайте файл "pawn.cfg". В этот файл можно вписать параметры командной строки для компилятора. Впишите в файл "-a" (без кавычек) и сохраните.
Компилятор при запуске откроет pawn.cfg и, найдя ключ "-a", сгенерирует ассемблерный листинг (*.asm) из файла *.pwn (при этом файл *.amx создан не будет!)
Также можно дизассемблировать уже готовый файл *.amx, использовав утилиту pawndisasm. Этой утилиты нет в стандартном комплекте сервера SA:MP для Windows (равно как и нет в стандартной сборке Pawn 3.2.3664 - она была бэкпортирована из 3.3.3875), но она есть в модифицированной версии компилятора от Zeex.

https://github.com/Zeex/pawn
Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных оптимизационных приёмов.


2. Профилирование.

Профилирование (в информатике) (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29) - сбор характеристик работы программы.
Не так давно я выкладывал профайлер (http://pro-pawn.ru/showthread.php?12585) для измерения времени выполнения двух отрывков кода на Pawn.
С его помощью также можно судить о целесообразности разных вариантов кода, сравнив их производительность.


3. Информация о требованиях к памяти.

В файле pawn.cfg добавьте ключ "-v2". Это заставит компилятор выводить подробную инфу о требованияк скрипта к памяти: объём заголовка файла *.amx, кода, данных и объём стека/кучи (как общий объём, так и используемый).
Таким образом, можно узнать, сколько памяти расходуется при использовании разных образцов кода.


4. Оптимизация генерируемого кода.

По умолчанию компилятор Pawn никак не оптимизирует генерируемый код.
Однако, в ситуациях, когда требуется оценить производительность кода, оптимизации иногда могут изменить результаты тестов. Кроме того, код после оптимизации, как правило, более компактный и его легче разбирать в ассемблерных листингах.
За оптимизацию генерируемых инструкций в компиляторе отвечает ключ -OX:

-O0 - никаких оптимизаций.
-O1 - JIT-совместимые оптимизации.
-O2 - то же самое, что в -O1, но также используются оптимизации, не совместимые с JIT.

Код, скомпилированный с ключом -O2 не запустится, если использовать плагин JIT для SA:MP, поэтому целесообразно указывать в pawn.cfg ключ -O1.


5. Удаление отладочной информации.

Ключ компилятора -dX отвечает за добавление отладочной информации:

-d0 - не добавлять отладочную информацию.
-d1 - добавить проверки времени выполнения (например, проверки на выход за пределы массивов).
-d2 - добавить проверки времени выполнения и символьную информацию (названия функций и переменных).
-d3 - то же самое, что и -d2, но также отключает оптимизацию генерируемого кода (-O0).

Указав в pawn.cfg ключ -d0, можно убрать из кода лишние инструкции (break, bounds), что опять же может быть полезно при чтении дизассемблерных листингов.



Тема будет дополняться.



Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Не разрешается копирование данной статьи на других ресурсах без разрешения автора.

Daniel_Cortez
11.10.2015, 00:56
Добавил пункты 3, 4 и 5. Также дополнил пункт 1 информацией об утилите pawndisasm.

Zaur_Lumanov
11.10.2015, 11:46
Какие могут быть проблемы, при использовании компилятора Zeex?

Unreal
11.10.2015, 12:06
-O1 - JIT-совместимые оптимизации.

можно по подробнее, я использую JIT plugin, т.е если я и это "поставлю", то будет еще лучше ?

jeraqiv
11.10.2015, 21:17
В данной статье приведены методы, которые будут использоваться в доказательствах в предстоящем цикле уроков по скриптингу (http://pro-pawn.ru/showthread.php?12680).
Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
Касаемо pawn.cfg, ключи компилятора записываются в нём в одну строку через пробел (пример: -d0 -O2 -v2).


1. Получение ассемблерного листинга.

В папке с компилятором создайте файл "pawn.cfg". В этот файл можно вписать параметры командной строки для компилятора. Впишите в файл "-a" (без кавычек) и сохраните.
Компилятор при запуске откроет pawn.cfg и, найдя ключ "-a" сгенерирует ассемблерный листинг (*.asm) из файла *.pwn (при этом файл *.amx создан не будет!)
Также можно дизассемблировать уже готовый файл *.amx, использовав утилиту pawndisasm. Этой утилиты нет в стандартном комплекте сервера SA:MP для Windows (равно как и нет в стандартной сборке Pawn 3.2.3664 - она была бэкпортирована из 3.3.3875), но она есть в модифицированной версии компилятора от Zeex.

https://github.com/Zeex/pawn
Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных вариантов кода.


2. Профилирование.

Профилирование (в информатике) (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29) - сбор характеристик работы программы.
Не так давно я выкладывал профайлер (http://pro-pawn.ru/showthread.php?12585) для измерения времени выполнения двух отрывков кода на Pawn.
С его помощью также можно судить о целесообразности разных вариантов кода, сравнив их производительность.


3. Информация о требованиях к памяти.

В файле pawn.cfg добавьте ключ "-v2". Это заставит компилятор выводить подробную инфу о требованияк скрипта к памяти: объём заголовка файла *.amx, кода, данных и объём стека/кучи (как общий объём, так и используемый).
Таким образом, можно узнать, сколько памяти расходуется при использовании разных образцов кода.


4. Оптимизация генерируемого кода.

По умолчанию компилятор Pawn никак не оптимизирует генерируемый код.
Однако, в ситуациях, когда требуется оценить производительность кода, оптимизации иногда могут изменить результаты тестов. Кроме того, код после оптимизации, как правило, более компактный и его легче разбирать в ассемблерных листингах.
За оптимизацию генерируемых инструкций в компиляторе отвечает ключ -OX:

-O0 - никаких оптимизаций.
-O1 - JIT-совместимые оптимизации.
-O2 - то же самое, что в -O1, но также используются оптимизации, не совместимые с JIT.

Код, скомпилированный с ключом -O2 не запустится, если использовать плагин JIT для SA:MP, поэтому целесообразно указывать в pawn.cfg ключ -O1.


5. Удаление отладочной информации.

Ключ компилятора -dX отвечает за добавление отладочной информации:

-d0 - не добавлять отладочной информации.
-d1 - проверки времени выполнения (например, проверки на выход за пределы массивов).
-d2 - проверки времени выполнения с символьной информацией (названия функций и переменных).
-d3 - то же самое, что и -d2, но также отключает оптимизацию генерируемого кода (-O0).

Указав в pawn.cfg ключ -d0, можно убрать из кода лишние инструкции (break, bounds), что опять же может быть полезно при чтении дизассемблерных листингов.



Тема будет пополняться.

А в какой литературе объясняют подобные вещи? От куда вы это знаете?

Daniel_Cortez
11.10.2015, 22:22
можно по подробнее, я использую JIT plugin, т.е если я и это "поставлю", то будет еще лучше ?
По умолчанию компилятор уже оптимизирует байткод (-O1), поэтому есть смысл либо применять оптимизации, не совместимые с JIT (-O2), либо вообще отключать оптимизацию (-O0).



А в какой литературе объясняют подобные вещи? От куда вы это знаете?
Собственные наблюдения. И кто учил вас цитировать такие огромные посты ради всего одной строки в ответе? Листать неудобно же -_-

Boulevard_Picard
11.07.2018, 07:46
Как использовать утилиту pawndisasm? Можно поподробнее

Daniel_Cortez
11.07.2018, 08:42
Как использовать утилиту pawndisasm? Можно поподробнее
Как и многие другие консольные утилиты: сначала запустить без параметров и в ответ получить ответ с синтаксисом использования


Usage: pawndisasm <input> [output]

а затем использовать согласно этому синтаксису. Пример: "pawndisasm myscript.amx myscript.asm".

Paradox
12.07.2018, 01:23
Daniel_Cortez, лучший, сегодня только думал об этом и хотел уже создать вопрос, спасибо большое!