Falang: Low-сode конструктор логики с экcпортом в C++, C#, Rust, Go, TypeScript

от автора

Полтора года назад я рассказывал про свой пет-проект по визуальному программированию — falang.io. Основная его особенность состоит в том, что пользователь не управляет расположением икон на схеме, только их содержимым. Все остальные соединительные линии рисуются автоматически алгоритмом по строгим правилам. В т.ч. continue, break, return.

На данный момент, помимо обычных текстовых диаграмм, у меня появился Low-code констркутор логики с упрощенной семантикой, который может экспортироваться в 5 современных языков программирования: C++, C#, Rust, Go, TypeScript.

TL;DR: Вот готовый пример с игрой «Змейка», запускающийся на микроконтроллере STM32 (Rust), и в браузере (TypeScript). Вся бизнес логика описана в Falang схемах, вручную только написано подключение к драйверам в случае STM32 и к Canvas в случае с браузером. Там же можно посмотреть все схемы, видео демонстрацию, и сгенерированный код.

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

Конструктор логики позволяет полностью описать некоторую доменную область, и необходимые внешние API. Для этого сужествует три вида схем:

Структура объектов

Позволяет в простом виде описывать структуру объектов, используемых в приложении. Для каждого поля есть название и тип. Тип поля может быть скалярным значением (integer, float, string), массивом, и другим объектом. Для каждого языка генерируется свой вариант описания объектов. Например так это выглядит в Rust

pub struct GameState {   pub colors: crate::falang::State::Colors,   pub snake: crate::falang::State::Snake,   pub food: crate::falang::State::Point,   pub config: crate::falang::State::Config, }

А так в C++:

struct GameState {   Falang_State::Colors colors;   Falang_State::Snake snake;   Falang_State::Point food;   Falang_State::Config config; };

Внешнее API

Описывает внешнее API, которое вызывается из функций. Для внешнего кода генерируются интерфейсы, которые должны быть реализованы внешним кодом. Как и для объектов, для каждого языка свой вариант генерации интерфейсов. Например так для TypeScript:

export interface IDrawRectParams {   x: number;   y: number;   w: number;   h: number;   color: Color; } export interface IDrawCircleParams {   x: number;   y: number;   r: number;   color: Color; } export interface Drawing {   DrawRect (params: IDrawRectParams): Promise<void>;   DrawCircle (params: IDrawCircleParams): Promise<void>; }

А так для Go:

type IDrawRectParams struct {   X int32   Y int32   W int32   H int32   Color State.Color } type IDrawCircleParams struct {   X int32   Y int32   R int32   Color State.Color } type Drawing interface {   DrawRect(params IDrawRectParams) ;   DrawCircle(params IDrawCircleParams) ; }

Функция

В этом типе схем реализуется вся логика приложения. Отсюда можно вызывать внешние API, создавать объекты, описанные выше, и управлять ими. Из одной функции можно вызвать другую функцию. Прямо на схеме настраиваются параметры функции, и возвращаемое значение. Например так показанная выше схема генерируется в C#:

namespace Falang.isGameOver; public class IisGameOverParams {   public required Falang.State.GameState state { get; set; }   public required Falang.Global.FalangGlobal _falangGlobal { get; set; } } public class MethodClass {   public static bool isGameOver(IisGameOverParams _params)   {     var state = _params.state;     var _falangGlobal = _params._falangGlobal;     bool returnValue = false;     if (state.snake.dirX == 0 && state.snake.dirY == 0) {       return returnValue;     } else {       foreach (var item in state.snake.body) {         if (item.x == state.snake.x && item.y == state.snake.y) {           returnValue = (bool)true;           return returnValue;         } else {         }       }     }     return returnValue;   } }

Пример со змейкой

В качестве первого примера разработана игра «Змейка». Она адаптирована под запуск в браузере (TypeScript) и на отладочной плате STM32F429I-DISC1 (Rust). Вот так это выглядит вживую:

Вся бизнес логика описана в Falang схемах, вручную только написана только реализация подключения к драйверам в случае STM32 и к Canvas в случае с браузером. Все схемы для змейки можно посмотреть тут. Скачать проект и посмотреть сгенерированный код можно здесь.

Заключение

Приложение уже можно скачать для Windows, Linux и MacOS. В нем есть несколько тестовых примеров. Они используются в автотестах и гарантированно выводят одинаковый результат на всех экспортируемых языках.

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

Если хотите следить за последними новостями проекта — подписывайтесь на телеграм канал.

Спасибо за внимание. Буду рад любым пожеланиям и предложениям.


ссылка на оригинал статьи https://habr.com/ru/articles/814923/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *