parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

что у parser внутри #7

Misha v.3 03.02.2010 06:16 / 03.02.2010 06:19

немного новых деталей к #6.

то, что описывал PAF уже не совсем соответствует действительности, т.к. в версии 3.4.0 в компилятор были введены дополнительные оптимизации и появились opcode-ы, которые умеют что-то делать более чем с двумя последующими Operation.

это позволило уменьшить объём байт-кода и, что более важно, позволило сразу выполнять некоторые очень распространённые действия, а не гонять данные тысячи раз в стек и обратно.

например, приведённый PAF-ом пример байт-кода для простейшего кода
$c($a+$b)
преобразился в следующий:
Operation.code OP_PREPARE_TO_EXPRESSION
Operation.code OP_VALUE__GET_ELEMENT
Operation.origin ...
Operation.value "a"
Operation.code OP_VALUE__GET_ELEMENT
Operation.origin ...
Operation.value "b"
Operation.code OP_ADD
Operation.code OP_WITH_ROOT__VALUE__CONSTRUCT_EXPR
Operation.origin ...
Operation.value "c"
фактически новая конструкция (с новым кодом операции OP_VALUE__GET_ELEMENT):
Operation.code OP_VALUE__GET_ELEMENT
Operation.origin ...
Operation.value "a"
равносильно существовавшей ранее конструкции
Operation.code OP_WITH_READ
Operation.code OP_VALUE
Operation.origin ...
Operation.value "a"
Operation.code OP_GET_ELEMENT
с той лишь разницей, что она выполняется за одну итерацию работы байт машины, а не за три, как раньше и делает только одну запись в стек, а не три, как раньше.

а новая конструкция:
Operation.code OP_PREPARE_TO_EXPRESSION
...
Operation.code OP_WITH_ROOT__VALUE__CONSTRUCT_EXPR
Operation.origin ...
Operation.value "c"
по своей сути аналогична существовавшей ранее конструкции:
Operation.code OP_WITH_ROOT
Operation.code OP_VALUE
Operation.origin ...
Operation.value "c"
Operation.code OP_PREPARE_TO_EXPRESSION
...
Operation.code OP_CONSTRUCT_EXPR
только выполняется за два "такта" вместо четырёх.

есть возможность поиграться с этими оптимизациями и посмотреть (убрав комментарий с #define DEBUG_EXECUTE), как меняется байт-код при их отключении (отключаются они комментированием #define-ов в pa_opcode.h)

самое просте, и возможно, самое любопытное сравнение можно провести если глянуть на размер байт-кода (пишется в parser3.log), который получается при обращении, например, к заглавной странице вашего сайта без оптимизаций и со всеми оптимизациями :)

  • что у parser внутри #7, Misha v.3 [M] 03.02.2010 06:16 / 03.02.2010 06:19