Katahdin
| Katahdin | |
|---|---|
| | |
| Семантика | императивный, объектно-ориентированный, duck-typed, языково-ориентированный |
| Класс языка | язык программирования |
| Тип исполнения | интерпретатор |
| Появился в | 2007 |
| Автор | Крис Ситон (Chris Seaton) |
| Выпуск | 0.2 |
| Система типов | динамическая |
| Повлиял на | PFront |
Katahdin — язык программирования, в котором синтаксис и семантика могут изменяться во время исполнения. Katahdin использует РВ-грамматики и packrat-парсер. Новые конструкции, такие как выражения или операторы, или даже новый язык программирования могут быть созданы с нуля. Единственная реализация языка использует платформу .NET (реализацию Mono).
Введение
[править | править код]Katahdin позволяет вводить новые конструкции также легко, как в обычных языках программирования: можно создавать функции и типы данных.
Например, во многих языках программирования присутствует операция взятия остатка (mod). Если используемый язык программирования не содержит такой операции и не позволяет каким-то образом её перегрузить, то реализация подобной операции выльется в изучение реализации языка, изменение грамматики и сборку нового транслятора. Katahdin позволяет описать операцию взятия остатка в несколько строк:
class ModExpression : Expression {
pattern {
option leftRecursive;
a:Expression "%" b:Expression
}
method Get() {
a = this.a.Get...();
b = this.b.Get...();
return a - (b * (a / b));
}
}
Этот код выполнится во время исполнения программы, и сразу после этого операция взятия остатка станет частью языка. Таким образом, после объявления новой операции, она может быть использована дальше в программе. Katahdin не содержит специальных конструкций, которые не могут быть изменены (даже пробелы и ключевые слова не являются исключением). Если описать все конструкции какого-либо языка программирования подобным образом, то Katahdin превратится в интерпретатор этого языка. Таким образом, Katahdin может быть использован в качестве универсального интерпретатора. Также можно использовать один язык в рамках другого, просто описав оба языка в Katahdin. На сегодняшний момент существуют подобные описания для языков Фортран и Python.
Иногда программист хочет использовать один язык в рамках другого. Например, SQL используется повсеместно в рамках других языков, при этом код на SQL записывается в строках. Katahdin позволяет совместить основной язык с SQL, чтобы тот использовался как часть основного языка. Также иногда возникает желание определить новый оператор во время исполнения. Например, в Java 1.5 был добавлен оператор for-each. Но пока эта реализация языка не была выпущена, программисты не могли использовать эту возможность. Использование Katahdin в этом случае позволило бы программистам использовать эту конструкцию, не дожидаясь следующей версии Java. Реализация этого оператора выглядела бы примерно следующим образом:
class ForStatement : Statement {
pattern {
"for" "(" init:Expression ";"
cond:Expression ";" inc:Expression ")"
body:Statement
}
method Run {
init.Get...();
while (cond.Get...()) {
body.Run...();
inc.Get...();
}
}
}
Грамматика
[править | править код]Описание шаблонов
[править | править код]Грамматики в Katahdin представляют собой измененные РВ-грамматики. Запись очень близка также КС-грамматикам.
Просто текст помещается в кавычки ("текст") и может включать в себя стандартные Escape-последовательности.
Диапазон символов может быть выражен при помощи оператора .. : "a".."z".
Оператор . соответствует любому символу. Другие структуры обозначаются именами (value).
Последовательность представляется словами, разделенными пробелами: a b c
Операторы ? * + переводятся как ноль-или-один, ноль-или-больше, один-или-больше, соответственно.
Выражения могут группироваться в скобки для определения приоритета вычисления.
Операторы & и ! проверяют текст, но не убирают его. Оператор & проходит тогда, когда проходит, если выражение подходит. Оператор ! — наоборот.
Альтернатива представляется оператором |. В отличие от РВ-грамматик, которые используют оператор /, из альтернатив выбирается наибольшая подходящая, а порядок альтернатив не влияет на их приоритет.
Примеры шаблонов.
Универсальный конец строки:
"\r" "\n"? | "\n"
Список параметров:
"(" (Value, ("," Value)*)? ")"
Комментарий в С:
"//" (!EndOfLine .)*
Рекурсивные шаблоны
[править | править код]Одна из проблем при написании грамматик — описание рекурсивных правил и избавление от неоднозначностей, которые они порождают. Возьмем, например двухместный оператор -, который определен рекурсивно:
Применим такое определение к выражению:
Исходя из определения, выражение может быть распознано двояко: или
Неоднозначность пропадает с введением ассоциативности. В данном случае оператор - лево-ассоциативен. Для избежания таких неоднозначностей в Katahdin предусмотрены опции, соответствующие ассоциативности (leftRecursive для левой ассоциативности и rightRecursive для правой):
class Subtract : Expression {
pattern {
option leftRecursive;
Expression '-' Expression
}
}
Приоритеты
[править | править код]Приоритеты операций определяют порядок, в котором они будут выполнены при вычислении выражения. В математике и большинстве языков программирования операции * и / имеют больший приоритет, чем + и -. Вообще говоря, приоритеты можно описывать просто описывая грамматику, однако добавление новой операции в язык повлечет изменение других правил, причем, если эти правила были описаны в другом модуле, у программиста не будет возможности узнать, какие именно правила нужно менять. Поэтому Katahdin побуждает описывать операции естественным образом, определяя приоритеты потом, при помощи ключевого слова precedence:
class AddExpression : Expression {
pattern {
option leftRecursive;
Expression '+' Expression
}
}
class SubExpression : Expression {
pattern {
option leftRecursive;
Expression '-' Expression
}
}
precedence SubExpression = AddExpression;
class MulExpression : Expression {
pattern {
option leftRecursive;
Expression '*' Expression
}
}
class DivExpression : Expression {
pattern {
option leftRecursive;
Expression '*' Expression
}
}
precedence DivExpression = MulExpression;
precedence MulExpression > AddExpression;
Достоинства языка
[править | править код]Общая среда исполнения
[править | править код]В настоящее время написание системы на нескольких различных языках довольно затруднено. Для каждого языка требуется своя среда, которую необходимо выбрать, возможно, купить и установить. Каждая среда должна периодически обновляться и дополняться. При смене платформы, все среды должны быть портированы. Katahdin предоставляет единую среду для выполнения кода на различных языках. При смене платформы, должна быть портирована только среда Katahdin.
Простое взаимодействие языков
[править | править код]Взаимодействие между языками, исполняющимися в разных средах исполнения, естественным образом затруднено. Обмен информацией может быть осуществлен посредством создания канала чтения/записи. Доступ к коду (например, к функциям или типам) организовывается ещё сложнее, требуя использование таких инструментов, как CORBA или COM. В программе на Katahdin код и данные свободно разделяются между используемыми языками, не требуя связывания или ввода-вывода.
Пример использования языков FORTRAN и Python в одном исходном файле:
import "fortran.kat";
import "python.kat";
fortran {
SUBROUTINE RANDOM(SEED, RANDX)
INTEGER SEED
REAL RANDX
SEED = 2045*SEED + 1
SEED = SEED - (SEED/1048576)*1048576
RANDX = REAL(SEED + 1)/1048577.0
RETURN
END
}
python {
seed = 128
randx = 0
for n in range(5):
RANDOM(seed, randx)
print randx
}
Katahdin представляет язык программирования просто как инструмент, не ограничивая программиста в выборе платформы или библиотек. Каждый участок программы, отвечающий за конкретную задачу, может быть реализован на более подходящем языке программирования (в зависимости от задачи, разработчиков и используемых библиотек).
Например, программа на Фортране, предназначенная для вычислений, может плохо справляться с некоторой обработкой текста, требуемой при вводе-выводе. В этом месте лучше использовать более подходящий язык, например, Perl. В программе на Katahdin код, обрабатывающий текст и написанный на Perl, может быть использован в том же файле, что и программа на Фортране.
Кроме использования модулей, описывающих стандартные языки, Katahdin позволяет расширять и изменять язык. Однако даже если программист не собирается расширять используемые языки, такая возможность может быть использована (например, для реализации возможностей, которые появятся в следующей версии языка, но которые хотелось бы использовать уже сейчас).
См. также
[править | править код]- seed7 — язык программирования с расширяемым синтаксисом
- Intelib — библиотека классов C++, созданная в качестве инструмента мультипарадигмального программирования.
- CORBA
- Компиляция во время выполнения
- Парадигма программирования
Ссылки
[править | править код]- Официальный сайт
- Growing a Syntax
- Superlanguages: Syntactic and Semantic Supersets of other Languages
- Обсуждение языка на Lambda the Ultimate
- PFront: a language with extensible syntax
- Katahdin: метапрограммирование на грани фантастики, Илья Струков, Хабрахабр
- Статья о языково-ориентированном программировании на RSDN