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

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

Embed Size (px)

Citation preview

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

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

Артем ПрисяжнюкKiev.Alt NET 2010

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

Представлюсь

• Артем Присяжнюк• Технический директор компании ХостТрекер• Опыт работы с ФЯ – 10 лет (Ocaml, F#)

• ХостТрекер – распределенная система мониторинга доступности сайтов

[email protected]• http://host-tracker.com

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

Рожденные в 2000-х

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

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

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

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

Текущий тренд в железе – мультиядерность

Вместо роста ввысь - рост в ширь

Количество CPU

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

Две основные тенденции

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

• Приход масс в интернетНужны высоконагруженные, высокопроизводительные системы.

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

• Нужны «эффективные» программы «заточенные» под мультиядерность.

• В идеале, на N CPU система должна:–работать в N раз быстрее;–обслуживать в N раз больше

пользователей;– выполнять в N раз больше транзакций.

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

Старые подходы не оправдали себя

• Развития софта не успевает за развитием железа;

• Софт не эффективно работает на новом железе;

• Плохо масштабируется;• С ростом сложности систем, сложность

программ растет экспоненциально.

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

Параллельное программирование вышло в массы

• Нужны языки/платформы/инструменты «с человеческим лицом» для разработки многопотоковых программ;

• Появление новых ФЯ программирования, дает надежду на появление новых таковых.

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

Поддержка параллелизма

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

«Новый» подходУровень парадигмы самого языка

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

Императивный подход

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

разделяемые ресурсы

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

Mutable shared state

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

Проблемы с блокировками и разделяемыми ресурсами

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

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

Функциональный подход

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

сообщения, Map/Reduce

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

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

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

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

• Электронные таблицы (Excel)• XSLT• SQL

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

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

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

История F# (2002)

• Лямбда-счисление 1936

• Lisp/Schema 1958• ML 1970

• Hindley–Milner Система типов

• Ocaml 1996– Синтаксис– Система типов– Код– Генерики (Don Syme

Привет c# 2.0)

• Дон Сайм портировал Ocaml на .NET (2002)

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

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

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

Развитие языков

Safety

C#, VB.NET, Java

LINQ

Haskell

F# Нирвана

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

Основные направления развития языков

• Упрощение технологий (Пример SGML -> XML)• Безопасность кода• Перенос рутинных задач на компилятор /рантайм

(GC, Type inference) ;• Строгая типизация + автоматический вывод типов;• Мета программирование • Макросы - изменение языка• Синтаксис (выразительность, краткость)• Потокобезопасность• Параллелизм - на уровень языка.

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

FP, F#, Haskell & друзья как источник идей

Движение концепций F# -> C#• Generics• Lambda• LINQ (former monads)• Type inference• Async• List comprehension• ?

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

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)

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

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

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

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

a) Есть палочкамиb) Выкинуть вилки/ложки

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

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

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

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

конструкции.

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

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

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

Тяжелое наследие прошлого

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

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

Выворачиваем с изнанкиПаралельное программирование

• Миграция с lock style на message passing style

• Использование не мутабельных данных• Async• First class events

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

Асинхронная обработка

• Ключ к построению производительных, хорошо масштабируемых систем;

• Уши растут из I/O Completion Ports, который очень сложен в использовании;

• .NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.

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

Async-workflow

• Идея спрятать, BeginXXX и EndXXX для асинхронных операций.

• Дать программисту такой же легкий способ выполнять асинхронные операции, как и синхронные.

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

Sync code VS Async code

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

Erlang Message Passing Concurrency

• Много легких процессов(agents)• Нет общего состояния• No sequential bottlenecks• Сообщения для коммуникации между

процессами• Немутабельный состояние - аналогия с

системой контроля версий

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

Mailbox processing & Message passing style

• У нас очень много легких агентов которые выполняют некоторую работу;

• У каждого агента есть Mailbox с очередью, через который он получает сообщения из вне;

• Агенты могут посылать сообщения как другим агентам, так и себе;

• У каждого агента есть внутреннее состояние (аналогия с контролем версий)

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

Mailbox processing & Message passing style

• Вся работа происходит асинхронно (Async);• Блокирующих операций нет;• Сотни тысяч агентов могут жить в десятке

потоков из ThreadPool;• Все отлично растягивается по доступным

процессорам/ядрам

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

Demo

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

Спасибо за внимание

Вопросы?