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

Post on 22-Jun-2015

727 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

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