Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Язык Libretto

Особенности Libretto

  • Статическая типизация, компиляция в JVM байт-код, работа в Java-среде.

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

  • Система типов на неизменяемых структурах, трейтах (с неявной привязкой) и объединениях. Наследования нет.

  • Частью типа является указание кардинальности: единственное или множественное значение (последовательность), наличие или отсутствие пустого значения.

  • Понятие пути. Точка . служит разделителем шагов пути. Каждый шаг пути осуществляет отображение последовательности без вложенности - это аналог flat map или bind (в терминологии монад). Пути служат для итерации по последовательностям с накоплением результата и для изменения контекста.

  • Понятие контекста. Он всегда есть, доступен явно через $, используется неявно для выбора метода. Для изменения контекста используются шаги пути.

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

  • Функциональные возможности: анонимные функции как значения, неизменяемые структуры и последовательности, поддержка замыканий, локальные (вложенные) функции, в теле метода или функции всегда только выражения без операторов (expression, но не statement).

  • Замыкание как единственное средство создания объекта (экземпляра трейта). Изменяемые данные описываются при помощи изменяемых локальных переменных (var). Для задания состояния используется локальное (по месту) создание экземпляра трейта с замыканием, содержащим изменяемые переменные.

  • Числа с большой разрядностью в качестве базовых численных типов (Int и Real).

  • Ограниченная (в текущей реализации) поддержка обобщения (параметрического полиморфизма).

  • Ограниченная поддержка синтаксических шаблонов методов, но ожидается полная замена на обобщения или макросы.

  • Ограниченная поддержка макросов выражений: динамическая компиляция пути, представленного аргументом метода. Для реализации языка запросов в рамках сохранения стандартного Libretto синтаксиса программы.

Работа в Java среде

Компилятор Libretto является программой, работающей в Java-окружении. Программы на языке Libretto для запуска компилируются в JVM байт-код.

Как указано выше, поддерживается динамическая компиляция во время работы Libretto программы. Для этого достаточно только самого компилятора Libretto.

Но Libretto не позиционируется как язык для Java-окружения. Java-окружение - это всего лишь способ запуска. Система типов Libretto не соответствует системе типов Java, а только эмулируется при помощи типов Java. И эта эмуляция может изменяться по мере развития компилятора.

Программы на Libretto распространяются в скомпилированном в байт-код виде только в качестве готового для использования Servlet, который включает всё необходимые для работы библиотеки. И допускается работа только с этими версиями библиотек. Для остального обмена программами пока используются исходные тексты. В планах промежуточное (между исходными текстами и байт-кодом) представление для обмена, но пока оно не реализовано.

В связи с этой выбранной концепцией запуска программы на Libretto не имеют возможности лёгкой интеграции с Java-миром. Но возможность интеграции присутствует - через специальный механизм JVM-трейтов (см. todo). Это несколько громоздкий механизм, но обеспечивает полную эффективность (связывание на стадии компиляции с полноценной статической проверкой Java-типов).

История

Первоначально появился язык запросов к объектным базам данных (онтологиям), хранившимся в собственной системе. Язык создавался для программного использования (через API) из Java-программ или для пользовательских запросов через GUI (как аналог поиска). Этот язык запросов был навеян XPath, но работал с объектами вместо узлов XML. Ключевой идей были пути, состоящие из шагов. Пути и далее присутствуют во всех версиях языка Libretto.

Само название Libretto для языка появилось в январе 2010 года.

Libretto со временем превратился (в том числе под некоторым влиянием языка Scala) в полноценный язык программирования (условное название версии Libretto 0.9) - с определением типов данных и кода для исполнения. Но первое время сохранялся синтаксис, пришедший из XPath: контекст как ., разделители шагов пути /, пространства имён через :.

С развитием возможностей программирования появилась и стала развиваться возможность создания веб-приложений на языке Libretto. Сперва на базе Play Framework 1.x (2011 год), затем и на собственном веб-фреймворке (с 2012 года).

В версии Libretto 1.0 (2012-2016 года) была динамическая типизация с поддержкой ООП (классы, множественное наследование) и с опциональной строгой проверкой типов во время исполнения. Для указания контекста стал применяться $, для разделения шагов ., а разделителем пространства имён стал /. Программы выполнялись интерпретатором, работающим в Java среде. Версия Libretto 1.0 использовалась параллельно с Libretto 1.5/1.75 до полного перехода.

В версии Libretto 1.5 (2014-2015 года) типизация стала статической. Её базовыми типами стали трейты и неизменяемые структуры, а реализации методов определялись снаружи сущностей, но с указанием контекста (сущности, к которой они привязаны). Трейты неявно привязывались к подходящим по сигнатуре структурам, образую статическую иерархию типов. В целом язык стал проще по сравнению с Libretto 1.0. Появилась компиляция в байт-код JVM через промежуточный Java-код (через модель компилятора Janino, если быть точнее). Libretto 1.5 превратился в Libretto 1.75 после изменения системы типов.

В версии Libretto 1.75 (с 2015 года по настоящее время) сохранилась статическая типизация, но взамен трейтов появилась возможность явного определения объединения типов. Позже трейты вернулись (в 2019 году), но не только как средство описания автоматически привязываемых интерфейсов, но и как способ создания объектов с изменяемым состоянием (в противовес неизменяемым структурам). Компиляция в байт-код JVM стала прямой, без промежуточной модели Java-кода (с 2016 года).

Язык стал использоваться не только как средство разработки веб-приложений, но и как встраиваемый язык с динамической компиляцией (но статической типизацией).

Здесь и далее рассматривается актуальная реализация Libretto (1.75)

Почему язык называется Libretto

From: Andrei Mantsivoda andrei@baikal.ru

To: Anton Malykh malykh@gmail.com

Date: Mon, 4 Jan 2010 18:23:25 +0800

Subject: название

Склоняюсь к тому, чтобы назвать язык Libretto.

1) красивое “летящее” итальянское слово - как хотели, чтобы отразить легкость и компактность языка

2) переводится как “книжечка”, в опере понимается как “сценарий”, “скрипт”, пояснение - нам по смыслу прекрасно подходит (оттуда же library).

3) имеет международный статус и хорошую репутацию, гарантировано избавлено от негативных коннотаций.

4) не нашел известных систем с таким названием, есть только ряд ноутбуков тошибы, но это далеко

5) легко проговаривается и запоминается - начинается с мягкого “л”, а в середине косточка “бр” есть. Три слога задают прекрасную ритмику. Звучит на всех языках одинаково (даже ударение одинаковое). По звучанию близко к другому хорошему слову - “свобода” (по-итальянски, libertà, по-английски, liberty).

6) слово выглядит симпатично, бросается в глаза. Двойное “т” нарядное, задает акцент.

7) Наконец, слово из другой оперы (в прямом и переносном смысле) по сравнению с обычными названиями (сравни SPARQL, SQL), свежо должно звучать. Отражает вкусы разработчика.