refal-5-lambda icon indicating copy to clipboard operation
refal-5-lambda copied to clipboard

Уровни логирования

Open Mazdaywik opened this issue 4 years ago • 0 comments

Мотивация

Сейчас предусмотрено два вида трассировки процесса работы: неотключаемый вывод на stdout имён компилируемых файлов и включаемый/выключаемый лог трансформаций программы back-end’ом.

В лог последнего выводится

  • дерево после рассахаривания,
  • дерево после каждого прохода древесной оптимизации,
  • дерево после завершения древесных оптимизаций,
  • высокоуровневый императивный код (RASL).

Если проходов много, то объём файла лога может быть значительным.

В него, к сожалению, не выводится такая полезная выжимка из древесных оптимизаций, как сигнатуры экземпляров. Т.к. без них вывод профилировщика становится более трудным для понимания.

Однако, вывод процесса работы на stdout порой или недостаточно, или избыточно детализирован. Недостаточная детализация наблюдается в режиме -OG: после фразы *Generating code... компилятор надолго задумывается. Избыточно детализирован — выводит сообщения о найденных библиотеках (+Linking), их тоже можно скрывать. Либо вообще можно скрывать весь вывод, сообщая лишь о синтаксических ошибках (было бы актуально для #334).

Реализация

Предлагается указывать уровень логирования в командной строке. Уровень определяется количеством указанных опций -v — каждая следующая увеличивает его на единицу. Начиная с некоторого уровня уже требуется указывать файл лога.

В файл лога выводится то же, что и на экран + дополнительная информация (вроде синтаксических деревьев). Сообщения, выводимые на экран, в файл заносятся с обязательным временны́м штампом (на экран — нет). В файл всегда выводятся сообщения о проходах оптимизирующего компилятора, на экран — только для -OG.

Сигнатуры экземпляров выводятся в лог на любом ненулевом уровне.

На нулевом уровне ничего не выводится, кроме сообщений о синтаксических ошибках.

Уровни:

  1. Выводятся сообщения *Compiling на экран. В режиме -OG выводится только *Generating code....
  2. Выводятся сообщения *Compiling, +Linking. В режиме -OG на экран выводятся названия проходов оптимизирующего компилятора (рассахаривание, разметка, прогонка, специализация, генерация RASL’а того и другого уровня, генерация кода).
  3. В файл выводится синтаксическое дерево после рассахаривания и после древесных оптимизаций (если они были), также выводится высокоуровневый RASL (?).
  4. В файл выводятся синтаксические деревья после каждого прохода оптимизации.

С RASL’ом не очевидно. С одной стороны, он нужен при отладке генерации целевого кода. С другой стороны — занимает много места, в несколько раз больше синтаксического дерева. Возможно, его стоит включать/выключать отдельной опцией.

Также не очевиден вопрос, как на экран выводить сообщения: на stdout или на stderr.

До обновления стабильной версии нужно добавить поддержку пустой опции -v.

Mazdaywik avatar Nov 24 '20 20:11 Mazdaywik