f# - функциональный язык «новой» волны
Post on 22-Jun-2015
1.159 Views
Preview:
DESCRIPTION
TRANSCRIPT
F# функциональный язык «новой» волны
Артем ПрисяжнюкKiev ALT.NET 2010
Представлюсь
• Артем Присяжнюк• Технический директор компании ХостТрекер• Опыт работы с ФЯ – 10 лет (Ocaml, F#)
• ХостТрекер – распределенная система мониторинга доступности сайтов
• a.p@host-tracker.com• http://host-tracker.com
Рожденные в 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
Use
fuln
es
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 SafetyAny 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
Спасибо за внимание
Вопросы?
top related