start: display "Hi, I'm bento."
Что такое бенто?
Https://github.com/elliotchance/bento
bento - это язык программирования четвертого поколения, основанный на английском языке. Он предназначен для отделения оркестровки от реализации, чтобы предоставить общий самодокументированный DSL, которым могут управлять нетехнические специалисты.
Ничего себе, что за рот… Это куча модных разговоров, означающих, что разработчики / инженеры могут настраивать сложные задачи и делать их легко реализуемыми нетехническими людьми с помощью (почти) простого английского.
Проект еще очень молод, но у него есть основная цель для каждой половины целевой аудитории:
Для разработчика / инженера: программы могут быть написаны на любом языке (так называемый бэкэнд) и легко представлены через набор конкретных DSL, называемых предложениями. .
Для пользователя: английский язык, который избегает большинства нюансов и сложной грамматики, которую сложно понять людям, не имеющим технических знаний. Язык содержит только несколько специальных слов, необходимых для потока управления. Пробелы и заглавные буквы не имеют значения.
Как выглядит бенто?
Можно писать программы, полностью работающие на языке бенто (без использования каких-либо серверных программ, как будет объяснено вкратце). Вот пример в файле hello.bento
:
Start: Say hello to "Jane" Say hello to "David" Say hello to persons-name (persons-name is text): If it is the afternoon, display "Good afternoon, " persons-name "!", otherwise display "Good morning, " persons-name "!" It is the afternoon? Declare am-or-pm is text Run system command "printf `date +'%p'`" output into am-or-pm If am-or-pm = "PM", yes
Давай запустим:
$ bento hello.bento Good afternoon, Jane! Good afternoon, David!
Некоторые очень простые языковые правила, о которых следует знать:
- Использование заглавных букв и пробелов в предложениях и вокруг них не имеет никакого значения.
say hello
совпадает сSay HELLO
. Программы, в которых предложения имеют отступ, легче читать, но это не является обязательным требованием. - Функции - это предложения, за которыми следует
:
. Функции могут принимать аргументы, описанные в скобках. - Вопросы - это предложения, за которыми стоит
?
. Вопросы также могут принимать аргументы так же, как и функции. Однако, в отличие от функций, ответы на вопросы обозначаются предложениемyes
илиno
. Если ответа не найдено, предполагается, что он равенno
(поэтому его можно исключить из вопроса выше). - Оператор
if
может принимать несколько форм. Здесь я использую однострочную форму:if <condition or question>, <true> [, otherwise <false>]
. - Функции и вопросы можно определять и вызывать в любом порядке.
Даже если программы бенто могут быть написаны полностью на языке бенто, это не является их предназначением. Bento предназначен для организации одного или нескольких бэкэндов, которые выполняют фактическую работу.
Что мы будем строить?
Чтобы продемонстрировать, вот программа бенто, которую мы будем реализовывать:
start: declare scores is example-scores-php declare avg is number add 53.5 to scores add 17 to scores average of scores into avg display avg display scores
Надеюсь, сами шаги программы не требуют пояснений. К тому времени, когда мы закончим, мы сможем запустить это и увидеть результат:
35.25 The total is 70.5.
Прежде чем мы сможем реализовать наш бэкэнд, нам нужно понять, как работает его жизненный цикл:
declare
используется для объявления переменной, но также запускает серверную часть. Тип - это имя серверной части (в данном случаеexample-scores-php
). В этом примере я буду использовать PHP, потому что он довольно распространен. Однако название серверной части совершенно не связано с тем, как она работает.- Бэкэнд - это одноименный каталог. Bento будет искать серверную часть во всех каталогах, определенных в переменной среды
$BENTO_BACKEND
, которая работает аналогично$PATH
. Он может содержать ноль или более путей, разделенных:
. Если$BENTO_BACKEND
не определен или пуст, он получит значение по умолчанию.
- текущий каталог. - Bento запустится и будет взаимодействовать с серверной частью через простой текстовый протокол сокетов. Который мы построим на PHP дальше.
Создание бэкэнда
Начнем с создания каталога с именем example-scores-php
. Поместите его в тот же каталог, где мы будем запускать скрипт, чтобы упростить задачу. В этом каталоге будет три двух файла:
bento.json
описывает, как следует запустить бэкэнд. Подробнее об этом позже.scores.php
(Серверная часть может быть на любом языке, потому что она будет отвечать за свой собственный сервер. В этом примере я буду использовать PHP, потому что он довольно распространен):
<?php // This file is an example of a backend written in PHP. $handlers = [ 'add ? to ?' => function($args) use (&$total, &$count) { $total += $args[0]; ++$count; }, 'average of ? into ?' => function($args) use (&$total, &$count) { return ["set" => ['$1' => (string)($total / $count)]]; }, 'display ?' => function() use (&$total) { return ["text" => "The total is $total."]; } ]; // The code following should not need to be changed. $socket = socket_create(AF_INET, SOCK_STREAM, 0); $result = socket_bind($socket, "127.0.0.1", $_ENV['BENTO_PORT']); $result = socket_listen($socket, 3); $spawn = socket_accept($socket); while ($message = json_decode(socket_read($spawn, 65536, PHP_NORMAL_READ))) { if ($message->special === "sentences") { $result = ['sentences' => array_keys($handlers)]; } else { $handler = $handlers[$message->sentence]; $result = $handler($message->args); } if (!$result) { $result = new stdClass(); } $output = json_encode($result) . "\n"; socket_write($spawn, $output, strlen($output)); } socket_close($spawn); socket_close($socket);
bento.json
довольно просто:
{ "run": "php scores.php" }
Этот пример также является частью основного репозитория Bento: https://github.com/elliotchance/bento/tree/master/backend/example-scores-php
Вот и все! Просто запускаем его:
bento scores.bento
Как реализован язык?
Bento - интерпретируемый язык, но у него есть лексер, грамматика, компилятор и виртуальная машина. Вы можете найти полную спецификацию языка в README.
Что планируется на будущее?
Я хочу, чтобы сам язык был очень простым и позволял людям его расширять, создавая свои собственные пакеты. При этом есть некоторые вещи, которые, как я считаю, необходимо реализовать, чтобы создать продуктивную среду для всех:
- IDE в браузере. Bento может работать как сервер, предоставляя IDE через браузер для редактирования и запуска программ. Приятные функции, такие как раскраска кода, автозаполнение, редактор сценариев перетаскивания, отладчик и т. Д.
- Расширенные встроенные типы, включая массивы, структуры и время. Это значительно упростит написание программ, взаимодействующих со структурированными данными (такими как база данных или файл CSV).
- Разработка графического интерфейса. Существует множество отличных фреймворков для создания собственных и веб-приложений с графическим интерфейсом. Я еще не уверен, как это будет выглядеть, но возможность создавать интерактивные формы, списки, графики и т. Д. Упростит представление простых интерфейсов, которые подключаются и взаимодействуют со сложными серверными системами без необходимости создавать и поддерживать это программное обеспечение. традиционными способами.
Я хотел бы услышать от тебя
Как я уже сказал, еще рано. Несмотря на то, что все сложные технические части были выполнены, еще предстоит добавить много доработок, которые действительно можно сделать только с отзывами пользователей.
Если вас это интересует, я хотел бы получить любую обратную связь. Вы можете найти мою электронную почту в моем Среднем профиле.