®
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 Funcionais
Vantagens
• 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 Funcionais
Desvantagens
• 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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Outras 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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Caracterí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 Language
Uso
•
•
•
•
•
•
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 CAML
Aplicaçõ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 CAML
Aplicaçõ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 CAML
Aplicaçõ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 CAML
Aplicaçõ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
FSharp
Objetivos
•
•
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
CLR GC,
JIT, NGEN etc.
C#
Profilers,
Optimizers etc.
VB
ML
F#
Debuggers
System.Windows.Forms
Avalon etc.
System.I/O
System.Net etc.
Sockets etc.
ASP.NET
F# as a Language
Powerful, simple programming language
Core
ML
Core
ML
“OCaml-Objects”
OCaml
Modules-asvalues
+ tools
.NET API
Access
F#
Other
extensions
+ tools
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++
Dá suporte a generics
e polimorfismo
C#
...
F#
F# trabalha com ou sem
generics
MS-IL
Common Language Runtime
Loader
Verifier
GC
Native
Code
JIT
...
F# v1.0
• O núcleo e o compilador da linguagem
estão estáveis
• É utilizado internamente pela Microsoft
• Integração com o Visual Studio 2005 Beta 1
• Compatibilidade com biblioteca ML
Download

ML_OCAML_FSharp