* Функциональные языки - как ответ на новые тенденции в развитии аппаратного обеспечения.
* F#. История. Идеология, концепции, возможности.
* ФП – холодный старт. Миграция с императивных конструкций на функциональные.
* Основные механизмы для построения высоконадежных, масштабируемых, распределенных систем.
* Примеры использования Async, Mailbox message processing.
2. Представлюсь Артем Присяжнюк Технический директор компании ХостТрекер Опыт работы с ФЯ – 10 лет (Ocaml, F#) ХостТрекер – распределенная система мониторинга доступности сайтов a.p@host-tracker.com http://host-tracker.com
3. Рожденные в 2000-х F#(2002) Scala(2003) Nemerle (2005) Clojure (2007) C#/VB.NET LINQ/PLINQ, lambda ФЯ от Intel. 2011? Явный уклон в функциональшину
6. Нужны «эффективные» программы «заточенные» под мультиядерность. В идеале, на NCPU система должна: работать в N раз быстрее; обслуживать в N раз больше пользователей; выполнять в N раз больше транзакций.
7. Старые подходы не оправдали себя Развития софта не успевает за развитием железа; Софт не эффективно работает на новом железе; Плохо масштабируется; С ростом сложности систем, сложность программ растет экспоненциально.
8.
9. Параллельное программирование вышло в массы Нужны языки/платформы/инструменты «с человеческим лицом» для разработки многопотоковых программ; Появление новых ФЯ программирования, дает надежду на появление новых таковых.
10. Поддержка параллелизма «Старый» подход Уровень примитивов сторонних библиотек, ядра ОС «Новый» подход Уровень парадигмы самого языка
11. Императивный подход Изменяемые данные - да Разделяемые изменяемые данные - да Side эффекты – да Блокировки, синхронизации – да Межпотоковое взаимодействие – разделяемые ресурсы
13. Проблемы с блокировками и разделяемыми ресурсами Мало блокировок Много блокировок Неправильное использование блокировок Блокировки в неверном порядке Следствия Dead-lock-и Нарушение целостности данных Race condition Плохая повторяемость (трудность отладки)
14. Функциональный подход Изменяемые данные–нет Разделяемые изменяемые данные – нет Side эффекты – нет Блокировки, синхронизации – нет Межпотоковое взаимодействие – сообщения, Map/Reduce
18. История F# (2002) Лямбда-счисление 1936 Lisp/Schema 1958 ML 1970 Hindley–MilnerСистема типов Ocaml 1996 Синтаксис Система типов Код Генерики (Don SymeПривет c# 2.0) Дон Сайм портировалOcamlна .NET (2002)
19. История F# (2002) Haskell 1990 Seq Workflow (aka Монады) List comprehensions Python 1990 List comprehensions Whitespace indentation Erlang 1987 Message passing style Parallel processing C#/.NET OO system Framework
21. Основные направления развития языков Упрощение технологий (Пример SGML -> XML) Безопасность кода Перенос рутинных задач на компилятор/рантайм(GC,Type inference) ; Строгая типизация + автоматический вывод типов; Мета программирование Макросы - изменение языка Синтаксис (выразительность, краткость) Потокобезопасность Параллелизм - на уровень языка.
22. FP, F#, Haskell & друзья как источник идей Движение концепций F# -> C# Generics Lambda LINQ (former monads) Type inference Async List comprehension ?
23. F# features Краткость Строгая, статическая типизация Выведение типов Pattern matching Clousers Кортежи (Tuples) Currying High-order function Workflows (aka Монады) Async-framework Quatations Lazy-evalutions Multy paradigm Good integration with .NET library/family Multy Platform (Thanks Mono.NET)
27. Что нужно чтобы научится программировать функционально? Программировать функционально; Выкинуть из обихода императивные конструкции.
28. Выворачиваем с изнанкиИмперативный стиль -> FP X = x + 1 -> let x = x + 1 For/while -> let rec (tail recursion) If/switch -> pattern matching In/out параметры -> tuples Enum -> variant types Array -> List FP style OO Null -> option type
29. Тяжелое наследие прошлого Thread Safety Any public static ( Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe. Microsoft Help Library 2010
30. Выворачиваем с изнанкиПаралельное программирование Миграция с lock style на message passing style Использование не мутабельных данных Async First class events
31. Асинхронная обработка Ключ к построению производительных, хорошо масштабируемых систем; Уши растут из I/O Completion Ports, который очень сложен в использовании; .NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.
32. Async-workflow Идея спрятать, BeginXXXи EndXXX для асинхронных операций. Дать программисту такой же легкий способ выполнять асинхронные операции, как и синхронные.
34. Erlang Message Passing Concurrency Много легких процессов(agents) Нет общего состояния No sequential bottlenecks Сообщения для коммуникации между процессами Немутабельный состояние - аналогия с системой контроля версий
35. Mailbox processing & Message passing style У нас очень много легких агентов которые выполняют некоторую работу; У каждого агента есть Mailbox с очередью, через который он получает сообщения из вне; Агенты могут посылать сообщения как другим агентам, так и себе; У каждого агента есть внутреннее состояние (аналогия с контролем версий)
36. Mailbox processing & Message passing style Вся работа происходит асинхронно (Async); Блокирующих операций нет; Сотни тысяч агентов могут жить в десятке потоков из ThreadPool; Все отлично растягивается по доступным процессорам/ядрам