Слайд 1F# функциональный язык «новой» волны
Артем Присяжнюк
Kiev ALT.NET 2010
Слайд 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?
Явный
уклон в функциональшину
Слайд 5Текущий тренд в железе – мультиядерность
Вместо роста ввысь
рост в ширь
Количество
Слайд 6Две основные тенденции
Приход MultyCPU-систем в широкие массы
На «десктопе» теперь по идее
можно решать более «тяжелые» задачи;
Приход масс в интернет
Нужны высоконагруженные, высокопроизводительные системы.
Слайд 7Нужны «эффективные» программы «заточенные» под мультиядерность.
В идеале, на N CPU
система должна:
работать в N раз быстрее;
обслуживать в N раз больше пользователей;
выполнять в N раз больше транзакций.
Слайд 8Старые подходы не оправдали себя
Развития софта не успевает за развитием железа;
Софт
не эффективно работает на новом железе;
Плохо масштабируется;
С ростом сложности систем, сложность программ растет экспоненциально.
Слайд 10Параллельное программирование вышло в массы
Нужны языки/платформы/инструменты «с человеческим лицом» для
разработки многопотоковых программ;
Появление новых ФЯ программирования, дает надежду на появление новых таковых.
Слайд 11Поддержка параллелизма
«Старый» подход
Уровень примитивов сторонних библиотек, ядра ОС
«Новый» подход
Уровень парадигмы самого
языка
Слайд 12Императивный подход
Изменяемые данные - да
Разделяемые изменяемые данные - да
Side эффекты –
да
Блокировки, синхронизации – да
Межпотоковое взаимодействие – разделяемые ресурсы
Слайд 14Проблемы с блокировками и разделяемыми ресурсами
Мало блокировок
Много блокировок
Неправильное использование блокировок
Блокировки в
неверном порядке
Следствия
Dead-lock-и
Нарушение целостности данных
Race condition
Плохая повторяемость (трудность отладки)
Слайд 15Функциональный подход
Изменяемые данные – нет
Разделяемые изменяемые данные – нет
Side эффекты –
нет
Блокировки, синхронизации – нет
Межпотоковое взаимодействие – сообщения, Map/Reduce
Слайд 16Кто использовал функциональное программирование на практике?
Слайд 17Кто использовал функциональное программирование на практике?
Электронные таблицы (Excel)
XSLT
SQL
Слайд 18Носители «Нового» подхода
Функциональное программирование
Agent & message-passing style programming (Erlang)
Async
Cω
Axum
LINQ, PLINQ
Rx Framework
Task
Parallel library
C#
F#
Слайд 19История F# (2002)
Лямбда-счисление 1936
Lisp/Schema 1958
ML 1970
Hindley–Milner Система типов
Ocaml 1996
Синтаксис
Система типов
Код
Генерики
(Don Syme Привет c# 2.0)
Дон Сайм портировал Ocaml на .NET (2002)
Слайд 20История 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Развитие языков
Safety
Usefulnes
C#, VB.NET, Java
LINQ
Haskell
F#
Нирвана
Слайд 22Основные направления развития языков
Упрощение технологий (Пример SGML -> XML)
Безопасность кода
Перенос рутинных
задач на компилятор /рантайм (GC, Type inference) ;
Строгая типизация + автоматический вывод типов;
Мета программирование
Макросы - изменение языка
Синтаксис (выразительность, краткость)
Потокобезопасность
Параллелизм - на уровень языка.
Слайд 23FP, F#, Haskell & друзья как источник идей
Движение концепций F# ->
C#
Generics
Lambda
LINQ (former monads)
Type inference
Async
List comprehension
?
Слайд 24F# 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)
Слайд 25Что нужно чтобы научиться есть палочками?
Слайд 26Что нужно чтобы научиться есть палочками?
Есть палочками
Выкинуть вилки/ложки
Слайд 27Что нужно чтобы научится программировать функционально?
Слайд 28Что нужно чтобы научится программировать функционально?
Программировать функционально;
Выкинуть из обихода императивные конструкции.
Слайд 29Выворачиваем с изнанки
Императивный стиль -> 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
Слайд 30Тяжелое наследие прошлого
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
Слайд 31Выворачиваем с изнанки
Паралельное программирование
Миграция с lock style на message passing style
Использование
не мутабельных данных
Async
First class events
Слайд 32Асинхронная обработка
Ключ к построению производительных, хорошо масштабируемых систем;
Уши растут из I/O
Completion Ports, который очень сложен в использовании;
.NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.
Слайд 33Async-workflow
Идея спрятать, BeginXXX и EndXXX для асинхронных операций.
Дать программисту такой же
легкий способ выполнять асинхронные операции, как и синхронные.
Слайд 35Erlang Message Passing Concurrency
Много легких процессов(agents)
Нет общего состояния
No sequential bottlenecks
Сообщения для
коммуникации между процессами
Немутабельный состояние - аналогия с системой контроля версий
Слайд 36Mailbox processing & Message passing style
У нас очень много легких агентов
которые выполняют некоторую работу;
У каждого агента есть Mailbox с очередью, через который он получает сообщения из вне;
Агенты могут посылать сообщения как другим агентам, так и себе;
У каждого агента есть внутреннее состояние (аналогия с контролем версий)
Слайд 37Mailbox processing & Message passing style
Вся работа происходит асинхронно (Async);
Блокирующих операций
нет;
Сотни тысяч агентов могут жить в десятке потоков из ThreadPool;
Все отлично растягивается по доступным процессорам/ядрам