Skip to content

Releases: covrom/gonec

Гонец 3.6

30 Oct 20:03
Compare
Choose a tag to compare

Финальный релиз версии 3

  • Добавлены все ключевые строковые функции
  • Добавлена функция Окр для чисел с плавающей запятой
  • Добавлена работа с key-value in-memory локальной базой данных boltdb

Пример работы с базой данных добавлен в скрипт демонстрационного примера.

Данный релиз является финальным для текущей функциональности, и он готов к промышленному использованию.

В релиз входят исполняемые файлы для Windows x64 и Linux x64.
Версия для Linux x64 подготовлена для развертывания в контейнерах docker с параметром окружения PORT и ключом запуска -web

Гонец 3.5а

23 Oct 21:02
Compare
Choose a tag to compare
Гонец 3.5а Pre-release
Pre-release

Заменена библиотека работы с числами с плавающей запятой. Теперь используется decnum на C http://speleotrove.com/decimal/decnumber.html (производительность выросла в 2 раза).

Гонец 3.4а

19 Oct 20:05
Compare
Choose a tag to compare
Гонец 3.4а Pre-release
Pre-release

Добавлена возможность работы с HTTP-запросами. Производительность в 9 раз ниже, чем TCP, но по прежнему высокая (1000 запросов клиентов + 1000 ответов сервера в секунду на 4-ядерном процессоре Core i5 3xxx). Способ асинхронной и синхронной работы унифицирован с TCP протоколом, что позволяет писать единообразный код для обоих видов протоколов.

2017-10-19 22_52_45- _
2017-10-19 22_54_29- _

Гонец 3.3а

18 Oct 19:55
Compare
Choose a tag to compare
Гонец 3.3а Pre-release
Pre-release

Гонец стал полноценным микросервисом (добавлена инфраструктура создания подключаемых микросервисов) и научился регистрироваться в Consul.
Исправлены ошибки в протоколе tcp, появился протокол tcpzip (с компрессией deflate - в 3 раза медленнее обычного tcp) и протокол tcptls (SSL/TLS соединения, в 10 раз медленнее tcp).
Так же готов сервер http протокола.
Добавлено несколько стандартных функций, включая группы ожидания.

Гонец 3.2a

06 Oct 19:13
Compare
Choose a tag to compare
Гонец 3.2a Pre-release
Pre-release

Отличные новости - вышла версия 3.2а!

  • Виртуальная машина получила работу с синхронным пулом Го (sync.Pool), что позволило оптимизировать использование памяти при работе с регистрами и переменными в стэке вызовов.
  • Оптимизирована работа с переменными в окружениях
  • Появились первые базовые объекты метаданных: Сервер и Клиент

Подробнее о сервере и клиенте

Реализован собственный бинарный протокол общения интерпретаторов Гонец между собой, запущенных на разных серверах. Протокол простой, быстрый и компактный, TCP. Используется бинарное представление встроенных типов виртуальной машины.
По протоколу всегда передается структура, которая может содержать вложенные структуры, массивы и значения.
Каждое соединение получает свой уникальный идентификатор, который можно использовать в сообщениях.
Трафик шифруется алгоритмом AES128 (без усложнений, для скорости).
Работа клиента и сервера производится в горутинах, т.е. полностью параллельно, что можно увидеть по результатам ниже, в примере - видна хаотичная очередность обработки параллельных транзакций.

Данный протокол в будущем позволит создавать горизонтально масштабируемые решения на кластере серверов с синхронизацией через нативный бинарный протокол.

В дальнейшем, будет расширение функционала сервера и клиента до обмена по протоколам HTTP(S) / JSON.

Пример работы с сервером и клиентом

Обратите внимание, исполняемый ниже код из 10 соединений и отправки простых сообщений суммарно (сервер+клиент) потратил времени всего ... 2 миллисекунды!

Функция ОбработатьСерв(соед)
   сообщить("Сервер получил соединение:",соед)
   сообщить("Запрос:",соед.Получить())
Конецфункции

серв = Новый Сервер
Попытка
  серв.Открыть("tcp", "127.0.0.1:9990", 1000, ОбработатьСерв)
Исключение
 сообщить(ОписаниеОшибки())
 сообщить("Кажется сервер уже запущен, или тут какая-то другая ошибка, но мы все равно попробуем отправить запрос :)")
КонецПопытки

кли = Новый Клиент
Для н=1 по 10 Цикл

  // определяем анонимную функцию здесь, чтобы подхватилась переменная "н"
  ф = Функция (соед)
    Сообщить("Устанавливаем соединение:",соед)
    запр={
      "id":соед.Идентификатор(),
      "query":"Запрос по tcp протоколу, номер "+строка(н),
    }
    Сообщить("Отправляем:", запр)
    соед.Отправить(запр)
  КонецФункции

  кли.Открыть("tcp", "127.0.0.1:9990", ф)

КонецЦикла

Результат:

Сервер получил соединение: Соединение с клиентом 127.0.0.1:50482
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"23aa9e11-890d-4edf-b0b8-224cb8a77d08","query":"Запрос по tcp протоколу, номер 2"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50483
Отправляем: {"id":"72600d14-5ac8-4be2-9a70-70631d66ac1d","query":"Запрос по tcp протоколу, номер 3"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50484
Отправляем: {"id":"d9909db3-ea24-4013-b358-d0163ddbe7d3","query":"Запрос по tcp протоколу, номер 4"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50485
Отправляем: {"id":"637d338e-46e0-4e30-933d-6a255efa0c0c","query":"Запрос по tcp протоколу, номер 5"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50486
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"f6e5ebc0-7818-4861-8586-a3c891efcc55","query":"Запрос по tcp протоколу, номер 6"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"d8725203-4476-42f7-b6cd-dd98a0cb4041","query":"Запрос по tcp протоколу, номер 7"}
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"8f426e94-9242-4854-8053-20665d69dc16","query":"Запрос по tcp протоколу, номер 8"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50488
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50489
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"68ef9ea5-08b8-44bf-bf75-0eda6b43ab9f","query":"Запрос по tcp протоколу, номер 9"}
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50490
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Отправляем: {"id":"50a4ff77-8e26-4322-ae11-08d27873e5bc","query":"Запрос по tcp протоколу, номер 10"}
Время компиляции: 0s
Время исполнения: 2.0019ms
Устанавливаем соединение: Соединение с клиентом 127.0.0.1:9990
Сервер получил соединение: Соединение с клиентом 127.0.0.1:50491
Отправляем: {"id":"b5304e60-c3b8-4562-b1bc-b8668e68230f","query":"Запрос по tcp протоколу, номер 10"}

Гонец 3.1a

01 Oct 11:43
Compare
Choose a tag to compare
Гонец 3.1a Pre-release
Pre-release

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

  • Виртуальная машина получила идиоматически верные интерфейсные типы данных Го и новые быстрые обертки для системных функциональных объектов. Как следствие, еще более быстрая обработка данных и удобство при расширении функциональности стандартной библиотеки (из-за правильных абстракций).
  • Более строгий контроль типов при осуществлении операций
  • Код выполняется в воркерах, что позволит в дальнейшем создавать языковые конструкции с поддержкой параллелизма
  • Вызов функций существенно ускорен за счет отказа от рефлексии
  • Для работы с плавающей запятой использована библиотека работы с Decimal-типами (абсолютная финансовая точность операций с плавающей запятой, работа с большими числами)
  • Реализованы типы Дата и Длительность с русскоязычными встроенными методами (Год, Месяц, День недели и т,д.), форматирование в русской локали и.т.п. Работа с датой и временем возможна в любой локации и часовом поясе, при сравнении дат и времени это автоматически учитывается. Возможна работа с местным временем, и преобразование в другие часовые пояса / локации типа Europe/Moscow.
  • Добавлена быстрая хэш-функция на ассемблере https://github.com/dchest/siphash, для хэширования строк, структур и массивов (требуется в различных алгоритмах, где нужна проверка на уникальность больших/составных значений)
  • Добавлено сравнение системных функциональных структур через хэши их бинарного представления
  • Добавлены быстрые преобразования всех базовых типов в JSON, binary и обратно (в т.ч. и функциональных структур) - задел на будущие операции с сетевыми протоколами RPC, JSON-RPC и т.п.
  • Массивы и структуры получили операции коньюкции, дизньюкции и т.п. в виде обычного сложения, вычитания и т.д.

Простые тесты показывают хороший прирост производительности по сравнению с версией 2.0. Например, рекурсивный тест Фибоначчи увеличил производительность в два раза. Вместе с тем, в угоду производительности (избавление от рефлексии практически везде), утрачена былая гибкость использования функций в нативном исполнении на Го. Теперь необходимо писать более строгую обертку для типов, полей, методов и функций, которые должны быть доступны из языка Го. Это компенсируется на порядок более высокой производительностью и меньшим потреблением памяти.

Гонец 2.0b

06 Sep 19:39
Compare
Choose a tag to compare

Финальная версия для бета-тестирования.

Гонец 2.0a

03 Sep 07:16
Compare
Choose a tag to compare
Гонец 2.0a Pre-release
Pre-release

Реализована новая регистровая виртуальная машина, которая от 2х до 10 раз быстрее исполняет код за счет предварительной компиляции кода в линейную структуру из простых команд, по сравнению с предыдущей стэковой версией.
Работа старой стэковой версии интерпретатора сохранена (запускать с ключом -stack), но в будущих релизах будет удалена.
Усовершенствована работа с модулями, появилась компиляция в бинарный файл ".gnx" для распространения модулей без исходного кода.
Множество улучшений и исправлений ошибок.
Несомненно, появились и новые ошибки, которые будут устраняться в результате альфа-тестирования.

Гонец 1.8b

21 Aug 22:48
Compare
Choose a tag to compare
Гонец 1.8b Pre-release
Pre-release

Изменения:

  • Ускорение интерпретации. Добавлена оптимизация: свертка констант (чисел, строк, структур, массивов) до начала интерпретации. Свертка происходит в нативное представление Го

  • Добавлена работа с диапазонами массивов и строк. Можно выделять диапазон массива или строки в отдельный массив (или строку), связанный с исходным (до момента реаллокации в памяти) и работать с ним. Можно изменять значение диапазона в массиве и строках. Индексы диапазонов и единичных значений могут быть отрицательными (тогда они считаются с конца, как в python)
    Пример:

а = "зцщоазцущоа"
б = а[3:7] // подстрока, не включая правую границу, как в python и golang
в = а[-3:] // последние 3 символа
г = а[:2] // первые два символа
сообщить(а,б,в,г)
а[3:6]="кущ" // длина 3 символа, должна совпадать с диапазоном,
// индекс конца не включается, в строке "а" будет заменен фрагмент с 3 по 5 символ
сообщить(а)

Результат:

зцщоазцущоа оазц щоа зц
зцщкущцущоа
  • Исправлены ошибки работы с методами и полями системных функциональных структур

  • Добавлены номера строк в демонстрационный вэб-интерфейс

Гонец 1.7b

20 Aug 08:51
Compare
Choose a tag to compare
Гонец 1.7b Pre-release
Pre-release

Отлажена работа с библиотечными функциональными структурными типами (метаданными).
Изменился синтаксис работы с такими типами.
Теперь можно создавать переменные библиотечных типов с помощью конструкций:

  • Новый(имя_структурного_функционального_типа_строкой) - создает новую переменную такого типа

  • Новый(имя_структурного_функционального_типа_строкой, источник_заполнения) - создает новую переменную такого типа и заполняет ее из json представления, если источник типа "строка", или заполняет значениями структуры, если тип "структура".

Обновлена документация.

Релиз для Windows x64 и Linux x64. Один исполняемый файл, без зависимостей.