Skip to content

Latest commit

 

History

History
260 lines (184 loc) · 11.6 KB

PITCHME.md

File metadata and controls

260 lines (184 loc) · 11.6 KB

Гонец:Микросервисы

Gonec Logo

Платформа создана для решения программистами 1С задач с использованием синтаксиса языка, похожего, но не ограниченного возможностями языка 1С:

  • высокопроизводительные распределенные вычисления
  • создание и быстрое развертывание микросервисов, вэб-сервисов и вэб-порталов для работы тысяч пользователей
  • работа с высокоэффективными базами данных

Встроив Гонец в свое решение, Вы сможете предоставить высокий уровень сервиса для своих клиентов, который обгонит решения ваших конкурентов.


Платформа разрабатывается “от простого к сложному”

На начальных этапах будет включена базовая функциональность многопоточных вычислений и сетевых сервисов

В перспективе планируется организация работы с различными базами данных и визуализация управляемых форм, созданных в конфигураторе 1С


Почему синтаксис похож на 1С?

Синтаксис 1С знаком и удобен сотням тысяч программистов в России и СНГ

Это позволяет создавать решения, которые могут поддерживаться программистами 1С, и которые не будут требовать дополнительной квалификации


Отличия от языка 1С

Язык интерпретатора поддерживает синтаксис языка 1С, но дополнительно к этому имеет возможности, унаследованные от синтаксиса языка Go (Golang), Lua и Javascript


Отличия от языка 1С

Многопоточное программирование: создание и работа с параллельно выполняемыми функциями и каналами передачи информации между ними (полный аналог chan и go из языка Го)


Отличия от языка 1С

Поддержка срезов массивов и строк, как в языке Python (высокоскоростная реализация на слайсах Go)


Отличия от языка 1С

Поддержка множества возвращаемых значений из функций и множественного присваивания между переменными (а,б=б,а) как в языке Go


Отличия от языка 1С

Возможность указания структурных литералов и содержимого массивов прямо в исходном коде (как в Go)


Отличия от языка 1С

Передача функций как параметров (функциональное программирование)


Описание синтаксиса языка и примеры использования интерпретатора

Документация находится здесь


Архитектура платформы

---?image=/extra/architecture.png&size=auto 92%


Архитектура языка Гонец

---?image=/extra/langarch.png&size=auto 92%


Масштабируемость языка и платформы

Язык Гонец расширяется путем изменения правил синтаксиса в формате YACC, а так же написания библиотек структур и функций на Го, которые могут быть доступны как объекты метаданных в языке Гонец


В системных библиотеках языка могут создаваться объекты метаданных, при импорте соответствующей библиотеки

Данные объекты метаданных являются функциональными структурными типами, функциональность которых скомпилирована на языке Го

Объекты таких метаданных имеют встроенные методы для работы с ними

Компиляция усовершенствованной версии интерпретатора выполняется одной командой go build . в папке с исходными текстами, и занимает всего несколько секунд


Интерпретатор может и создавать микросервисы, и сам выступать в роли такого микросервиса

Посмотреть на использование интерпретатора в роли микросервиса можно по ссылке

В этой реализации в интерпретатор встроена простая система запуска кода через обычный браузер, которая работает на технологии ajax, общающаяся с микросервисом сессий исполнения кода интерпретатором, по протоколу HTTP


Производительность интерпретатора

Производительность выше, чем у интерпретатора платформы 1С.

Скорость интерпретации кода соответствует скорости программ на Go и скорости работы библиотек, написанных на Go


Основные преимущества языка Go, которые позволят создавать производительные решения на языке Гонец:

  • Кроссплатформенная компиляция - исполнение на любых устройствах
  • Возможно создание функций на ассемблере и на C - для взаимодействия со специфичными драйверами устройств, например
  • Встроенная система горутин и каналов для обеспечения параллельной обработки информации
  • Оптимизированный SSA-компилятор в версии Go 1.9
  • Быстрый и оптимизированный сборщик мусора - во время работы программ память используется минимально
  • Переиспользуется ранее выделенная память - существенное ускорение за счет отсутствия лишних malloc
  • Структуры хэшированы по ключам, слайсы работают очень быстро
  • Оптимизирован для создания нагруженных сервисов

На платформе Гонец возможна реализация как обработки больших объемов данных, так и обработки часто поступающих запросов


Технологическая основа

Интерптетатор реализован на языке Go путем адаптации исходных кодов интерпретатора языка anko (https://github.com/mattn/anko)

Интерпретатор использует собственную регистровую виртуальную машину, также написанную на языке Go, а значит, имеет отличную производительность и стабильность

Исходный код на языке Гонец преобразуется в специальный байткод, который исполняется максимально быстро с минимальной нагрузкой на garbage collector

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


Оптимизации в интерпретаторе языка

Используется оптимизация "свертка констант"


Пример преобразования в байткод

а = [](0,1000*1000)
для н=1 по 10*10*10000 цикл
  а=а+[н]+[н*10] //постоянно выделяется память для объединения массивов
конеццикла
к=0
для каждого н из а цикл
  к=к+н
конеццикла
сообщить(к)
а=Новый("__функциональнаяструктуратест__")
а.ПолеСтрока = "авузлхвсзщл"
а.ПолеСтрока = "АВ"+а.ПолеСтрока[2:]
сообщить(а.ВСтроку(), а.ПолеСтрока+":ok")

Скомпилированный код для виртуальной машины

LOAD r0, 0
LOAD r1, 1000000
MAKEARR r0, LEN r0, CAP r1
SET "а", r0
LOAD r1, 1
LOAD r2, 1000000
FORNUM r0, FROM r1, TO r2, BREAK TO L1
L2:
NEXTNUM r0, ENDLOOP L1
SET "н", r0
GET r3, "а"
MAKESLICE r4, LEN 1, CAP 1
GET r5, "н"
SETIDX r4[0], r5
OP r3, "+", r4
MAKESLICE r4, LEN 1, CAP 1
GET r5, "н"
LOAD r6, 10
OP r5, "*", r6
SETIDX r4[0], r5
OP r3, "+", r4
SET "а", r3
JMP L2
L1:
POPFOR L2
LOAD r0, 0
SET "к", r0
GET r0, "а"
FOREACH r0, ITER r1, BREAK TO L3
L4:
NEXT r2, FROM r0, ITER r1, ENDLOOP L3
SET "н", r2
GET r3, "к"
GET r4, "н"
OP r3, "+", r4
SET "к", r3
JMP L4
L3:
POPFOR L4
GET r0, "к"
CALL "сообщить", ARGS r0, ARGS_COUNT 1, VARARG false, GO false, RETURN r0
LOAD r0, "__функциональнаяструктуратест__"
SETNAME r0
MAKE r0 AS TYPE r0
SET "а", r0
LOAD r0, "авузлхвсзщл"
GET r1, "а"
SETMEMBER r1."ПолеСтрока", r0
LOAD r0, "АВ"
GET r1, "а"
GETMEMBER r1, "ПолеСтрока"
LOAD r2, 2
LOAD r3, <nil>
SLICE r1[r2 : r3]
OP r0, "+", r1
GET r1, "а"
SETMEMBER r1."ПолеСтрока", r0
GET r0, "а"
GETMEMBER r0, "ВСтроку"
CALL REG r0, ARGS r1, ARGS_COUNT 0, VARARG false, GO false, RETURN r0
GET r1, "а"
GETMEMBER r1, "ПолеСтрока"
LOAD r2, ":ok"
OP r1, "+", r2
CALL "сообщить", ARGS r0, ARGS_COUNT 2, VARARG false, GO false, RETURN r0

Результат исполнения

5500005500000
ПолеЦелоеЧисло=0, ПолеСтрока=АВузлхвсзщл АВузлхвсзщл:ok
Время компиляции: 0s
Время исполнения: 1.7867144s

Gonec Logo

MIT License (C) Роман Цованян, 2017

[email protected]