SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
# mainstreamless
## Clojure 00


   Никита Прокопов
   tonsky.livejournal.com




   6 марта 2013
# Причины создания



  clojure.org/rationale

  Развитая платформа
  ЛИСП
  Функциональное программирование
  Concurrency
# JVM



  Быстрая
  Качественная
  Уровенем выше ОС,
    лучше абстракции
  Валом библиотек
  Валом инструментов
# JVM



  Уважает платформу
  Писать джаву на кложе проще,
    чем на джаве
  clj strings == java strings
  clj numbers == java numbers
  clj nil == java null
# LISP



  Гибкий
  Динамичный — новое для JVM
  Маленькое ядро → портируемость
  Почти нет синтаксиса
  Код-как-данные
# LISP



  def if do let quote var fn
  loop recur
  throw try
  monitor-enter
  monitor-exit
  . new set!
# LISP



  REPL
  Открытость — всё управляемо
  Даже синтаксис!
# ФП



  Удобный инструмент
  First-class functions
  Lexical closures
  Ленивость
  Dynamic typing
# Как это выглядит


  public class StringUtils {
      public static boolean isBlank(String str) {
          int strLen;
          if (str == null || (strLen = str.length()) == 0) {
              return true;
          }
          for (int i = 0; i < strLen; i++) {
              if ((Character.isWhitespace(str.charAt(i)) == false)) {
                  return false;
              }
          }
          return true;
      }
  }
# Как это выглядит


  (defn blank? [s]
    (every? #(Character/isWhitespace %) s))
# Как это выглядит


  public class StringUtils {
      public static boolean isBlank(String str) {
          int strLen;
          if (str == null || (strLen = str.length()) == 0) {
              return true;
          }
          for (int i = 0; i < strLen; i++) {
              if ((Character.isWhitespace(str.charAt(i)) == false)) {
                  return false;
              }
          }
          return true;
      }
  }

  (defn blank? [s]
    (every? #(Character/isWhitespace %) s))
# Синтаксис


  method()                         (f)

  method(arg)                      (f arg)

  object.method(arg)               (f object arg), (.method o a)

  Map<String, String> map =        (def map {:key “value”})
  new HashMap<String, String>();
  map.put(“key”, “value”);
# Синтаксис



  (defn f [x y]
    (+ x y))

  [1 2 3]
  (1 2 3)
  {:x 1 :y 2}
  #{:x :y :z}
# Философия



  См. youtube.com/clojuretv

  Особенно (!) Rich Hickey
# Открывайте данные



  Программы перемалывают данные
  Не прячьте их
  “It is better to have
     100 functions operate on
     one data structure
   than to have
     10 functions operate on
     10 data structures.”
# Открывайте данные


  distinct filter remove for keep keep-indexed cons
  concat lazy-cat mapcat cycle interleave interpose
  rest next fnext nnext drop drop-while nthnext for
  take take-nth take-while butlast drop-last for flat-
  ten reverse sort sort-by shuffle split-at split-with
  partition partition-all partition-by map pmap mapcat
  for replace reductions map-indexed seque first ffirst
  nfirst second nth when-first last rand-nth zipmap
  into reduce set vec into-array to-array-2d frequen-
  cies group-by apply not-empty some reduce seq? eve-
  ry? not-every? not-any? empty? some filter doseq do-
  run doall realized? seq vals keys rseq subseq rsubseq
  lazy-seq repeatedly iterate repeat range line-seq
  resultset-seq re-seq tree-seq file-seq xml-seq itera-
# Decomplecting



  Var      =   value   +   time
  Object   =   state   +   identity + value
  Method   =   func    +   state + namespace
  Actors   =   what    +   who
  Loops    =   what    +   how
  ...
# Открытость



  Мультиметоды, протоколы
  Метаданные
  Predicate dispatch вместо
    pattern matching
  Composable abstractions

  $().click().css() или
  (-> ($ ...) (click ) (css))
# Переиспользуемость



  Неймспейсится всё
  Нет custom reader, есть EDN
  Полиморфизм через протоколы
# Комбинируемость



  Avoid things that do not compose

  Manual locking
  Imperative code
# Concurrency
## Задача


   колония муравьев собирает пищу
   каждый муравей — отдельный поток
   общая карта еды
   рисовать положение дел
# Concurrency
## Задача
# Concurrency
## Проблемы


   неатомарные операции
   согласованное принятие решений
   когерентное состояние мира
# Проблемы многопоточного
  программирования


  «Мир» постоянно меняется
  Просадка скорости на syncs
  Dead locks
  Live locks
  Легко ошибиться
  Сложно просчитать варианты
  Сложно тестировать
# Immutable data structures



  Легко шарить между потоками
  Операции атомарны по определению
  Едят кучу памяти (медленно?)
# Persistent data structures



  «Умно» делят общие части
  Едят мало памяти
  Быстрые
    (почти константная стоимость)
  Портированы в Scala :)
# List



  list3   list2   list1
  head    head    head
  tail    tail    tail




   1       2       3
# Vector

 v
# Vector

 v
# Vector

 v
# Vector

 v
# Vector

 v
# Vector

 v
# Vector

 v

                 ...
           ...
# Vector

               v
log32(size)




                                     ...
                               ...

               up to 32 elms
# Vector
                               00[00000][00000][00000][00000][00001][00100]

               v
log32(size)




                                                                 ...
                                                       ...

               up to 32 elms
# Map
## Hash trie
# Map
# Atoms


  (def x (atom 1))
  ;; #’user/x

  (swap! x inc)
  ;; 2

  (swap! x inc)
  ;; 3

  (swap! x inc)
  ;; 10 (?)

  (swap! x #(Math/sin %))
  ;; -0.544...
# Atoms



          x

    1
# Atoms



           x

    1             2
          (f 1)
# Atoms



           x

    1     swap!   2
# Atoms



          x

    1         2
# Atoms



          x

    1         2           3
                  (f 2)
# Atoms



          x

    1         2      ap!
                           3
                  sw
# Atoms



          x

    1         2   3
# Atoms



          x       @x

    1         2        3
# Atoms



          x       @x

    1         2           3
                       (f (f 1))
# Atoms



  Для «простого» mutable state
  Явно выделенная «мутация»
  Атомарное изменение
  Любое значение — это всегда
    результат последовательного
    применения функций
# Atoms
## Конфликты

           x

     1         2            3
                    (f 2)
               −2
# Atoms
## Конфликты

           x

     1         2             3

               −2            −1
                    (f −2)
# Atoms
## Конфликты

           x

     1         2             3

               −2   sw ap!   −1
# Agents


  (def x (agent 1))
  ;; #’user/x

  (send x inc)
  ;; #<Agent@73703457: 2>

  (send x inc)
  ;; #<Agent@73703457: 3>

  (send x (fn [a] (Thread/sleep 1000) (inc a)))
  ;; #<Agent@73703457: 3>

  @x
  ;; #<Agent@73703457: 3>

  @x
  ;; #<Agent@73703457: 4>
# Agent

          h
                g
                f


                2


              thread pool
# Agent

            h
            g
            f


            2


          thread pool
# Agent

            h
            g



            2           f




          thread pool
# Agent

            h
            g



            2           f



          (f 2)
          thread pool
# Agent

            h
            g



            3

          (f 2)
          thread pool
# Agent

            h
            g



            3


          thread pool
# Agent

            h




            3           g




          thread pool
# Agent



  Unit of work
  Похож на atoms, только…
  Для последовательных операций:
  heavy lifting, сохранение в файл, запись в сеть,
  конечные автоматы, …
  Выполняется в отдельном потоке
  Очередь сообщений
  Всегда наблюдаемое состояние
# STM



  Согласованное изменение состояния
  Проще рассуждать
  Сложнее ошибиться
  Composable
  Агенты работают с STM!
# STM
# Concurrency



  Иммутабельность
  Персистентные структуры данных
  Software transactional memory
  Lock-free

  Composable
  Безопасно!
# mainstreamless
## Clojure 00


   Никита Прокопов
   tonsky.livejournal.com




   6 марта 2013

Weitere ähnliche Inhalte

Was ist angesagt?

ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Stfalcon Meetups
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функцийMariya_Lastochkina
 

Was ist angesagt? (20)

ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функций
 

Andere mochten auch

Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Open City Foundation
 
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...Tatyanazaxarova
 
Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)PingWin Software
 
Хитрости RAII
Хитрости RAIIХитрости RAII
Хитрости RAIIcorehard_by
 
Максим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoМаксим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoOntico
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Yauheni Akhotnikau
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!Ivan Tsyganov
 
Практики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияПрактики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияCEE-SEC(R)
 
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...Mail.ru Group
 
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&CoMail.ru Group
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Ontico
 

Andere mochten auch (18)

Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
Антон Полухин, Данные «Портала открытых данных правительства Москвы» в формат...
 
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
 
Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)Разработка GUI на GTK (Николай Ходов)
Разработка GUI на GTK (Николай Ходов)
 
Хитрости RAII
Хитрости RAIIХитрости RAII
Хитрости RAII
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 
Для спикера Piter Py #3
Для спикера Piter Py #3Для спикера Piter Py #3
Для спикера Piter Py #3
 
Selen framework
Selen frameworkSelen framework
Selen framework
 
Максим Лапшин, Erlyvideo
Максим Лапшин, ErlyvideoМаксим Лапшин, Erlyvideo
Максим Лапшин, Erlyvideo
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!
 
Практики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обученияПрактики жизненного цикла систем машинного обучения
Практики жизненного цикла систем машинного обучения
 
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
«Как написать свой первый плагин для JIRA», Александр Кузнецов (StiltSoft, Бе...
 
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
«iPython & Jupyter: 4 fun & profit», Лев Тонких, Rambler&Co
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
 

Ähnlich wie Введение в Clojure (Никита Прокопов)

Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Alex Ott
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметикуAndrey Akinshin
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияPositive Hack Days
 

Ähnlich wie Введение в Clojure (Никита Прокопов) (20)

Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Clojure #2 (2014)
Clojure #2 (2014)Clojure #2 (2014)
Clojure #2 (2014)
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 

Введение в Clojure (Никита Прокопов)

  • 1. # mainstreamless ## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта 2013
  • 2. # Причины создания clojure.org/rationale Развитая платформа ЛИСП Функциональное программирование Concurrency
  • 3. # JVM Быстрая Качественная Уровенем выше ОС, лучше абстракции Валом библиотек Валом инструментов
  • 4. # JVM Уважает платформу Писать джаву на кложе проще, чем на джаве clj strings == java strings clj numbers == java numbers clj nil == java null
  • 5. # LISP Гибкий Динамичный — новое для JVM Маленькое ядро → портируемость Почти нет синтаксиса Код-как-данные
  • 6. # LISP def if do let quote var fn loop recur throw try monitor-enter monitor-exit . new set!
  • 7. # LISP REPL Открытость — всё управляемо Даже синтаксис!
  • 8. # ФП Удобный инструмент First-class functions Lexical closures Ленивость Dynamic typing
  • 9. # Как это выглядит public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } }
  • 10. # Как это выглядит (defn blank? [s] (every? #(Character/isWhitespace %) s))
  • 11. # Как это выглядит public class StringUtils { public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } } (defn blank? [s] (every? #(Character/isWhitespace %) s))
  • 12. # Синтаксис method() (f) method(arg) (f arg) object.method(arg) (f object arg), (.method o a) Map<String, String> map = (def map {:key “value”}) new HashMap<String, String>(); map.put(“key”, “value”);
  • 13. # Синтаксис (defn f [x y] (+ x y)) [1 2 3] (1 2 3) {:x 1 :y 2} #{:x :y :z}
  • 14. # Философия См. youtube.com/clojuretv Особенно (!) Rich Hickey
  • 15. # Открывайте данные Программы перемалывают данные Не прячьте их “It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.”
  • 16. # Открывайте данные distinct filter remove for keep keep-indexed cons concat lazy-cat mapcat cycle interleave interpose rest next fnext nnext drop drop-while nthnext for take take-nth take-while butlast drop-last for flat- ten reverse sort sort-by shuffle split-at split-with partition partition-all partition-by map pmap mapcat for replace reductions map-indexed seque first ffirst nfirst second nth when-first last rand-nth zipmap into reduce set vec into-array to-array-2d frequen- cies group-by apply not-empty some reduce seq? eve- ry? not-every? not-any? empty? some filter doseq do- run doall realized? seq vals keys rseq subseq rsubseq lazy-seq repeatedly iterate repeat range line-seq resultset-seq re-seq tree-seq file-seq xml-seq itera-
  • 17. # Decomplecting Var = value + time Object = state + identity + value Method = func + state + namespace Actors = what + who Loops = what + how ...
  • 18. # Открытость Мультиметоды, протоколы Метаданные Predicate dispatch вместо pattern matching Composable abstractions $().click().css() или (-> ($ ...) (click ) (css))
  • 19. # Переиспользуемость Неймспейсится всё Нет custom reader, есть EDN Полиморфизм через протоколы
  • 20. # Комбинируемость Avoid things that do not compose Manual locking Imperative code
  • 21. # Concurrency ## Задача колония муравьев собирает пищу каждый муравей — отдельный поток общая карта еды рисовать положение дел
  • 23. # Concurrency ## Проблемы неатомарные операции согласованное принятие решений когерентное состояние мира
  • 24. # Проблемы многопоточного программирования «Мир» постоянно меняется Просадка скорости на syncs Dead locks Live locks Легко ошибиться Сложно просчитать варианты Сложно тестировать
  • 25. # Immutable data structures Легко шарить между потоками Операции атомарны по определению Едят кучу памяти (медленно?)
  • 26. # Persistent data structures «Умно» делят общие части Едят мало памяти Быстрые (почти константная стоимость) Портированы в Scala :)
  • 27. # List list3 list2 list1 head head head tail tail tail 1 2 3
  • 34. # Vector v ... ...
  • 35. # Vector v log32(size) ... ... up to 32 elms
  • 36. # Vector 00[00000][00000][00000][00000][00001][00100] v log32(size) ... ... up to 32 elms
  • 38. # Map
  • 39. # Atoms (def x (atom 1)) ;; #’user/x (swap! x inc) ;; 2 (swap! x inc) ;; 3 (swap! x inc) ;; 10 (?) (swap! x #(Math/sin %)) ;; -0.544...
  • 40. # Atoms x 1
  • 41. # Atoms x 1 2 (f 1)
  • 42. # Atoms x 1 swap! 2
  • 43. # Atoms x 1 2
  • 44. # Atoms x 1 2 3 (f 2)
  • 45. # Atoms x 1 2 ap! 3 sw
  • 46. # Atoms x 1 2 3
  • 47. # Atoms x @x 1 2 3
  • 48. # Atoms x @x 1 2 3 (f (f 1))
  • 49. # Atoms Для «простого» mutable state Явно выделенная «мутация» Атомарное изменение Любое значение — это всегда результат последовательного применения функций
  • 50. # Atoms ## Конфликты x 1 2 3 (f 2) −2
  • 51. # Atoms ## Конфликты x 1 2 3 −2 −1 (f −2)
  • 52. # Atoms ## Конфликты x 1 2 3 −2 sw ap! −1
  • 53. # Agents (def x (agent 1)) ;; #’user/x (send x inc) ;; #<Agent@73703457: 2> (send x inc) ;; #<Agent@73703457: 3> (send x (fn [a] (Thread/sleep 1000) (inc a))) ;; #<Agent@73703457: 3> @x ;; #<Agent@73703457: 3> @x ;; #<Agent@73703457: 4>
  • 54. # Agent h g f 2 thread pool
  • 55. # Agent h g f 2 thread pool
  • 56. # Agent h g 2 f thread pool
  • 57. # Agent h g 2 f (f 2) thread pool
  • 58. # Agent h g 3 (f 2) thread pool
  • 59. # Agent h g 3 thread pool
  • 60. # Agent h 3 g thread pool
  • 61. # Agent Unit of work Похож на atoms, только… Для последовательных операций: heavy lifting, сохранение в файл, запись в сеть, конечные автоматы, … Выполняется в отдельном потоке Очередь сообщений Всегда наблюдаемое состояние
  • 62. # STM Согласованное изменение состояния Проще рассуждать Сложнее ошибиться Composable Агенты работают с STM!
  • 63. # STM
  • 64. # Concurrency Иммутабельность Персистентные структуры данных Software transactional memory Lock-free Composable Безопасно!
  • 65. # mainstreamless ## Clojure 00 Никита Прокопов tonsky.livejournal.com 6 марта 2013