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.

Прежде чем мы сможем реализовать наш бэкэнд, нам нужно понять, как работает его жизненный цикл:

  1. declare используется для объявления переменной, но также запускает серверную часть. Тип - это имя серверной части (в данном случае example-scores-php). В этом примере я буду использовать PHP, потому что он довольно распространен. Однако название серверной части совершенно не связано с тем, как она работает.
  2. Бэкэнд - это одноименный каталог. Bento будет искать серверную часть во всех каталогах, определенных в переменной среды $BENTO_BACKEND, которая работает аналогично $PATH. Он может содержать ноль или более путей, разделенных :. Если $BENTO_BACKEND не определен или пуст, он получит значение по умолчанию . - текущий каталог.
  3. Bento запустится и будет взаимодействовать с серверной частью через простой текстовый протокол сокетов. Который мы построим на PHP дальше.

Создание бэкэнда

Начнем с создания каталога с именем example-scores-php. Поместите его в тот же каталог, где мы будем запускать скрипт, чтобы упростить задачу. В этом каталоге будет три двух файла:

  1. bento.json описывает, как следует запустить бэкэнд. Подробнее об этом позже.
  2. 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.

Что планируется на будущее?

Я хочу, чтобы сам язык был очень простым и позволял людям его расширять, создавая свои собственные пакеты. При этом есть некоторые вещи, которые, как я считаю, необходимо реализовать, чтобы создать продуктивную среду для всех:

  1. IDE в браузере. Bento может работать как сервер, предоставляя IDE через браузер для редактирования и запуска программ. Приятные функции, такие как раскраска кода, автозаполнение, редактор сценариев перетаскивания, отладчик и т. Д.
  2. Расширенные встроенные типы, включая массивы, структуры и время. Это значительно упростит написание программ, взаимодействующих со структурированными данными (такими как база данных или файл CSV).
  3. Разработка графического интерфейса. Существует множество отличных фреймворков для создания собственных и веб-приложений с графическим интерфейсом. Я еще не уверен, как это будет выглядеть, но возможность создавать интерактивные формы, списки, графики и т. Д. Упростит представление простых интерфейсов, которые подключаются и взаимодействуют со сложными серверными системами без необходимости создавать и поддерживать это программное обеспечение. традиционными способами.

Я хотел бы услышать от тебя

Как я уже сказал, еще рано. Несмотря на то, что все сложные технические части были выполнены, еще предстоит добавить много доработок, которые действительно можно сделать только с отзывами пользователей.

Если вас это интересует, я хотел бы получить любую обратную связь. Вы можете найти мою электронную почту в моем Среднем профиле.