OCaml
Este artigo não cita fontes confiáveis. (Fevereiro de 2014) |
Objective Caml, também conhecida como OCaml (Objective Categorical Abstract Machine Language), é uma linguagem de programação funcional da família ML, desenvolvida pelo INRIA em 1996. Trata-se da linguagem Caml com a adição de suporte de técnicas de orientação a objetos e algumas alterações e extensões de sintaxe.
Objective Caml | |
---|---|
Paradigma | Multiparadigma: |
Surgido em | 1996 (27–28 anos) |
Última versão | 4.12.0 (24 de fevereiro de 2021 | )
Criado por | INRIA |
Estilo de tipagem |
|
Dialetos |
|
Influenciada por |
|
Influenciou | |
Sistema operacional | Multiplataforma |
Licença | Q Public License (compilador) LGPL (biblioteca) |
Extensão do arquivo |
|
Página oficial | ocaml |
OCaml permite dois tipos de compilação, para bytecode que corre numa máquina virtual (zinc) ou para código de máquina nativo para um grande número de plataformas. Ela não é uma linguagem puramente funcional, permitindo a existência de valores mutáveis bem como de efeitos colaterais (side-effects), tipicamente existentes apenas em linguagens imperativas. Esta característica distingue-a de outras linguagens puramente funcionais, como por exemplo Haskell.
A excelência de seu compilador que tem gerado código nativo rapidamente e com excelente desempenho quanto a tempos de execução, bem como uma biblioteca base extensa, têm-lhe conquistado bastante notoriedade.
Características
editar- Linguagem funcional e imperativa;
- Fortemente e estaticamente tipada;
- Tipos dos valores inferidos automaticamente durante a compilação;
- Estruturação e encapsulamento de código por módulos parametrizáveis ou objectos;
- Tipos pré-definidos como listas, tuplas ou records (sendo os últimos similares aos structs em C);
- Orientação a objetos implementadas com um sistema de troca de mensagens;
- Gerência automática de memória (coletor de lixo).
Exemplos
editarComentários
editar(* Comentário... *)
Olá Mundo
editarprint_endline "Hello world!"
(* Imprime "Hello world!" *)
Funções como valores
editarlet s x y = x + y in
let d x y = x - y in
let sq f x y = (f x y)*(f x y) in
let square_sum = sq s in
let square_dif = sq d in
print_string( string_of_int(square_sum 4 6)^ "\t" ^ string_of_int(square_dif 4 6));;
(* Imprime 100 4 *)
Closures
editarlet gen_next i =
let _add x = i+x in
_add
;;
let f = gen_next 10 in
print_int (f 5);;
(* Imprime 15 *)
Factorial recursivo
editarlet rec fact x =
match x with
|0->1
|_ -> x*(fact (x-1))
;;
print_int (fact 20);;
(* Imprime 45350912 *)
Valores mutáveis (conhecidos como "variáveis", no estilo imperativo)
editarlet a = ref 1;;
print_int !a;;
a:=!a+1;;
print_int !a;;
(* Imprime 1 e 2*)