F# функциональный язык «новой» волны Артем Присяжнюк Kiev ALT.NET 2010
Представлюсь Артем Присяжнюк Технический директор компании ХостТрекер Опыт работы с ФЯ – 10 лет (Ocaml, F#) ХостТрекер – распределенная система мониторинга доступности сайтов
Рожденные в 2000-х F#(2002) Scala (2003) Nemerle (2005) Clojure (2007) C#/VB.NET LINQ/PLINQ, lambda ФЯ от Intel. 2011? Явный уклон в функциональшину
Это ж-ж-ж неспроста!
Текущий тренд в железе – мультиядерность Вместо роста ввысь -рост в ширь Количество CPU Герцы
Две основные тенденции Приход MultyCPU-систем в широкие массы На «десктопе» теперь по идее можно решать более «тяжелые» задачи; Приход масс в интернет Нужны высоконагруженные, высокопроизводительные системы.
Нужны «эффективные» программы «заточенные» под мультиядерность. В идеале, на N CPU система должна: – работать в N раз быстрее; – обслуживать в N раз больше пользователей; – выполнять в N раз больше транзакций.
Старые подходы не оправдали себя Развития софта не успевает за развитием железа; Софт не эффективно работает на новом железе; Плохо масштабируется; С ростом сложности систем, сложность программ растет экспоненциально.
Параллельное программирование вышло в массы Нужны языки/платформы/инструменты «с человеческим лицом» для разработки многопотоковых программ; Появление новых ФЯ программирования, дает надежду на появление новых таковых.
Поддержка параллелизма «Старый» подход Уровень примитивов сторонних библиотек, ядра ОС «Новый» подход Уровень парадигмы самого языка
Императивный подход Изменяемые данные - да Разделяемые изменяемые данные - да Side эффекты – да Блокировки, синхронизации – да Межпотоковое взаимодействие – разделяемые ресурсы
Mutable shared state
Проблемы с блокировками и разделяемыми ресурсами Мало блокировок Много блокировок Неправильное использование блокировок Блокировки в неверном порядке Следствия Dead-lock-и Нарушение целостности данных Race condition Плохая повторяемость (трудность отладки)
Функциональный подход Изменяемые данные – нет Разделяемые изменяемые данные – нет Side эффекты – нет Блокировки, синхронизации – нет Межпотоковое взаимодействие – сообщения, Map/Reduce
Кто использовал функциональное программирование на практике?
Электронные таблицы (Excel) XSLT SQL
Носители «Нового» подхода Функциональное программирование Agent & message-passing style programming (Erlang) Async Cω Axum LINQ, PLINQ Rx Framework Task Parallel library C# F#
История F# (2002) Лямбда-счисление 1936 Lisp/Schema 1958 ML 1970 Hindley–Milner Система типов Ocaml 1996 – Синтаксис – Система типов – Код – Генерики (Don Syme Привет c# 2.0) Дон Сайм портировал Ocaml на.NET (2002)
История 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
Развитие языков Safety Usefulnes C#, VB.NET, Java LINQ Haskell F#Нирвана
Основные направления развития языков Упрощение технологий (Пример SGML -> XML) Безопасность кода Перенос рутинных задач на компилятор /рантайм (GC, Type inference) ; Строгая типизация + автоматический вывод типов; Мета программирование Макросы - изменение языка Синтаксис (выразительность, краткость) Потокобезопасность Параллелизм - на уровень языка.
FP, F#, Haskell & друзья как источник идей Движение концепций F# -> C# Generics Lambda LINQ (former monads) Type inference Async List comprehension ?
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)
Что нужно чтобы научиться есть палочками?
a)Есть палочками b)Выкинуть вилки/ложки
Что нужно чтобы научится программировать функционально?
Программировать функционально; Выкинуть из обихода императивные конструкции.
Выворачиваем с изнанки Императивный стиль -> 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
Тяжелое наследие прошлого 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
Выворачиваем с изнанки Паралельное программирование Миграция с lock style на message passing style Использование не мутабельных данных Async First class events
Асинхронная обработка Ключ к построению производительных, хорошо масштабируемых систем; Уши растут из I/O Completion Ports, который очень сложен в использовании;.NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.
Async-workflow Идея спрятать, BeginXXX и EndXXX для асинхронных операций. Дать программисту такой же легкий способ выполнять асинхронные операции, как и синхронные.
Sync code VS Async code
Erlang Message Passing Concurrency Много легких процессов(agents) Нет общего состояния No sequential bottlenecks Сообщения для коммуникации между процессами Немутабельный состояние - аналогия с системой контроля версий
Mailbox processing & Message passing style У нас очень много легких агентов которые выполняют некоторую работу; У каждого агента есть Mailbox с очередью, через который он получает сообщения из вне; Агенты могут посылать сообщения как другим агентам, так и себе; У каждого агента есть внутреннее состояние (аналогия с контролем версий)
Mailbox processing & Message passing style Вся работа происходит асинхронно (Async); Блокирующих операций нет; Сотни тысяч агентов могут жить в десятке потоков из ThreadPool; Все отлично растягивается по доступным процессорам/ядрам
Demo
Спасибо за внимание Вопросы?