Athanor (ранее AWL) – это универсальный язык программирования интерпретируемого (сценарного) типа. В области идей на него повлияли: C / C++, Algol 68, Simula, LISP, AWK, Perl, APL, SNOBOL-4 и (возможно) ещё несколько менее известных и распространённых языков. Некоторые возможности языка (например, механизм объектного связывания) уникальны, и аналогов в других языках не имеют (мне, во всяком случае, такие неизвестны).
Перечислим некоторые возможности языка по порядку:
✬ Интерпретируемый характер
Athanor-система реализована как интерпретатор. С нею можно общаться в полностью интерактивном режиме (и, вводя в интерпретатор запросы, немедленно получать их результаты — что невозможно, например, в случае Perl).
✬ Функциональная механика
Хотя язык позволяет писать программы практически в любом стиле (императивном, объектно-ориентированном, функциональном), но технически, ядро языка — в основном функциональное. Язык объединяет всё то, что реализуется в других языках программирования как «инструкции», «операторы» и «встроенные функции» в единое понятие встроенного функтора. Функтор в Athanor — это всё, что может получать некие операнды, и возвращает в ответ некий результат. Выполнение программы в основном состоит из вложенного выполнения функторов.
✬ Динамическая типизация
В языке отсутствует жёсткая привязка переменных (как и элементов более сложных структур данных) к типам. Никакого явного декларирования типов — не предусмотрено. Например, любая переменная программы может содержать значение любого типа (и может также менять свой тип в процессе выполнения).
✬ Самообразие
Самообразие (т. е. гомоиконичность) — ещё одна принципиальная особенность, которая объединяет Athanor и LISP. Все программные структуры в языке — сами по себе являются данными. (Более того: большая часть структур программы может генерироваться динамически в процессе выполнения!)
✬ Управляемые ленивые вычисления
Механизмов для этого в языке присутствует немало. Например, помимо обычного присваивания (var = expr) предусмотрено и «ленивое» (var := expr). Второе выражение, в отличие от первого, присваивает переменной var не значение выражения expr, а само выражение expr (давая, таким образом, возможность вычислить его потом). Более того, многие встроенные функторы предполагают ленивое вычисление своих операндов: например, могут их вычислять опционально (условные операции) или многократно (циклические операции, или итераторы). Вместе с тем, реализованная в языке модель ленивых вычислений предиктивная: т. е. всегда заранее известно, когда, и что вычисляется.
✬ Скалярные типы данных и операции
К скалярным типам данных языка относятся числа (целые / с плавающей точкой) и символьные строки. Для них реализовано большое количество встроенных скалярных функторов-операций. Важно также отметить, что скалярные операции в языке (в отличие от переменных) довольно строго типизованы: например, невозможна ситуация, когда одна и та же операция может выполнять и сложение чисел, и конкатенацию строк.
✬ Иерархические списки
Список — один из основных способов агрегации данных в Athanor. Список может содержать произвольное количество значений любых (возможно, различных) типов. Элементами списков могут быть другие списки, т. е. списки естественным образом являются иерархическими. Для создания вложенных структур данных такого рода не требуются ухищрения, необходимые в Perl (вроде включения в массив ссылок на другие массивы). Конечно, в языке есть большой набор встроенных функторов для работы со списками.
✬ Многомерные массивы
Альтернативным механизмом структурирования данных в Athanor является массив. Массивы менее гибки, чем списки — но зато обеспечивают более быстрый доступ к своим элементам. Массивы могут иметь вплоть до 16 измерений.
✬ Динамические словари (хэши)
Словари (или хэши) — ещё один тип агрегации данных, обеспечивающий доступ к своим элементам не по (целочисленным) индексам, а по ключам. Ключом для словаря может быть не только строка, но и почти любое выражение (например, список из строк). Как размер, так и контент словаря не фиксированы: в словарь можно добавлять элементы, или удалять их из него.
✬ Кольцевые очереди
Кольцевые очереди (или просто кольца) — удобный способ создания аналогичных структур данных, реализованный непосредственно в языке. Они обеспечивают быструю вставку и/или удаление элементов в произвольном месте, и их циклический сдвиг в любом направлении.
✬ Сопоставление с образцами
Образцы выполняют функцию, аналогичную регулярным выражениям во многих других языках (но имеют намного более интегрированный в сам язык, и более вменяемый синтаксис). В целом, система образцов напоминает реализованную в языках типа SNOBOL: например, предусмотрен ряд операций, позволяющих конструировать сложные образцы из тривиальных (или более простых).
✬ Пользовательские функторы
Пользователь легко может определять и свои собственные функторы. У пользовательских функторов, как и у системных, также может быть ленивая передача аргументов. За счёт этого, пользователь может практически неограниченно расширять сам язык (определяя, например, свои собственные условные инструкции, циклические конструкции или даже инструкции, реализующие очень нетривиальную логику).
✬ Классы и объекты
В Athanor имеются развитые средства для объектно-ориентированного программирования. Так, есть механизм, позволяющий описывать классы, и создавать их экземпляры (т. е. объекты). Объекты — это самостоятельный тип данных, никак не пересекающийся со всеми прочими. Также реализовано наследование классов (линейное), опциональные конструкторы и деструкторы, и полиморфизм через механизм виртуальных методов.
✬ Обработка исключений
В последних версиях — в языке реализована структурная обработка исключительных ситуаций. Исключительная ситуация (исключение) может быть возбуждена (throw) на любом уровне вложенности вызовов, и корректно перехвачена/обработана (catch) многими уровнями выше. В целом, подход к обработке исключений напоминает реализованный в C++ или Java. Исключения — это единственный реализованный в языке механизм нелокальной передачи управления.
✬ Культурная/языковая нейтральность
Многие языки критикуются за то, что их набор ключевых слов исторически основан на английской лексике. В Athanor нет такой проблемы, поскольку ключевые слова в нём отсутствуют в принципе. Имеются лишь англоязычные (условно) стандартные идентификаторы (например, для имён стандартных функторов), но для них несложно определить любые синонимы, никак не привязанные к английскому. В принципе, можно даже «перевести» весь Athanor на любой другой язык (французский, немецкий, и даже русский) — это задача не сложнее создания любой другой стандартной библиотеки.
✬ Библиотеки и расширения
Для языка реализовано много дополнительных модулей расширения. Так, реализована оконная графика и звук в среде Windows, модули для симметричной и асимметричной криптографии, вычисление хэш-кодов, эффективная компрессия/декомпрессия данных и пр.
Существующая реализация Athanor распространяется свободно и бесплатно.