'

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

Понравилась презентация – покажи это...





Слайд 0

F# функциональный язык «новой» волны Артем Присяжнюк Kiev ALT.NET 2010


Слайд 1

Представлюсь Артем Присяжнюк Технический директор компании ХостТрекер Опыт работы с ФЯ – 10 лет (Ocaml, F#) ХостТрекер – распределенная система мониторинга доступности сайтов a.p@host-tracker.com http://host-tracker.com


Слайд 2

Рожденные в 2000-х F#(2002) Scala (2003) Nemerle (2005) Clojure (2007) C#/VB.NET LINQ/PLINQ, lambda ФЯ от Intel. 2011? Явный уклон в функциональшину


Слайд 3

Это ж-ж-ж неспроста!


Слайд 4

Текущий тренд в железе – мультиядерность Вместо роста ввысь рост в ширь Количество CPU Герцы


Слайд 5

Две основные тенденции Приход MultyCPU-систем в широкие массы На «десктопе» теперь по идее можно решать более «тяжелые» задачи; Приход масс в интернет Нужны высоконагруженные, высокопроизводительные системы.


Слайд 6

Нужны «эффективные» программы «заточенные» под мультиядерность. В идеале, на N CPU система должна: работать в N раз быстрее; обслуживать в N раз больше пользователей; выполнять в N раз больше транзакций.


Слайд 7

Старые подходы не оправдали себя Развития софта не успевает за развитием железа; Софт не эффективно работает на новом железе; Плохо масштабируется; С ростом сложности систем, сложность программ растет экспоненциально.


Слайд 8


Слайд 9

Параллельное программирование вышло в массы Нужны языки/платформы/инструменты «с человеческим лицом» для разработки многопотоковых программ; Появление новых ФЯ программирования, дает надежду на появление новых таковых.


Слайд 10

Поддержка параллелизма «Старый» подход Уровень примитивов сторонних библиотек, ядра ОС «Новый» подход Уровень парадигмы самого языка


Слайд 11

Императивный подход Изменяемые данные - да Разделяемые изменяемые данные - да Side эффекты – да Блокировки, синхронизации – да Межпотоковое взаимодействие – разделяемые ресурсы


Слайд 12

Mutable shared state


Слайд 13

Проблемы с блокировками и разделяемыми ресурсами Мало блокировок Много блокировок Неправильное использование блокировок Блокировки в неверном порядке Следствия Dead-lock-и Нарушение целостности данных Race condition Плохая повторяемость (трудность отладки)


Слайд 14

Функциональный подход Изменяемые данные – нет Разделяемые изменяемые данные – нет Side эффекты – нет Блокировки, синхронизации – нет Межпотоковое взаимодействие – сообщения, Map/Reduce


Слайд 15

Кто использовал функциональное программирование на практике?


Слайд 16

Кто использовал функциональное программирование на практике? Электронные таблицы (Excel) XSLT SQL


Слайд 17

Носители «Нового» подхода Функциональное программирование Agent & message-passing style programming (Erlang) Async C? Axum LINQ, PLINQ Rx Framework Task Parallel library C# F#


Слайд 18

История F# (2002) Лямбда-счисление 1936 Lisp/Schema 1958 ML 1970 Hindley–Milner Система типов Ocaml 1996 Синтаксис Система типов Код Генерики (Don Syme Привет c# 2.0) Дон Сайм портировал Ocaml на .NET (2002)


Слайд 19

История 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


Слайд 20

Развитие языков Safety Usefulnes C#, VB.NET, Java LINQ Haskell F# Нирвана


Слайд 21

Основные направления развития языков Упрощение технологий (Пример SGML -> XML) Безопасность кода Перенос рутинных задач на компилятор /рантайм (GC, Type inference) ; Строгая типизация + автоматический вывод типов; Мета программирование Макросы - изменение языка Синтаксис (выразительность, краткость) Потокобезопасность Параллелизм - на уровень языка.


Слайд 22

FP, F#, Haskell & друзья как источник идей Движение концепций F# -> C# Generics Lambda LINQ (former monads) Type inference Async List comprehension ?


Слайд 23

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)


Слайд 24

Что нужно чтобы научиться есть палочками?


Слайд 25

Что нужно чтобы научиться есть палочками? Есть палочками Выкинуть вилки/ложки


Слайд 26

Что нужно чтобы научится программировать функционально?


Слайд 27

Что нужно чтобы научится программировать функционально? Программировать функционально; Выкинуть из обихода императивные конструкции.


Слайд 28

Выворачиваем с изнанки Императивный стиль -> 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


Слайд 29

Тяжелое наследие прошлого 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


Слайд 30

Выворачиваем с изнанки Паралельное программирование Миграция с lock style на message passing style Использование не мутабельных данных Async First class events


Слайд 31

Асинхронная обработка Ключ к построению производительных, хорошо масштабируемых систем; Уши растут из I/O Completion Ports, который очень сложен в использовании; .NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.


Слайд 32

Async-workflow Идея спрятать, BeginXXX и EndXXX для асинхронных операций. Дать программисту такой же легкий способ выполнять асинхронные операции, как и синхронные.


Слайд 33

Sync code VS Async code


Слайд 34

Erlang Message Passing Concurrency Много легких процессов(agents) Нет общего состояния No sequential bottlenecks Сообщения для коммуникации между процессами Немутабельный состояние - аналогия с системой контроля версий


Слайд 35

Mailbox processing & Message passing style У нас очень много легких агентов которые выполняют некоторую работу; У каждого агента есть Mailbox с очередью, через который он получает сообщения из вне; Агенты могут посылать сообщения как другим агентам, так и себе; У каждого агента есть внутреннее состояние (аналогия с контролем версий)


Слайд 36

Mailbox processing & Message passing style Вся работа происходит асинхронно (Async); Блокирующих операций нет; Сотни тысяч агентов могут жить в десятке потоков из ThreadPool; Все отлично растягивается по доступным процессорам/ядрам


Слайд 37

Demo


Слайд 38

Спасибо за внимание Вопросы?


×

HTML:





Ссылка: