Skip to content

Рефал-5λ, версия 3.1

Compare
Choose a tag to compare
@Mazdaywik Mazdaywik released this 17 May 11:27
· 496 commits to master since this release

Предупреждения

Компилятор теперь поддерживает выдачу предупреждений (#273, #281). Синтаксис позаимствован у GCC:

  • -Wимя — включает предупреждение с заданным именем,
  • -Wno-имя — отключает предупреждение с заданным именем,
  • -Wall — включает все предупреждения,
  • -Werror=имя — трактует указанное предупреждение как синтаксическую ошибку — останавливает компиляцию,
  • -Werror — трактует все включенные предупреждения как ошибки.

Доступные предупреждения:

  • -Wscreening — поиск и вывод экранируемых предложений (пока не реализовано),
  • -Winit-final-entry — выдаёт предупреждение, если функция INIT или FINAL определена как $ENTRY,
  • -Wnul-in-compound — предупреждает об идентификаторах вида "abc\x00def", такие идентификаторы усекаются до первого \x00 в имени,
  • -Wignored-pseudocomments — если включен режим совместимости с классическим Рефалом-5 (--classic), то выдаётся предупреждение на псевдокомментарии, что они в этом режиме игнорируются.

Поддержка предупреждений реализована Александром Барлукой (@nexterot).

Список поддерживаемых предупреждений в будущих версиях будет пополняться.

Оптимизации

  • Небольшие оптимизации в самом компиляторе, компилятор стал работать немного быстрее (#194).

  • Вложенные функции (включая также неявно создаваемые функции для присваиваний и блоков) теперь не только прогоняются, но и специализируются по переменным контекста (#160). Это позволяет передавать информацию о значениях связанных переменных, даже если прогонка не удалась.

  • В режиме рассахаривания условий (-OC-) вспомогательные функции, имитирующие семантику условий, также прогоняются и специализируются по переменным контекста (#283). Это позволяет оптимизировать программы на классическом Рефале, где условия используются в роли присваиваний.

  • Глобальная оптимизация (#255) — синтаксические деревья отдельных единиц трансляции объединяются в одно. Это позволяет определить встраиваемую или прогоняемую функцию в одной единице трансляции, и оптимизировать её вызов в другой.

    Включается опцией -OG. Имена локальных функций во избежание конфликтов получают суффикс ~n, при компиляции создаётся файл 〈имя-программы〉-locals.lst, содержащий соответствия суффиксов именам единиц трансляции.

    Режим глобальной оптимизации сам по себе на быстродействие не влияет. Он лишь позволяет объединять единицы трансляции вместе, чтобы режимы -OD, -OI и -OS могли оптимизировать вызовы помеченных функций из других единиц трансляции.

Псевдокомментарии

Компилятор теперь имеет ограниченную поддержку псевдокомментариев. Комментарии
вида

*$DRIVE GetNodeName, GetNodeType, GetNodeChildren;
*$INLINE Apply;
*$SPEC Map t.FUNC e.items;

теперь интерпретируются точно также, как соответствующие объявления без звёздочки в начале. Это позволяет писать программы, одновременно совместимые с классическим Рефалом-5, и оптимизируемые Рефалом-5λ.

Синтаксические и семантические ошибки в них в текущей реализации обрабатываются как обычные синтаксические ошибки — компиляция прерывается. Таким образом, существуют программы на Рефале-5, трактуемые как некорректные в Рефале-5λ. Если необходимо обеспечить совместимость с такими программами, следует использовать ключ --classic, в котором все псевдокомментарии игнорируются. Ключ -Wignored-pseudocomments позволяет выводить сообщения о таких комментариях.

Исправленные ошибки

  • Анастасия Кузнецова (@suova) исправила огромное количество ошибок в переводах документации на английский язык (#280).
  • В архивах *.tar.gz теперь будут правильно выставляться флаги исполнимости.
  • Лексер для Рефала-5 допускал пустые индексы переменных вида e. Исправлено.

Для установки на Windows скачайте и запустите файл setup-refal-5-lambda-3.1.exe.

Для установки на Linux и macOS выполните в терминале следующую команду:

curl -L https://bmstu-iu9.github.io/refal-5-lambda/setup.bash | bash

При этом на компьютере должен быть установлен компилятор GCC C++ или Clang.

Либо программу можно собрать из исходников (архивы bootstrap-refal-5-lambda-3.1.zip или bootstrap-refal-5-lambda-3.1.tar.gz)