Майкл Полл, создатель высокопроизводительного JIT-компилятора LuaJIT, вернулся к активной работе над своим детищем. Напомним, что разработчик отошел от масштабного развития проекта еще в 2015 году, ограничиваясь лишь редким сопровождением ветки 2.1. Теперь же он представил планы по внедрению значительных синтаксических расширений в будущую версию LuaJIT 3.0.
Ключевые синтаксические расширения LuaJIT 3.0
Предстоящий релиз обещает серьезно изменить привычный облик языка, приблизив его синтаксис к современным стандартам программирования. Основные нововведения включают:
- Битовые операторы: Вместо использования библиотечных функций
bit.*предлагается встроенный синтаксис:~a(NOT),a & b(AND),a | b(OR),a ~ b(XOR), а также операторы сдвигаa << b,a >> bиa ~>> b(арифметический сдвиг). Символ^остается за операцией возведения в степень. - C-подобные операторы: Внедрение привычных для разработчиков на C и JavaScript операторов
!(not),&&(and),||(or) и!=(в качестве замены~=). - Целочисленное деление: Появление оператора
//, который выполняет деление с округлением в сторону минус бесконечности, с поддержкой метаметода__idiv. - Условные конструкции: Добавление тернарного оператора
a ? b : c, поддерживающего сокращенное вычисление. - Безопасная навигация: Оператор
?.для цепочек вызовов (например,a?.fieldилиobj?.:method()), который возвращаетnil, если левая часть выражения оказалась пустой. - Оператор объединения: Конструкция
a ?? b, возвращающаяbтолько в том случае, еслиaравноnil. - Составное присваивание: Поддержка широкого набора операторов, таких как
+=,*=,&=,??=и других. Важным уточнением является однократное вычисление индексного выражения в левой части. - Управление циклами и переменными: Появление оператора
continueи ключевого словаconstдля создания неизменяемых локальных переменных, исключающих повторное объявление в той же области видимости. Оба нововведения реализованы как «мягкие» ключевые слова, что позволяет при необходимости использовать их в качестве имен переменных.
Перспективы развития
В ходе обсуждения дорожной карты сообщество затронуло и другие амбициозные идеи, которые пока не вошли в текущую спецификацию. Среди них — сопоставление с образцом через in, индексируемые типы для vararg, лаконичный синтаксис для лямбда-выражений |x| -> expr, механизм отложенного выполнения defer в духе языков Go и Zig, а также возможность присваивания внутри условий.
Предложенные изменения вызвали дискуссии в сообществе. Часть разработчиков опасается, что подобные нововведения сделают LuaJIT несовместимым с эталонным Lua 5.1. Майкл Полл на это ответил довольно прямолинейно: «Этот корабль уплыл уже очень давно».
Для удобства работы с расширенным функционалом планируется создание отдельной, консолидированной документации, где каждое новшество будет сопровождаться пометкой о версии, в которой оно было внедрено.





