Функциональное программирование

Содержание

Слайд 2

Распределенный API: по 22 сервера в 2-х датацентрах (Америка, Европа). Разнообразные

Распределенный API: по 22 сервера в 2-х датацентрах (Америка, Европа).
Разнообразные клиентские

приложения: 40 desktop и web приложений.
Датацентр обрабатывает 12 000 запросов в минуту.
Ресурсоёмкие запросы и пакетные запросы.

Немного о проекте

Слайд 3

Возникла необходимость добавить новый источник данных HBase. С чего все началось?

Возникла необходимость добавить новый источник данных HBase.

С чего все началось?

Слайд 4

NoSql – ; написана на Java; аналог Google Big table; не

NoSql – <ключ значение>;
написана на Java;
аналог Google Big table;
не является заменой

SQL;
интерфейсы взаимодействия: REST, Java API, Apache THRIFT.

Что такое HBase?

Слайд 5

Apache Avro — система сериализации данных. Система использует JSON для определения

Apache Avro — система сериализации данных.
Система использует JSON для определения структуры

данных (схемы), которые сериализуются в компактный бинарный формат.

AVRO

Слайд 6

AVRO – схема

AVRO – схема

Слайд 7

HBase + Thrift-AVRO + .NET = ? AVRO AVRO TCP Socket TCP Socket

HBase + Thrift-AVRO + .NET = ?

AVRO

AVRO

TCP Socket

TCP Socket

Слайд 8

Workflow

Workflow

Слайд 9

META-DRIVEN; результат – простая таблица; возможность выполнять Map/Reduce; сохранить отношения данных; Требования

META-DRIVEN;
результат – простая таблица;
возможность выполнять Map/Reduce;
сохранить отношения данных;

Требования

Слайд 10

Проблемы большие вложенные AVRO схемы до 1 000 000 строк; AVRO

Проблемы

большие вложенные AVRO схемы до 1 000 000 строк;
AVRO не дружит

с .NET;
после десериализации AVRO Dictionary.
Слайд 11

Что делать? А давайте напишем свой DSL!

Что делать?

А давайте напишем свой DSL!

Слайд 12

Разработка синтаксиса

Разработка синтаксиса

Слайд 13

А давай еще Join’s

А давай еще Join’s

Слайд 14

А как быстро написать парсер?

А как быстро написать парсер?

Слайд 15

Парсинг(синтаксический анализ текста) ОБЩИЙ ПОДХОД

Парсинг(синтаксический анализ текста)

ОБЩИЙ ПОДХОД

Слайд 16

Парсер генератор на основе формальных языков (ANTLR). Подключаемая библиотека комбинаторных парсеров (Sprache, SuperPower). ... Выбор

Парсер генератор на основе формальных языков (ANTLR).
Подключаемая библиотека комбинаторных парсеров (Sprache,

SuperPower).
...

Выбор

Слайд 17

Написать руками

Написать руками

Слайд 18

ANTLR (Another Tool for Language Recognition) Расширенная форма Бэкуса — Наура Генератор на основе формальных языков

ANTLR (Another Tool for Language Recognition)
Расширенная форма Бэкуса — Наура

Генератор на

основе формальных языков
Слайд 19

декларативный синтаксис; строгое соблюдение грамматики; не нужно думать о performance; не

декларативный синтаксис;
строгое соблюдение грамматики;
не нужно думать о performance;
не нужно писать документацию.

Генератор

на основе формальных языков

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

Плюсы

Недостатки

Слайд 20

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

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

look ahead;
возможности в runtime;
не требует предварительной токенизации(лексера).

Комбинаторные парсеры (Sprache и т.д.)

компромисс между декларативностью производительностью;
проблемы с левой рекурсией;
придется учить API;
только для вашего языка.
может не иметь предварительной токенизации.

Плюсы

Недостатки

Слайд 21

никакого внешнего кода; поддается к индивидуальным требованиям; потенциально быстр, как только

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

Рукописные

парсеры

все писать с 0;
создание быстрых парсеров требует опыта;
выражения с инфиксными операторами(приоритеты).

Плюсы

Недостатки

Слайд 22

Причем тут функциональное прог-ие? Основные концепции: неизменяемые структуры данных; чистые функции; функции высших порядков; рекурсия.

Причем тут функциональное прог-ие?

Основные концепции:
неизменяемые структуры данных;
чистые функции;
функции высших порядков;
рекурсия.

Слайд 23

Императивное vs Функциональное

Императивное vs Функциональное

Слайд 24

Написать примитивные парсеры(функции). Написать функции для комбинирования. Скомбинировать простые парсеры в

Написать примитивные парсеры(функции).
Написать функции для комбинирования.
Скомбинировать простые парсеры в более сложные.
PROFIT!

Don’t

panic it’s monadic!
Слайд 25

type Parser = String -> Tree type Parser = String ->

type Parser = String -> Tree
type Parser = String -> (String,

Tree)
type Parser = String -> (String, T)
type Parser = TInput -> (TInput, T)

Сигнатура нашего парсера

Слайд 26

Пишем простой комбинаторный парсер Выражение : “42 + 5” 42 +

Пишем простой комбинаторный парсер

Выражение : “42 + 5”

42 + 5

expression

+

42

5

Left operand

right operand

operator

Слайд 27

Парсим простое выражение : “42 + 5” Railroad - диаграмма Грамматика в БНФ

Парсим простое выражение : “42 + 5”

Railroad - диаграмма

Грамматика в БНФ

Слайд 28

Библиотеки с готовым набором комбинаторных парсеров для С# небольшая библиотека, совместима

Библиотеки с готовым набором комбинаторных парсеров для С#

небольшая библиотека, совместима .NET

Core;
простой, но богатый API;
много используется в “боевых проектах”: R#, Octostache, EasyNetQ, Seq.
форк Sprache с блэк джеком и …;
использует токинезатор;
парсит потоки токенов, а не поток символов;
хорошие сообщения об ошибках, легко кастомизируются;
работает быстрее.

https://github.com/sprache/Sprache

https://github.com/datalust/superpower

Sprache

Слайд 29

Готовый код парсера для “42 + 5”

Готовый код парсера для “42 + 5”

Слайд 30

Ну, а как же без TDD?

Ну, а как же без TDD?

Слайд 31

Давайте усложним : “42 + 5 - 7” Railroad - диаграмма Грамматика в БНФ

Давайте усложним : “42 + 5 - 7”

Railroad - диаграмма

Грамматика в

БНФ
Слайд 32

Парсер на Sprache “42 + 5 - 7”

Парсер на Sprache “42 + 5 - 7”

Слайд 33

DSL (Domain-specific language) Пример: XPath, SQL; использование NoSQL; не хватает всей

DSL (Domain-specific language) Пример: XPath, SQL;
использование NoSQL;
не хватает всей “Мощи” XML;
разработка

IDE или плагинов к ним;
клиентские приложения, например, поиск;
анализ документов.

Когда и зачем писать свои парсеры?

Слайд 34

Что внутри?

Что внутри?

Слайд 35

Тип Result

Тип Result

Слайд 36

Тип Input (обертка над string)

Тип Input (обертка над string)

Слайд 37

Начнем с простых парсеров

Начнем с простых парсеров

Слайд 38

Пишем первый комбинирующий парсер Parser Parser Then

Пишем первый комбинирующий парсер

Parser

Parser

Then

Слайд 39

Строим путь к LINQ’s query синтаксису

Строим путь к LINQ’s query синтаксису

Слайд 40

Комбинируем

Комбинируем

Слайд 41

Полный код на GitHub

Полный код на GitHub

Слайд 42

Фрагмент из клипа Thrift shop ☺ HASL – HBase Avro Snapshot Language

Фрагмент из клипа Thrift shop ☺

HASL – HBase Avro Snapshot Language

Слайд 43

прототип был написан за 1 вечер на Sprache; был переписан на

прототип был написан за 1 вечер на Sprache;
был переписан на Superpower;
в

дальнейшем все изменения занимали 1-2 часа.

Разработка

Слайд 44

Что получилось достичь за 1 день?

Что получилось достичь за 1 день?

Слайд 45

Транформирует объекты в таблицу. Ориентирован на AVRO-схему. Селекторы для всех типов:

Транформирует объекты в таблицу.
Ориентирован на AVRO-схему.
Селекторы для всех типов: object, type[],

примитивы.
Фильтры для [].
API функций для сложных вычислений и фильтраций.
Поддержка Join’ов.

Особенности HASL

Слайд 46

Перформанс HASL - Основа Core-I7 6700 3.40 GHz. Windows server 2010. x64.

Перформанс HASL - Основа

Core-I7 6700 3.40 GHz.
Windows server 2010.

x64.
Слайд 47

3 424 знаков. 120 строк. 3 Join’а. 102 селектора. 25 с

3 424 знаков.
120 строк.
3 Join’а.
102 селектора.

25 с фильтрами.
Полностью отформатирован.

Перформанс HASL – Тестовые данные

Слайд 48

Перформанс HASL - Результаты

Перформанс HASL - Результаты

Слайд 49

Схема

Схема

Слайд 50

Пример запроса

Пример запроса

Слайд 51

Результат

Результат

Слайд 52

Спасибо за внимание!

Спасибо за внимание!