TrustLang — это язык программирования высокого уровня общего назначения c синтаксисом на основе грамматических правил без использования ключевых слов что позволяет создать любые варинты собственного синтаксиса (DSL).
TrustLang реализован как транспилер (source-to-source translator) в код C++ и совместим ним на низком уровне, разрешая непосредственные вставки кода на языке С++ в тексте программы, прямые вызовы С/С++ функций и наоборот, вызовы функции TrustLang из С++.
В языке TrustLang на уровне синтаксиса языка реализована вытесняющая и кооперативная многозадачность (т.е. многопоточное и асинхронное программирование).
Тензорные вычисления и рациональные числа не ограниченной точности реализованы как базовые типы данных и поддерживаются синтаксисом языка без подключения дополнительных библиотек. Тензорные вычисления сделаны на базе библиотеки libtorch, а рациональные числа неограниченной точности с помощью OpenSSL.
В TrustLang реализовано автоматическое безопасное управление памятью без сборщика мусора и гарантируется отсуствие ошибок при управлени памятью на этапе компиляции исходного текста программы.
Основные свойства и особенности языка:
- возможность работы как в режиме интерпретатора, так и компилятора*
- динамическая и статическая типизация с возможностью указания типов в явном виде
- статическая типизация является условно-строгой (автоматическое приведение типов отсутствует, но допускается преобразование между некоторыми типами данных. Например, целое число может быть автоматически преобразовано в вещественное или рациональное, но не наоборот)
- автоматическое управление памятью без сборщика мусора на основе сильных и слабых указателей
- ООП* в виде явного наследования классов и «утиная типизация»
- на уровне синтаксиса поддерживается несколько типов функций (обычные и чистые функции без побочных эффектов)
- необязательные и именованные параметры функций
- простая интеграция с уже существующими программными библиотеками (в том числе импорт нативных переменных, функций и классов* из С/С++.)
- имеется REPL (read-eval-print loop — «цикл: чтение — вычисление — вывод»)
*) Данные возможности запланированы к реализации
Зачем нужен TrustLang?
У всех современных языков программирования происходит постоянное развитие (усложнение) синтаксиса по мере выхода новых версий.
Это является своего рода платой за появление новых возможностей языка и воспринимается пользователями как естественное явление.
Но одновременно является и серьезной проблемой, так как с выходом новых версий языка в него добавляются новые ключевые слова и синтаксические конструкции, что неизбежно повышает порог входа для всех новых пользователей.
Еще одним следствием этого процесса становится постоянное увеличение сложности разработки и поддержки уже созданных программных продуктов, когда старый программный код дорабатывается с применением уже новых стандартов и постоянным увеличением старого легаси кода.
TrustLang разработан как "надстройка" над языком C++ с сохранением всех его возможностей и характеристик, но лишенный его недостатков в виде очень сложной лексики, адресной арифметики, ручного управления памятью и ограниченностью встроенных типов данных.
Тензорные вычисления и рациональные числа неограниченной точности доступны «из коробки» и поддерживаются на уровне синтаксиса для удобной записи литералов. Тензорные вычисления сделаны на базе библиотеки libtorch, а рациональные числа неограниченной точности с помощью OpenSSL.
Пример скрипта Hello world! на TrustLang
hello(str:StrChar) := {
@print('call: {}\n', str);
str;
};
@main() := {
hello('Привет, мир!');
};
Вывод:
call: Привет, мир!
Привет, мир!
Пример вычисления факториала 40 на TrustLang с использованием DSL синтаксиса
#!../_build/trust --run
@main() := {
$fact := 1\1; # Рациональное число 1 (без ограничения точности)
$mult := 1;
@while( mult <= 40 ) {
fact *= mult;
mult += 1;
};
# Print result
@print('{}', fact);
}
Вывод:
815915283247897734345611269596115894272000000000\1