Рассмотрим следующие две программы:
unit module Comp;
say 'Hello, world!'
а также
unit module Comp;
CHECK { if $*DISTRO.is-win { say 'compiling on Windows' }}
say 'Hello, world!'
Наивно, я ожидал, что обе программы будут компилироваться в один и тот же байт-код: блок CHECK
указывает код для запуска в конце компиляции; проверка переменной и последующее бездействие не влияет на поведение программы во время выполнения, и поэтому (я бы подумал) не нужно включать в скомпилированный байт-код.
Однако компиляция этих двух программ не приводит к одному и тому же байт-коду. В частности, компиляция версии без блока CHECK
создает 24 КБ байт-кода по сравнению с 60 КБ для версии с ним. Почему байт-код этих двух версий отличается? Имеет ли эта разница в байт-коде (или потенциально имеет) затраты на выполнение? (Вроде должно, но я хочу быть уверенным).
И еще один связанный с этим вопрос: как блоки DOC CHECK
вписываются в приведенное выше? Насколько я понимаю, даже компилятор пропускает DOC CHECK
блоки, если он не запущен с флагом --doc
. В соответствии с этим, байт-код для программы hello-world не увеличивается в размере, когда ему задан блок DOC CHECK
, подобный приведенному выше. Однако он действительно увеличивается в размере, если блок включает инструкцию use
. Из этого я делаю вывод, что use
имеет какой-то особый характер и выполняется даже в DOC CHECK
блоках. Это верно? Если да, то есть ли другие формы с таким же специальным регистром, о которых мне следует знать?