Рефал-5λ, версия 3.1
Предупреждения
Компилятор теперь поддерживает выдачу предупреждений (#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
)