F# - функциональный язык «новой» волны

1,380 views

Published on

* Функциональные языки - как ответ на новые тенденции в развитии аппаратного обеспечения.
* F#. История. Идеология, концепции, возможности.
* ФП – холодный старт. Миграция с императивных конструкций на функциональные.
* Основные механизмы для построения высоконадежных, масштабируемых, распределенных систем.
* Примеры использования Async, Mailbox message processing.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,380
On SlideShare
0
From Embeds
0
Number of Embeds
201
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

F# - функциональный язык «новой» волны

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

×