Buscar

Resumo Programação funcional

Prévia do material em texto

Programação funcional
Programação funcional se baseia em como funções, variáveis e valores realmente trabalham em matemática, o que é diferente de como eles geralmente funcionam na maioria das linguagens de programação.
	A programação funcional iniciou antes mesmo que os computadores digitais existissem. Uma grande parte da base teórica da computação foi desenvolvida na década de 1930 por matemáticos como Alonzo Church e Haskell Curry. Muito da literatura sobre programação funcional reflete suas raízes matemáticas é possível aprender e usar os princípios da programação funcional sem grande base matemática.
	A primeira linguagem a incorporar ideias da programação funcional foi Lisp que foi desenvolvida no final da década de 1950 e é a segunda linguagem de programação de alto nível mais antiga após Fortran.
	Um dos princípios fundamentais da programação funcional é evitar o estado mutável. A maioria das linguagens de programação não faz distinção clara entre um valor (o conteúdo da memória) e uma variável que se refira a ele. Se você tornar um valor imutável, o problema de sincronização desaparece. A leitura concorrente não traz problemas de modo que a programação multithread se torna mais fácil.	
	Outro principio são funções sem efeitos colaterais que são outras fontes de complexidades, que leva a falhas são as funções que mudam de estado. Em matemática, funções nunca tem efeitos colaterais. Funções sem efeito colateral são ótimas para implementar reuso, já que não dependem do contexto no qual são executadas. Assim tem menor probabilidade de ter erros.
 
Duas abstrações de nível mais alto que fornecem formas de gerenciar estados mutáveis de forma segura quanto a threads são: Atores e Software Transactional Memory.
No modelo de concorrência de atores o trabalho é coordenado pela passagem de mensagens entre “atores”. Cada ator tem uma fila, às vezes chamada de caixa correspondência, para mensagens que chegam. O ator processa cada mensagem, uma de cada vez. Em um sistema de atores a transformação de estado é manipulada entre diversas formas. Para algum estado, pode ser responsabilidade de um ator alterar esse estado. Nenhum outro código pode fazê-lo. Quando uma transformação é necessária, uma mensagem é enviada para o autor, o qual executa todas as alterações sequencialmente, evitando assim problemas de sincronização.
O Software Transactional Memory (STM) traz as transações a locais da memória que são referenciados por variáveis. O STM não pode fornecer durabilidade, porque a memória não é durável mais pode fornecer atomicidade e consistência. O modelo de STM é separar referências a valores das próprias referências. Em STM um programa possui em referência a um valor de interesse. O framework STM fornece um protocolo para alterar o valor para o qual a referencia “aponta”. Entretanto os próprios valores não são alterados. Eles permanecem imutáveis. Apenas as referencias são alteradas para apontar para novos valores. 
 Figura 1. Árvore em um momento (time) “0” referenciada como um objetivo chamado Value 1.
Figura 2. Momento (time) 1, dois valores, com subestruturas compartilhadas 
Exemplo:
package stm;
import akka.stm.*;
public class AkkaSTMIntegerCounter{
private final Ref<Integer> ref = new Ref<Integer>(0);
public int conter () {
		return new Atomic<Integer>() {
plublic Integer atomically() {
int inc = ref.get() +1;
ref.set(inc);
return inc;
}
}.execute();
}
Public staticn void main(string[] args ){
AkkaSTMIntegerCounter counterref = new AkkaSTMIntegerCounter();
System.out.printLn(counterRef.counter() ); // -> 1
System.out.printLn(counterRef.counter() ); // -> 2
}
}

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes