clon-lang v1.0.8
Язык CLON
Язык CLON (произносится СЛОН). Состоит из трёх уровней:
1. Координирующий язык программирования
. Решает задачу координации процессов.
2. Уровень реактивных вычислений
. Упрощает задачу координации процессов.
3. Уровень обычных вычислений
. Попытка построить универсальный язык программирования.
Аналоги: React, Kotlin Compose, Lingua Franca, QML и т.п. Подробнее о причинах разработки.
Инструкции
В каталоге doc приведены инструкции по использованию CLON.
Координирующий язык
Содержит модель описания и вычисления процессов. При этом действия процессов задаются на базовом языке (сейчас Javascript). Понятия модели:
- Примитив синхронизации: канал, ячейка (в будущем еще обещание, поток) получает и раздаёт информацию.
- Действие - обычный программный код, например функция.
- Реакция - связывает примитив синхронизации и действие, запуская действие каждый раз когда появляется сигнал от примитива синхронизации.
- Связь - связывает примитивы синхронизации между собой.
- Процесс - структурная единица, состоящая из примитивов синхронизации, реакций, связей, подпроцессов.
Пример:
obj "compute1" {
in { // задает входные параметры
input: cell
coef: cell
}
output: cell
t: timer period=100 // подпроцесс таймера
react (when_all @input @x @t) {: // реакция на примитивы синхронизации input x t
// пишем на javascript
let y = self.input.get() * self.coef.get() + @t.count.get()
self.output.submit( y )
:}
}
obj "print1" {
in {
input: cell
}
react @input {: val |
console.log(val)
:}
}
pr1: print1
cmp1: compute1 20 2
bind @cmp1.output @pr1.input
Результат - процесс печатающий
40
41
42
...
Уровень реактивных вычислений
На языке возможно описание выражений, состоящих из процессов. Эти выражения соединяют процессы по входам и выходам (ячейкам с именами input и output). Например, в описании
someobject alfa=(compute1 (compute2 @x @y) @z | compute3 @w)
будут созданы и соединены процессы compute1,2,3, а результат работы выражения будет записываться в канал alfa процесса someobject. При этом если значения в каналах x,y,z,w меняются, то они пересылаются соответствующим процессам, и выражение может поменять свой результат. Это есть т.н. реактивные вычисления.
Уровень обычных вычислений
На языке возможно описание не только процессов и их композиций, но и обычных действий (функций). Пример описания и вызова функции:
func "foo" { x y | // задает функцию foo с двумя аргументами
return (@x * (@y + 10))
}
print "foo is" (foo 10 20) // вызывает процесс вычисления foo
Используемая вычислительная модель предполагает частичный порядок выполнения операций, а не последовательный как обычно. Пример порядка выполнения шагов:
a := @b + 1 // шаг 3
b := math.sin (@x) + math.cos (@x) // шаг 2
print @a // шаг 4
x := os.fetch "http://current.x" // шаг 1
return @a // шаг 4.1 после шага 4
Иногда все-же требуется задать последовательный порядок выполнения действий, для этого введен оператор =======
(4 или более символов =) который передает управление операторам описанным после него только по завершению всех предыдущих операторов:
compute1 ...
compute2 ...
====
print "all done"
Установка CLON
См. doc/install.md
Как пользоваться
- Файлы на языке CLON имеют расширение
.cl
. Рекомендуемый порядок работы - размещать каждую программу в отдельном каталоге в файле с именемmain.cl
. - После написания программы запускается транслятор
clon
(см. далее установка и запуск) который транслирует файл в базовый язык (сейчас только javascript для nodejs и для браузеров). - Полученный файл можно использовать обычным образом, например запускать из nodejs или подключать в программы для браузера.
Примеры
В каталоге tests.official приведены тесты разных возможностей языка.
Лицензия
Типа MIT. 2023 Павел Васёв.
Благодарности
Значимое участие в обсуждении и выработке идей принимает Михаил Бахтерев.