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

Содержание

Слайд 2

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

Распределенный API: по 22 сервера в 2-х датацентрах (Америка, Европа). Разнообразные клиентские
40 desktop и web приложений.
Датацентр обрабатывает 12 000 запросов в минуту.
Ресурсоёмкие запросы и пакетные запросы.

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

Слайд 3

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

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

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

Слайд 4

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

NoSql – ; написана на Java; аналог Google Big table; не является
взаимодействия: 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 -> (String, Tree)
type

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

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

Слайд 26

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

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

42 + 5

expression

+

42

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

Left operand

right operand

operator

Слайд 27

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

Railroad - диаграмма

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

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

Слайд 28

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

небольшая библиотека, совместима .NET Core;
простой,

Библиотеки с готовым набором комбинаторных парсеров для С# небольшая библиотека, совместима .NET
но богатый 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;
не хватает всей “Мощи” XML;
разработка IDE

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

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

Слайд 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;
был переписан на Superpower;
в дальнейшем

прототип был написан за 1 вечер на Sprache; был переписан на Superpower;
все изменения занимали 1-2 часа.

Разработка

Слайд 44

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

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

Слайд 45

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

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

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

Спасибо за внимание!
Имя файла: Функциональное-программирование.pptx
Количество просмотров: 37
Количество скачиваний: 0