Programação funcional no mundo real com – Clojure – QCon 2013



Programação funcional no mundo real com – Clojure – QCon 2013

0 0


qcon2013


On Github pbalduino / qcon2013

Programação funcional no mundo real com

Clojure

QCon 2013

São Paulo - 31/Ago/2013

Plínio Balduino / @p_balduino

Plínio Balduino

A past century software developer

Plínio Balduino

www.casadocodigo.com.br

Programação funcional

Alan Turing / Alonzo Church

década de 1930

Programação funcional

Paradigma

 

Programação funcional

Paradigma

Forma diferente de pensar

Programação funcional

Função é a unidade básica

Linguagens funcionais

Haskell

LISP

Scala

JavaScript

Linguagens funcionais

Haskell

LISP

Scala

JavaScript

LISP

Academia

LISP

Parênteses

LISP

Inteligência artificial

Matemática

Preciso de um mestrado?

Teorias, termos

Teoria das categorias

  • Functors
  • Applicative Functors
  • Monoids
  • Monads
  • Arrows
  • Semigrupos
  • Comonads

Hoje não, obrigado.

Sejamos pragmáticos

Problemas do mundo real

Lei de Moore

Velocidade do processador estagnou

Lei de Moore

A solução?

Mais núcleos

Mais máquinas

Servidores

Cloud

Computação distribuída

Programação paralela e concorrente

Estados compartilhados

Race Condition

Locks

Deadlock

Locks

Livelock

E o código...

... cada vez mais complexo

E agora?

Clojure

Clojure

Integrado à JVM ou CLR

Clojure

Sintaxe simples

(operador parametro parametro)

(operador parametro
         (operador parametro 
                   parametro))

Imutabilidade

Thread safe por definição

E se eu precisar mudar?

Transients

Recursão

VARs são per thread

Feito para concorrência

Toda função implementa Runnable

Tipos para (quase) todos os gostos

Processamento concorrente

Não coordenado e síncrono

Atoms

Pense num contador compartilhado

Processamento concorrente

Não coordenado e assíncrono

Agents

Pense num processo de fork/join

Processamento concorrente

Coordenado e síncrono

Refs

Pense numa transferência bancária

STM

Software Transactional Memory

STM

É como um banco de dados

... mas na memória

STM

Performance?

Funções puras

Sem efeito colateral

Deterministas

Permitem memoization

Memoization?

Troca processamento por memória

Memoization

(defn fib [n]
  (if  (or (zero? n) (= n 1)) 
    1 
    (+  (fib (dec n)) 
        (fib (- n 2)))))
 
(time (fib 90))
; spent more than 30 minutes and I quit

Memoization

(def fib-memo)
 
(defn fib [n]
  (if  (or (zero? n) (= n 1)) 
    1 
    (+  (fib-memo (dec n))
        (fib-memo (- n 2))))) 
 
(def fib-memo (memoize fib))
 
(time (fib 90))
; "Elapsed time: 0.058 msecs"

Mas e se...?

Precisa de efeito colateral?

Use agent

core.async

A simplicidade das goroutines

Com o poder do Clojure

As ideias do Erlang e Go

core.logic

Programação lógica

Sudoku em 33 linhas

O poder do Prolog

Macros

Modifique a linguagem

em tempo de execução

DSLs made easy

Lazy

O processamento só acontece

quando for realmente necessário

Grandes quantidade de dados

Java interop

Você pode reutilizar todas

as suas bibliotecas do Java

(defn delayed-print []
  (println "Dormiu")
  (Thread/sleep 5000)
  (println "Acordou"))

(-> delayed-print 
    Thread. 
    .start)

Quem usa?

Puppet DB - Overtone - Prismatic - Order Harmony - Rocket List - Leeds College of Music - Rewryte - BeanStalk - ReadyForZero - Akamai - Appvise - backtype - Brand Karma - Berico - Citibank - Compass Labs - Factual - FlightCaster - Geni - Higiebus - Infinitely Beta - KamaGames - LeadTune - Max Planck Institute - Pico Quantitative Trading - Platogo - Relevance - Revelytix - Setere - Sonian - TheDeadline - Tianya (China) - Typewire - YouCanEat.at - WeatherBill - WorldSingles - WuSoup - AltLaw.org - Tech city map - Trampoline Systems - 2minutecv - Nanonation - Cognician - Mastodon C - BTS Group - Planspot.com - Nuroko - Damballa - BigML - Roomkey - boxuk.com - GateProtect - Kontera - DRW - Two Sigma - Climate - Puppet Labs - Copious - Trend Micro - IOOF - Heroku - SmartBIM - Intelie - EO2 - Chaordic - Reglare - Guiato

Resumindo

JVM (ou CLR)

Simplicidade

Concorrência

Use Clojure

(obrigado)

@p_balduino

@clj_sp

http://pbalduino.github.io/qcon2013