Logo

Предметно-ориентированные языки (DSL) в Канторе

Предметно-ориентированные языки как подключаемые модули

Технология подключаемых синтаксических модулей (plugins) уже была опробована автором на вики и хорошо себя зарекомендовала, обеспечив нужную расширяемость и гибкость. Разрабатывая язык общего назначения, хочется и его сделать его максимально расширяемым, для чего и примени́м механизм модулей, подключаемых к компилятору и отекстовщику.

Поскольку компилятор получает на вход некий входной язык, вполне логично, что подключаемые модули должны реализовывать альтернативные, предметно-ориентированные способы записи некоторых сущностей. Отекстовщик делает противоположную работу, превращая двоичный байт-код в человеко-читаемый текст.

Единство модели и обратимость байт-кода гарантируют взаимную однозначность различных способов записи, в том числе и на предметно-ориентированных языках. Альтернативность предметно-ориентированной записи означает, что при отсутствии конкретного модуля на целевой машине сущность будет отображена в базовом синтаксисе на Канторе. Это может быть неудобно для редактирования, но функциональность системы из-за отсутствия модуля не нарушится.

Как и в вики, для подключаемых языков в Канторе выделена специальная синтаксическая конструкция.

Базовый синтаксис

Поскольку подключаемые модули пока могут реализовывать только описательные языки, им предлагается резервировать мнемонические символы, — они станут тегами предметно-ориентированного описания:
{тег предметно_ориентированное_описание тег}

Текст

Минимальным предметно-ориентированным «языком» является простой текст, — его модуль должен лишь уметь разбивать входной поток на отдельные строки в соответствии с правилами окружения, из которого был запущен компилятор. Мнемоническим тегом текста является апостроф:
txt = {'
  Это блок простого текста в естественном виде на Канторе.
  Сюда можно вписывать цитаты великих людей, если есть что вспомнить.

  Компилятор признаёт только одного великого человека — программиста.
'};
В примере описана функция txt, возвращающая объект типа :Core:Text, состоящий из четырех текстовых строк и имеющий предметно-ориентированную запись. Без модуля пример будет выглядеть так:
txt = new :Core:Text of
  += 'Это блок простого текста в естественном виде на Канторе.';
  += 'Сюда можно вписывать цитаты великих людей, если есть что вспомнить.';
  += '';
  += 'Компилятор признаёт только одного великого человека — программиста.';
end;

Вики

Кантор создается XXI веке, когда графический интерфейс уже давно стал обыденностью, и от программ ожидается как можно более простой доступ к выразительным возможностям среды. С этой целью в Канторе предусмотрено понятие форматированного текста, естественной записью которой является вики-разметка, — та самая, о которой говорилось в начале статьи.

Мнемоническим символом вики-разметки является знак равенства:
wk = {=
  == Это вики-заголовок ==
  Сюда тоже можно вписывать цитаты, если --хочется //отжечь//-- есть что вспомнить.
=};
Как и в случае с текстом, получаемый результат проще всего продемонстрировать кодом на Канторе в отсутствие подключаемого модуля вики-разметки (имена классов и свойств на данный момент условны):
wk = new :Core:Wiki:Document of
  += new :Core:Wiki:Block of
    Heading = True;
    += new :Core:Wiki:Text of
      += 'Это вики-заголовок';
    end;
  end;
  += new :Core:Wiki:Block of
    += new :Core:Wiki:Text of
      += 'Сюда тоже можно вписывать цитаты людей, если ';
      += new :Core:Wiki:Text of
        Style = Strikeout;
        += 'хочется ';
        += new :Core:Wiki:Text of
          Style = Emphasis;
          += 'отжечь';
        end;
      end;
      += ' есть что вспомнить';
    end;
  end;
end;

HTML, RTF, TeX

Подключение модулей HTML, RTF и TeX предполагается аналогичным образом.

За HTML зарезервированы символы < и >, а набор классов HTML в Канторе планируется сделать полностью соответствующим W3C DOM. Вероятно, возможности модуля HTML будут расширяться по мере реализации функциональности браузера на Канторе, постепенно вбирая в себя CSS, JavaScript и пр.

За RTF и TeX зарезервирован один и тот же мнемонический символ — \ (обратный слеш). Разрешение этой коллизии и проработка остальных деталей реализации оставлены на будущее.

Форматирование строк

Форматирование строк в Канторе будет реализовано как предметно-ориентированный язык (DSL). Символ традиционный — знак процента:
s = {%Строка {%} из {%}.%}.AsString[{index, count}];
Если свойству AsString будет сопоставлена операция *, вызов можно записать и так:
s = {%Строка {%} из {%}.%} * {index, count};
Формат {%} подразумевает, что тип сопоставляемого выражения будет передаваться через RTTI, как это сделано в Delphi. Соответствующая реализация в CoreLite пока находится в разработке (отложена), но повлияла на Кантор.

Цели

Сейчас все борятся за безопасность кода и статический анализ, а в Канторе его можно сразу встроить в язык, благо общий механизм для этого есть — расширения в виде предметно-ориентированных языков. Объявленный ранее отказ от встроенных типов повлиял не только на перечислимые типы, но и на концепцию предметно-ориентированных языков, подключаемых к компилятору и отекстовщику внешними модулями. Концепция стала более стройной, что заставляет описать ее, не откладывая на будущее.

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.