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

873 views
803 views

Published on

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

No Downloads
Views
Total views
873
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Автор Scala   Martin Odersky также как и Дон Сайм, работал над генериками, только для Явы
  • F# функциональный язык "новой" волны

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

    ×