Ни Javascript, ни Python, ни Go, ни PHP, ни инкапсуляция.

Сегодня я собираюсь представить новый язык сопрограмм под названием Melang.

Melang — это параллельный язык сценариев сопрограмм. Это интерпретируемый, а не компилируемый язык.

В Melang каждая задача скрипта представляет собой сопрограмму. И несколько задач сценария могут обрабатываться в одном и том же потоке или в многопоточном режиме одновременно.

Это очень похоже на сопрограммы Go, но сопрограммам в Melang не нужно активно отказываться от прав на выполнение ЦП или вызывать определенные функции, чтобы косвенно отказаться от прав на выполнение ЦП. Вместо этого выполнение задачи автоматически переключается после выполнения интерпретатором определенных операций. Это также избавляет разработчиков от необходимости учитывать время переключения.

В Melang вся логика кода скрипта синхронизирована. Но на самом деле интерпретатор делает это асинхронно. Это поможет многим разработчикам, не знакомым с асинхронным программированием, начать работу.

Вот простой пример HTTP-сервера:

/* filename: server.m */
net = import('net');
mq = import('mq');
listenfd = net.tcp_listen('127.0.0.1', '80');
for (i = 0; i < 4; ++i)
    eval('worker.mln', i);
while (true) {
    fd = net.tcp_accept(listenfd);
    mq.send('test', fd);
}
/* filename: worker.m */
sys = import('sys');
net = import('net');
mq = import('mq');
while (1) {
    fd = mq.recv('test');
    ret = net.tcp_recv(fd);
    if (ret) {
        net.tcp_send(fd, "HTTP/1.1 200 OK\r\nContent-Length: 1\r\n\r\na\r\n\r\n");
    } fi
    net.tcp_close(fd);
}

Основная сопрограмма (server.m) создает 4 рабочие сопрограммы (worker.m), а затем входит в бесконечный цикл, ожидая установления клиентского TCP.

Рабочая сопрограмма (worker.m) находится в бесконечном цикле, получая установленный сокет TCP от основной сопрограммы, затем получая запрос от TCP, затем отправляя ответ HTTP и, наконец, закрывая сокет.

Далее мы можем запустить скрипт из командной строки с помощью следующей команды:

$ melang server.m

После запуска к нему можно получить доступ с помощью таких инструментов, как curl или ab.