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

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

    Мифы о Pawn-скриптинге - #1

    Внимание: данная тема закрыта для защиты от копирования.
    Если есть какие-то вопросы, замечания или просто пожелания по поводу данного урока - оставляйте их здесь.


    Миф 1: "Весь код лучше записывать в одну строку, так оптимизированнее!"

    Статус: Опровергнут.

    Описание:
    Многие нубы не осознают, что интерпретатор Pawn выполняет код не из исходника (*.pwn, *.p), а из скомпилированного файла (*.amx), в котором всё представлено в совершенно ином виде. Равно, как и не понимают вообще разницы между исходным кодом и скомпилированным.
    А потому им кажется логичным, что если исходный код записывать как можно короче, то кода будет меньше и он будет быстрее выполняться.

    Доказательство:
      Открыть/закрыть

    Сначала создадим файл с каким-нибудь кодом на Pawn (для примера возьмём нахождение факториала):
    Файл: test1_1.pwn
    1. #include <a_samp>
    2.  
    3. Fact(x)
    4. {
    5. if(x < 0) // Мог бы использовать assert, но он не работает в SA:MP.
    6. {
    7. return 0;
    8. }
    9. if(x < 2)
    10. {
    11. return 1;
    12. }
    13. new result = 2;
    14. while(x != 2)
    15. {
    16. result *= x--;
    17. }
    18. return result;
    19. }
    20.  
    21. main()
    22. {
    23. printf("%d\n", Fact(1));
    24. }


    Затем сделаем копию файла и в ней постараемся "утрамбовать" весь код: сократим имена функций/переменных до одного символа и уберём все необязательные пробелы, операторные скобки {} и переносы строк.
    Одним словом, сделаем кашу из утрамбованного говнокода - прямо как любят RLS'ники.
    Файл: test1_2.pwn
    1. #include <a_samp>
    2. F(x){if(x<0)return 0;if(x<2)return 1;new r=2;while(x!=2)r*=x--;return r;}main()printf("%d\n", F(1));


    Скомпилируем оба файла с ключами "-d0 -v2".
    Первый ключ нужен для того, чтобы убрать из кода отладочную информацию - таким образом, его будет проще читать в ассемблерных листингах.
    Второй нужен, чтобы компилятор вывел подробную информацию о требованиях скрипта к памяти.
    Результаты компиляции test1_1.pwn:
    Код:
    Pawn compiler 3.10.20150531	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    Header size:            116 bytes
    Code size:              276 bytes
    Data size:               16 bytes
    Stack/heap size:      16384 bytes; estimated max. usage=12 cells (48 bytes)
    Total requirements:   16792 bytes
    
    Done.
    Результаты компиляции test1_2.pwn:
    Код:
    Pawn compiler 3.10.20150531	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    Header size:            116 bytes
    Code size:              276 bytes
    Data size:               16 bytes
    Stack/heap size:      16384 bytes; estimated max. usage=12 cells (48 bytes)
    Total requirements:   16792 bytes
    
    Done.
    Как видно, размер кода одинаковый (строка "Code size"). Размеры заголовка AMX (header size), данных (data size) и стека/кучи (stack/heap size) тоже совпадают.
    Размеры файлов тоже одинаковые.
    Сравним сгенерированный код в обоих файлах AMX, воспользовавшись утилитой pawndisasm:
    Файл test1_1.lst
    Код:
    ;File version: 8
    ;Flags:        compact-encoding 
    
    00000000  halt 00000000
    
    00000008  proc 
    0000000c  break 
    00000010  load.s.pri 0000000c
    00000018  move.alt 
    0000001c  zero.pri 
    00000020  jsleq 00000034
    00000028  break 
    0000002c  zero.pri 
    00000030  retn 
    00000034  break 
    00000038  load.s.pri 0000000c
    00000040  const.alt 00000002
    00000048  jsgeq 00000060
    00000050  break 
    00000054  const.pri 00000001
    0000005c  retn 
    00000060  break 
    00000064  push.c 00000002
    0000006c  break 
    00000070  break 
    00000074  load.s.pri 0000000c
    0000007c  const.alt 00000002
    00000084  jeq 000000c4
    0000008c  break 
    00000090  load.s.pri fffffffc
    00000098  push.pri 
    0000009c  load.s.pri 0000000c
    000000a4  dec.s 0000000c
    000000ac  pop.alt 
    000000b0  smul 
    000000b4  stor.s.pri fffffffc
    000000bc  jump 00000070
    000000c4  break 
    000000c8  load.s.pri fffffffc
    000000d0  stack 00000004
    000000d8  retn 
    
    000000dc  proc 
    000000e0  break 
    000000e4  push.c 00000001
    000000ec  push.c 00000004
    000000f4  call 00000008
    000000fc  heap 00000004
    00000104  stor.i 
    00000108  push.alt 
    0000010c  push.c 00000000
    00000114  push.c 00000008
    0000011c  sysreq.c 00000000	; printf
    00000124  stack 0000000c
    0000012c  heap fffffffc
    00000134  zero.pri 
    00000138  retn 
    
    
    ;DATA
    00000000  00000025 00000064 0000000a 00000000     %   d
    Файл test1_2.lst
    Код:
    ;File version: 8
    ;Flags:        compact-encoding 
    
    00000000  halt 00000000
    
    00000008  proc 
    0000000c  break 
    00000010  load.s.pri 0000000c
    00000018  move.alt 
    0000001c  zero.pri 
    00000020  jsleq 00000034
    00000028  break 
    0000002c  zero.pri 
    00000030  retn 
    00000034  break 
    00000038  load.s.pri 0000000c
    00000040  const.alt 00000002
    00000048  jsgeq 00000060
    00000050  break 
    00000054  const.pri 00000001
    0000005c  retn 
    00000060  break 
    00000064  push.c 00000002
    0000006c  break 
    00000070  break 
    00000074  load.s.pri 0000000c
    0000007c  const.alt 00000002
    00000084  jeq 000000c4
    0000008c  break 
    00000090  load.s.pri fffffffc
    00000098  push.pri 
    0000009c  load.s.pri 0000000c
    000000a4  dec.s 0000000c
    000000ac  pop.alt 
    000000b0  smul 
    000000b4  stor.s.pri fffffffc
    000000bc  jump 00000070
    000000c4  break 
    000000c8  load.s.pri fffffffc
    000000d0  stack 00000004
    000000d8  retn 
    
    000000dc  proc 
    000000e0  break 
    000000e4  push.c 00000001
    000000ec  push.c 00000004
    000000f4  call 00000008
    000000fc  heap 00000004
    00000104  stor.i 
    00000108  push.alt 
    0000010c  push.c 00000000
    00000114  push.c 00000008
    0000011c  sysreq.c 00000000	; printf
    00000124  stack 0000000c
    0000012c  heap fffffffc
    00000134  zero.pri 
    00000138  retn 
    
    
    ;DATA
    00000000  00000025 00000064 0000000a 00000000     %   d
    Абсолютно никаких отличий. Оба файла *.amx совпадают байт-в-байт.


    Вывод: сокращение количества строк в исходном коде, стирание пробелов и укорачивание имён переменных и функций не ведёт ни к каким изменениям в скомпилированном коде (AMX).
    Максимум может уменьшиться объём отладочных данных, если указать ключ "-d3" в файле pawn.cfg.
    Самому же интерпретатору не нужны имена объектов в AMX, т.к. он обращается к ним не по именам, а по их виртуальным адресам.


    Специально для Pro-Pawn.ru
    Не разрешается копирование данной статьи на других ресурсах без разрешения автора.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 15 пользователя(ей) сказали cпасибо:
    $continue$ (10.10.2015) Desulaid (10.10.2015) Disinterpreter (11.10.2015) franked (19.02.2016) gangzone.ini (10.10.2015) Jackal (23.10.2015) L0ndl3m (10.10.2015) Nurick (11.10.2015) Osetin (11.10.2015) Quman (11.10.2015) Salik_Davince (11.10.2015) vovandolg (27.01.2016) wAx (11.10.2015) [ForD] (11.10.2015) ^_^ (11.10.2015)
  3. #2
    Аватар для gangzone.ini
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.06.2014
    Сообщений
    651
    Репутация:
    106 ±
    Надо скинуть эту тему Томасу Макавели

  4. Пользователь сказал cпасибо:
    Danny_Marcelo (04.07.2016)
  5. #3
    Аватар для jeraqiv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    28.06.2015
    Адрес
    Двумерный массив
    Сообщений
    77
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Скомпилируем оба файла с ключами "-d0 -v2"
    Как скомпилировать с ключами? Что прописал и как реализовать?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Kladvey Посмотреть сообщение
    Как скомпилировать с ключами? Что прописал и как реализовать?
    http://pro-pawn.ru/showthread.php?12725
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #5
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Весьма очевидный миф... ну в целом не плохо для старта =)

  8. #6
    Аватар для Disinterpreter
    Проверенный

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    88
    Репутация:
    91 ±
    Ждем более интересных опровержений

 

 

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

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

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

Ваши права

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