® tópicos avançados em linguagens computacionais – if724 ml ocaml fsharp leandro mitsuo rodrigo...

37
® Tópicos Avançados em Linguagens Computacionais – IF724 ML OCAML FSHARP Leandro Mitsuo Rodrigo Lumack [email protected] [email protected] Professor: André Santos

Upload: internet

Post on 19-Apr-2015

111 views

Category:

Documents


0 download

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

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