F#  функциональный язык «новой» волны Артем Присяжнюк Kiev.Alt NET 2010
Представлюсь Артем Присяжнюк Технический директор компании ХостТрекер Опыт работы с ФЯ – 10 лет ( Ocaml, F#) ХостТрекер – распределенная система мониторинга доступности сайтов [email_address] 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)
Что нужно чтобы научиться есть палочками?
Что нужно чтобы научиться есть палочками? Есть палочками Выкинуть вилки/ложки
Что нужно чтобы научится программировать функционально ?
Что нужно чтобы научится программировать функционально ? Программировать функционально ; Выкинуть из обихода императивные конструкции.
Выворачиваем с изнанки   Императивный стиль  -> 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 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
Выворачиваем с изнанки Паралельное программирование Миграция с  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
Спасибо за внимание Вопросы?

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

  • 1.
    F# функциональныйязык «новой» волны Артем Присяжнюк Kiev.Alt NET 2010
  • 2.
    Представлюсь Артем ПрисяжнюкТехнический директор компании ХостТрекер Опыт работы с ФЯ – 10 лет ( Ocaml, F#) ХостТрекер – распределенная система мониторинга доступности сайтов [email_address] http://host-tracker.com
  • 3.
    Рожденные в 2000-хF#(2002) Scala (2003) Nemerle (2005) Clojure ( 2007) C#/VB.NET LINQ/PLINQ, lambda ФЯ от Intel . 2011? Явный уклон в функциональшину
  • 4.
  • 5.
    Текущий тренд вжелезе – мультиядерность Вместо роста ввысь рост в ширь Количество CPU
  • 6.
    Две основные тенденцииПриход MultyCPU- систем в широкие массы На «десктопе» теперь по идее можно решать более «тяжелые» задачи ; Приход масс в интернет Нужны высоконагруженные, высокопроизводительные системы.
  • 7.
    Нужны «эффективные» программы«заточенные» под мультиядерность. В идеале, на N CPU система должна: работать в N раз быстрее ; обслуживать в N раз больше пользователей ; выполнять в N раз больше транзакций .
  • 8.
    Старые подходы неоправдали себя Развития софта не успевает за развитием железа ; Софт не эффективно работает на новом железе ; Плохо масштабируется ; С ростом сложности систем, сложность программ растет экспоненциально.
  • 9.
  • 10.
    Параллельное программирование вышлов массы Нужны языки/платформы / инструменты «с человеческим лицом» для разработки многопотоковых программ ; Появление новых ФЯ программирования, дает надежду на появление новых таковых.
  • 11.
    Поддержка параллелизма «Старый»подход Уровень примитивов сторонних библиотек, ядра ОС «Новый» подход Уровень парадигмы самого языка
  • 12.
    Императивный подход Изменяемыеданные - да Разделяемые изменяемые данные - да Side эффекты – да Блокировки, синхронизации – да Межпотоковое взаимодействие – разделяемые ресурсы
  • 13.
  • 14.
    Проблемы с блокировкамии разделяемыми ресурсами Мало блокировок Много блокировок Неправильное использование блокировок Блокировки в неверном порядке Следствия Dead-lock -и Нарушение целостности данных Race condition Плохая повторяемость (трудность отладки)
  • 15.
    Функциональный подход Изменяемыеданные – нет Разделяемые изменяемые данные – нет Side эффекты – нет Блокировки, синхронизации – нет Межпотоковое взаимодействие – сообщения , Map/Reduce
  • 16.
    Кто использовал функциональноепрограммирование на практике ?
  • 17.
    Кто использовал функциональноепрограммирование на практике ? Электронные таблицы ( Excel ) XSLT SQL
  • 18.
    Носители «Нового» подходаФункциональное программирование Agent & message-passing style programming (Erlang) Async C ω Axum LINQ, PLINQ Rx Framework Task Parallel library C# F#
  • 19.
    История F# (2002) Лямбда-счисление 1936 Lisp/Schema 1958 ML 1970 Hindley–Milner Система типов Ocaml 1996 Синтаксис Система типов Код Генерики ( Don Syme Привет c# 2.0) Дон Сайм портировал Ocaml на .NET (2002)
  • 20.
    История 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
  • 21.
    Развитие языков SafetyC#, VB.NET, Java LINQ Haskell F# Нирвана
  • 22.
    Основные направления развитияязыков Упрощение технологий (Пример SGML -> XML ) Безопасность кода Перенос рутинных задач на компилятор /рантайм (GC, Type inference) ; Строгая типизация + автоматический вывод типов ; Мета программирование Макросы - изменение языка Синтаксис (выразительность, краткость) Потокобезопасность Параллелизм - на уровень языка.
  • 23.
    FP, F# , Haskell & друзья как источник идей Движение концепций F# -> C# Generics Lambda LINQ (former monads) Type inference Async List comprehension ?
  • 24.
    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)
  • 25.
    Что нужно чтобынаучиться есть палочками?
  • 26.
    Что нужно чтобынаучиться есть палочками? Есть палочками Выкинуть вилки/ложки
  • 27.
    Что нужно чтобынаучится программировать функционально ?
  • 28.
    Что нужно чтобынаучится программировать функционально ? Программировать функционально ; Выкинуть из обихода императивные конструкции.
  • 29.
    Выворачиваем с изнанки Императивный стиль -> 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
  • 30.
    Тяжелое наследие прошлого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
  • 31.
    Выворачиваем с изнанкиПаралельное программирование Миграция с lock style на message passing style Использование не мутабельных данных Async First class events
  • 32.
    Асинхронная обработка Ключк построению производительных, хорошо масштабируемых систем ; Уши растут из I/O Completion Ports , который очень сложен в использовании ; .NET – асинхронность через BeginXXX, EndXXX. Все равно достаточно сложно. Логика расползается.
  • 33.
    Async-workflow Идея спрятать, BeginXXX и EndXXX для асинхронных операций. Дать программисту такой же легкий способ выполнять асинхронные операции, как и синхронные.
  • 34.
    Sync code VSAsync code
  • 35.
    Erlang Message PassingConcurrency Много легких процессов (agents) Нет общего состояния No sequential bottlenecks Сообщения для коммуникации между процессами Немутабельный состояние - аналогия с системой контроля версий
  • 36.
    Mailbox processing &Message passing style У нас очень много легких агентов которые выполняют некоторую работу ; У каждого агента есть Mailbox с очередью , через который он получает сообщения из вне ; Агенты могут посылать сообщения как другим агентам, так и себе ; У каждого агента есть внутреннее состояние (аналогия с контролем версий)
  • 37.
    Mailbox processing &Message passing style Вся работа происходит асинхронно ( Async); Блокирующих операций нет ; Сотни тысяч агентов могут жить в десятке потоков из ThreadPool; Все отлично растягивается по доступным процессорам/ядрам
  • 38.
  • 39.

Editor's Notes

  • #4 Автор Scala   Martin Odersky также как и Дон Сайм, работал над генериками, только для Явы