• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
F# - функциональный  язык «новой» волны
 

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

on

  • 1,335 views

* Функциональные языки - как ответ на новые тенденции в развитии аппаратного обеспечения. ...

* Функциональные языки - как ответ на новые тенденции в развитии аппаратного обеспечения.
* F#. История. Идеология, концепции, возможности.
* ФП – холодный старт. Миграция с императивных конструкций на функциональные.
* Основные механизмы для построения высоконадежных, масштабируемых, распределенных систем.
* Примеры использования Async, Mailbox message processing.

Statistics

Views

Total Views
1,335
Views on SlideShare
1,140
Embed Views
195

Actions

Likes
0
Downloads
7
Comments
0

3 Embeds 195

http://blog.kievalt.net 166
http://feeds.feedburner.com 26
http://msug.vn.ua 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    F# - функциональный  язык «новой» волны F# - функциональный язык «новой» волны Presentation 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-системв широкие массыНа «десктопе» теперь по идее можно решать более «тяжелые» задачи;
      Приход масс в интернетНужны высоконагруженные, высокопроизводительные системы.
    • Нужны «эффективные» программы «заточенные» под мультиядерность.
      В идеале, на NCPU система должна:
      работать в N раз быстрее;
      обслуживать в N раз больше пользователей;
      выполнять в N раз больше транзакций.
    • Старые подходы не оправдали себя
      Развития софта не успевает за развитием железа;
      Софт не эффективно работает на новом железе;
      Плохо масштабируется;
      С ростом сложности систем, сложность программ растет экспоненциально.
    • Параллельное программирование вышло в массы
      Нужны языки/платформы/инструменты «с человеческим лицом» для разработки многопотоковых программ;
      Появление новых ФЯ программирования, дает надежду на появление новых таковых.
    • Поддержка параллелизма
      «Старый» подход
      Уровень примитивов сторонних библиотек, ядра ОС
      «Новый» подход
      Уровень парадигмы самого языка
    • Императивный подход
      Изменяемые данные - да
      Разделяемые изменяемые данные - да
      Side эффекты – да
      Блокировки, синхронизации – да
      Межпотоковое взаимодействие – разделяемые ресурсы
    • Mutable shared state
    • Проблемы с блокировками и разделяемыми ресурсами
      Мало блокировок
      Много блокировок
      Неправильное использование блокировок
      Блокировки в неверном порядке
      Следствия
      Dead-lock-и
      Нарушение целостности данных
      Race condition
      Плохая повторяемость (трудность отладки)
    • Функциональный подход
      Изменяемые данные–нет
      Разделяемые изменяемые данные – нет
      Side эффекты – нет
      Блокировки, синхронизации – нет
      Межпотоковое взаимодействие – сообщения, Map/Reduce
    • Кто использовал функциональное программирование на практике?
    • Кто использовал функциональное программирование на практике?
      Электронные таблицы (Excel)
      XSLT
      SQL
    • Носители «Нового» подхода
      Функциональное программирование
      Agent & message-passing styleprogramming (Erlang)
      Async

      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
    • Развитие языков
      Usefulnes
      C#, VB.NET, Java
      LINQ
      F#
      Нирвана
      Haskell
      Safety
    • Основные направления развития языков
      Упрощение технологий (Пример 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
    • Спасибо за внимание
      Вопросы?