® tópicos avançados em linguagens computacionais – if724 ml ocaml fsharp leandro mitsuo rodrigo...
TRANSCRIPT
®
Tópicos Avançados em Linguagens Computacionais – IF724
ML
OCAML
FSHARP
Leandro Mitsuo Rodrigo Lumack
[email protected] [email protected]
Professor: André Santos
Linguagens Funcionais
• Programação Funcional– Ênfase na avaliação de expressões – Expressões são formadas por funções
que combinam valores básicos– Funções podem ou não ter argumentos
e um simples valor de retorno
• Funções podem ser nomeadas ou anônimas (lambda)
Linguagens FuncionaisVantagens
• Maior concisão• Maior elegância (facilidade de
compreensão)• Ausência de “core dumps”
– É impossível tratar um inteiro como um ponteiro ou haver referências nulas
• Reuso de código (através de polimorfismo)• Alta abstração e modularização
– Funções de alta ordem• Gerenciamento automático de memória
Linguagens FuncionaisDesvantagens
• Bibliotecas com recursos limitados• Incompatibilidade com outras tecnologias• Instalação de compiladores e
interpretadores complicada• Pouco difundidas• Não podem ser utilizadas em sistemas
onde a performance é crítica
História das Linguagens Funcionais
• Primeira linguagem de programação funcional: Lambda Calculus
– Não foi projetada para ser executada por um computador
– Desenvolvida por Alonzo Church na década de 30
• LISP
– Desenvolvida por John McCarthy no MIT na década de 50
• SCHEME
– Tentativa de simplificar LISP
• ML
– Desenvolvida na década de 70 na Universidade de Edimburgo por Robin Milner
História das Linguagens Funcionais
• Miranda– Anos 70 em Kent
• Haskell– Anos 80
• Outras– SML, SML/NJ, MOSML, CAML, CAML
Light, OCAML, FSharp
ML – Meta LanguageCaracterísticas
• Influenciou o desenvolvimento de Haskell, Cyclone, Nemerle, OCAML
• Estaticamente Tipada• Fortemente Tipada• Inferência de tipo
– fun fac : (int -> int) 0 = 1 – | fac n = n * fac (n-1);
– : (int -> int) é opcional• fun fac 0 = 1• | fac n = n * fac(n-1);
ML – Meta LanguageCaracterísticas
• Suporte a valores estruturados: tuplas, listas, árvores
• Exemplos de tuplas– val pair = (1,"abc");
• val pair = (1,"abc") : int * string– val triple = (1,true,1.0);
• val triple = (1,true,1.0) : int * bool * real
ML – Meta LanguageCaracterísticas
• Exemplos de Listas– val l = [1,2,3];
• val l = [1,2,3] : int list– Operações sobre a lista
• hd l;– val it = 1 : int
• tl l;– val it = [2,3] : int list
• tl(tl(tl l));– val it = [] : int list
ML – Meta LanguageCaracterísticas
• Exemplo de árvores• Declarando o tipo árvore binária
– datatype ’a bintr = LEAF of ’a | NODE of ’a bintr*’a bintr;
• Criando uma árvore binária– val tree = NODE (NODE(LEAF 1,LEAF
4),LEAF 7);
ML – Meta LanguageCaracterísticas
• Funções de alta ordem• Exemplo
– Declaração de um map• fun map f [] = []
| map f (h::t) = (f h)::(map f t);
– Utilizando o map• map (fn x=> x+1) [1,2,3];
– val it = [2,3,4] : int list
• map (fn x=> [x]) [1,2,3];– val it = [[1],[2],[3]] : int list list
ML – Meta LanguageCaracterísticas
• Polimorfismo paramétrico• Exemplo
– fun mklist x = [x];• val mklist = fn : ’a -> ’a list
– mklist 1;• val it = [1] : int list
– mklist (mklist 1);• val it = [[1]] : int list list
– mklist (mklist “a”);• val it = [[“a”]] : string list list
ML – Meta LanguageOutras Características
• Chamada por valor (call-by-value evaluation)
• Gerenciamento de memória automático : Garbage Collection
• Tipos de dados algébricos• Casamento de padrões• Utiliza eager evaluation: ganha memória e
velocidade, mas não pode usar listas infinitas
ML – Meta LanguageCaracterísticas Imperativas
• Referências– São como ponteiros em C e C++
• Exemplos:– Ponteiro para inteiro– val iRef = ref 7;
• val iRef = ref 7 : int ref
– Ponteiro para função– fun id x = x;
• val id = fn : ‘a -> ‘a– val fRef = ref id;
• val fRef = ref fn : ‘a -> ‘a ref
ML – Meta LanguageCaracterísticas Imperativas
• Arrays– Coleções de dados homogêneos fortemente tipados– Podem ser atualizados
• Exemplos– A partir de uma lista
• val l = [3, 5, 1];– val l = [3,5,1] : int list
• val a = Array.fromList l; – val a = [|3,5,1|] : int array
– Especificando o tamanho e um valor default• Array.array (3, “jaca");
– val it = [|“jaca"," jaca "," jaca"|] : string array
– A partir de uma função• Array.tabulate (4, fn x => x + 2);
– val it = [|2,3,4,5|] : int array
ML – Meta LanguageCaracterísticas Imperativas
• Vetores– São como arrays, mas não podem ser
atualizados e fornecem acesso aleatório• Exemplos
– A partir de uma lista• Vector.fromList ["alpha", "beta", "gamma",
"delta"]; – val it = #["alpha","beta","gamma","delta"] :
string vector
– A partir de um array• val a = Array.tabulate (4, fn x => x + 2);
– val a = [|2,3,4,5|] : int array
• val v = Array.extract (a, 1, SOME(2));– val v = #[3,4] : int vector
ML – Meta LanguageCaracterísticas Imperativas
• Exceções
• Exemplo– fun illustrate1 i = if i > 0 then i - 1 else raise
Example; • val illustrate1 = fn : int -> int
– fun ill2 j = illustrate1 j handle Example => (print "Example raised!\n"; 0);
• val ill2 = fn : int -> int – ill2 17;
• val it = 16 : int – ill2 0;
• Example raised! • val it = 0 : int
ML – Meta LanguageUso
• Compiladores• Analisadores• Provadores de teorema• Bio-Informática• Sistemas Financeiros• Aplicações com banco de dados
genealógicos• Programas cliente/servidor
OCAML – Objective CAML
• Desenvolvida por Xavier Leroy, Jérôme Vouillon, Damien Doligez e Didier Rémy em 1996
• Open Source mantida pelo INRIA (licença LGPL)• Derivada de ML herdando suas principais características
– Fortemente tipada– Estaticamente tipada– Inferência de tipos
• Multi-paradigma– Funcional– Imperativo– Orientação a objeto
• Dá ênfase em performance– Compilador gera código otimizado– Segundo Xavier Leroy, alcança 50% da performance
de um código C
OCAML – Objective CAML
• O compilador gera código nativo para as plataformas:– Windows, Unix e Mac OS X
• Excelente portabilidade– IA32, AMD64, PowerPC, Sparc, IA64,
Alpha, HP/PA, MIPS e StrongARM• Possibilidade de uso de Multithread
– Porém o Garbage Collector não foi projetado para dar suporte a concorrência
OCAML – Objective CAML
• Exemplo– Declarando Classe
#class point =
object
val mutable x = 0
method get_x = x
method move d = x <- x + d
end;;
OCAML – Objective CAML
• Exemplo– Instanciando
#let p = new point;;– Invocando Métodos
#p#get_x;;
- : int = 0
#p#move 3;;
- : unit = ()
#p#get_x;;
- : int = 3
OCAML – Objective CAMLAplicações
• Uso Comercial– Slam Project da Microsoft
• Técnicas de análise estática para encontrar bugs em device drivers
– Software financeiro da LexiFi– Med-Sumo
• Sistema de bio-informática distribuído pela empresa Medit
– Merjis Ltd é uma empresa especializada em web marketing que possui diversas ferramentas de uso interno desenvolvidas em OCAML
OCAML – Objective CAMLAplicações
• Utilitários– MLDonkey
• Programa p2p– Unison
• Sincronizador de arquivos– Texvc
• Um compilador TeX• Educacionais
– GeoProof• Software de geometria
– MinCaml• Pequeno tutorial de compilador
OCAML – Objective CAMLAplicações
• Engenharia– Confluence
• Gera lógica digital para FPGA ou código C para softwares de tempo real
• Entretenimento– Desenvolvimento de jogos simples
• Gerador de labirinto 2D• Solucionador de Sudoku• Dominó
– Simulador de gravidade
OCAML – Objective CAMLAplicações
• Ciência– Provador de teoremas HOL– Sistema de gerenciamento de provas
formais– Orpie
• Uma calculadora para console
FSharp
• Combinação da eficiência, scripting, sistema de tipos forte e produtividade de ML com a estabilidade, bibliotecas, compatibilidade (cross-language) e ferramentas de .NET
• Multi-paradigma– Funcional– Orientada a objetos
FSharp
• Fornece a combinação de:– Scripting interativo (como Python)– A base para ambientes de visualização de dados
interativos (como o MatLab)– Sistema de tipos forte e inferência de tipos (de
ML)– Alta performance (de C#)– Fácil acesso às bibliotecas da .NET e
ferramentas de banco de dados– Baseada em simplicidade (como Scheme)– Integração com o Visual Studio– A velocidade de execução de código nativo da
plataforma .NET
FSharp
• É uma variante de ML• Compartilha o núcleo da linguagem com
OCaml• Ao contrário de outras linguagens de script,
F# roda na mesma (ou quase mesma) velocidade de C# ou C++– Performance através de sistema de tipos
forte
FSharp
• C# e F# podem se chamar diretamente– F# tem acesso imediato à API da
plataforma .NET, incluindo, por exemplo, WinForms e DirectX
– Bibliotecas desenvolvidas em F# podem ser utilizadas por outras linguagens .NET
• F# também é compatível Caml– Poucas mudanças de pré-compilação são
necessárias– Facilita porting de código escrito em Caml
para .NET
FSharpObjetivos
• Resolver os 7 grandes problemas que levam ao desuso de linguagens funcionais– Bibliotecas
• Acesso às bibliotecas .Net sem necessidade de wrappers
– Portabilidade• Através de .NET
– Disponibilidade– Pacotes
• Assemblies de .NET provêm mecanismo de pacotes
– Ferramentas• Integração com o Visual Studio
– Treinamento– Popularidade
• Projeto similar ao OCaml
FSharpÁreas de Aplicação
• Programação orientada à Matemática• Desenvolvimento de aplicações científicas
e de engenharia• Implementação de análises simbólicas
sofisticadas– Verificação de hardware– Verificação de software– Otimização– Aprendizagem de máquina– Desenvolvimento de compiladores
F# within .NET
Debuggers
Profilers,Optimizers etc.
System.Windows.FormsAvalon etc.
System.I/OSystem.Net etc.
Sockets etc.
C# CLR GC, JIT, NGEN etc.
VB
ASP.NET
MLF#
F# as a Language
CoreML
Modules-as-values
OCaml F#
“OCaml-Objects”
CoreML
.NET API Access
Other extensions
+ tools+ tools
Powerful, simple programming language
FSharp Observações
• F# é:– Excelente para utilizar bibliotecas .NET– Excelente para escrever bibliotecas ML– OK em tornar bibliotecas ML usáveis por .NET
• O objetivo é escrever programas que:– Utilizam componentes .NET– Necessitam de processamento simbólico– Utilizam componentes escritos em C#
F#, the CLR & .NET Generics
VB VC++ C# ...
MS-IL
NativeCode
Common Language Runtime
F#
Dá suporte a generics e polimorfismo
GC
JITLoaderVerifier
...
F# trabalha com ou sem generics