© casa do código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja...

33

Upload: buinga

Post on 30-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa
Page 2: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

© Casa do Código

Todos os direitos reservados e protegidos pela Lei nº9.610, de

10/02/1998.

Nenhuma parte deste livro poderá ser reproduzida, nem transmitida, sem

autorização prévia por escrito da editora, sejam quais forem os meios:

fotográficos, eletrônicos, mecânicos, gravação ou quaisquer outros.

Casa do Código

Livros para o programador

Rua Vergueiro, 3185 - 8º andar

04101-300 – Vila Mariana – São Paulo – SP – Brasil

Page 3: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

Prefácio

Este é um livro sobre a linguagem de programação OCaml e sobre oparadigma de programação funcional. Não faz tanto tempo, o autor de umlivro como este teria que gastar um número muito maior de palavras justi�-cando para o leitor por que ele deve empreender um esforço para sair da suazona de conforto e aprender um novo paradigma.

Hoje em dia essa tarefa é muito mais fácil, quando consideramos astendências atuais no universo do desenvolvimento de so�ware. Cada vezmais, a indústria de so�ware se convence das vantagens do paradigma fun-cional, e muitas das novas e promissoras ideias sobre programação que apare-ceram nos últimos anos vieram da comunidade da programação funcional. AOrientação a objetos ainda é dominante e continua sendo amplamente usada,mas parece um pouco estagnada: poucas novas ideias parecem estar surgindodesse paradigma. A maior parte das novidades nas novas versões de lingua-gens populares como Java, C� e C++ tem inspiração funcional. Um exemplosão os lambdas (funções anônimas que geram closures) adicionados na ver-são � do Java e no padrão C++��. A cada nova versão, o JavaScript ganhamais e mais características funcionais. Os dois principais ecossistemas paraaplicações gerenciadas, as plataformas Java e .NET, ambos possuem uma oumais linguagens primariamente funcionais de crescente popularidade; Scalae Closure no caso da plataforma Java, e F� em .NET. F� começou basicamentecomo uma versão de OCaml para a plataforma .NET.

Novas linguagens como a Rust, criada pela Mozilla, a Swi�, criada pelaApple, e a Hack, criada pelo Facebook, carregam também uma grande in-�uência funcional. Por sinal, o compilador de Hack é escrito em OCaml.Para programadores que desejam se manter atualizados e em contato com

i

Page 4: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

as boas práticas da indústria, �ca cada vez mais difícil evitar a programaçãofuncional.

Entretanto, embora já exista um bom número de livros sobre linguagensfuncionais disponíveis em inglês, tanto livros mais acadêmicos quanto livrosmais práticos, as opções na língua portuguesa ainda são escassas. Este livroprocura preencher essa lacuna, mas de forma menos acadêmica e mais prag-mática. A forma mais prática de aprender um paradigma é se aprofundandoem uma linguagem importante desse paradigma. Daí este livro, OCaml: pro-gramação funcional na prática.

Por que “na prática"?

Muitos livros sobre programação funcional são livros-textos criados paraserem material didático em disciplinas sobre programação funcional ouparadigmas de linguagens de programação. Isso não é um problema em si;muitos desses livros-textos são excelentes e valem a pena ser lidos. Mas elesfrequentemente incluem tópicos que, embora sejam interessantes, não sãoessenciais para quem quer programar em uma linguagem funcional. Um ex-emplo é falar sobre o lambda-cálculo, que é o fundamento teórico das lingua-gens funcionais; é um tópico interessante mas não necessariamente essencialpara programadores iniciantes nomodelo. Por outro lado, existem caracterís-ticas de OCaml que não são tradicionais nos cursos sobre programação fun-cional, mas que são frequentemente usadas na prática pelos programadores;dois exemplos são os parâmetros rotulados e as variantes polimór�cas.

Este livro é prático porque foi escrito pensando no leitor como um pro-gramador interessado em OCaml e no paradigma funcional, não necessaria-mente um aluno de algum curso. A intenção é equipar o leitor para ler códigoescrito pela comunidade da linguagem e para criar projetos de seu interesseem OCaml, além de mostrar seus princípios fundamentais.

Livros-textos tendem a um enfoque maior nos princípios e na teoria,e menor nos detalhes de linguagens especí�cas. Como um grande tópico,a programação funcional é maior do que apenas OCaml (e OCaml não éapenas funcional), mas consideramos que a melhor forma de aprender umparadigma mais a fundo é se aprofundar em uma linguagem especí�ca desseparadigma. Essa é a intenção deste livro.

ii

Page 5: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

Desta forma, o livro inclui várias dicas e sugestões de como usar OCamldemaneiramais efetiva, além de observações sobre o que é e não é idiomáticona linguagem, de acordo com o código que é produzido pela comunidade deusuários. Embora o livro não cubra algumas características mais recentes eavançadas, a intenção é de que quem leia o livro inteiro tenha condições deentender ��� ou mais do código escrito emOCaml que pode ser encontradona internet. Os tópicos cobertos no livro foram escolhidos com essa intenção.Com essa base coberta, os leitores mais interessados poderão aprender os as-pectos mais profundos da linguagem nos manuais ou em outros materiais.

Este livro também é prático porque inclui, além de vários exemplos pe-quenos que ilustram características especí�cas, alguns exemplos maiores deprogramas relativamente realistas em OCaml. Esses exemplos demonstram,ao mesmo tempo, alguns domínios em que a programação funcional se saibem, e áreas de aplicação que são interessantes para um programador. Ocódigo-fonte desses exemplos é criado e organizado de uma maneira comumpara projetos emOCaml, ilustrando como algumas ferramentas presentes noecossistema da linguagem (por exemplo, ferramentas de build e de teste) sãousadas em projetos reais. Dessa forma, o leitor pode usar os exemplos maislongos como modelos (em termos de organização e ferramentas utilizadas)para seus próprios projetos.

O que se espera do leitor e o que o leitor pode esperar do livro

O presente livro foi escrito pensando no leitor como um programadorcom alguma experiência em linguagens imperativas/OO, mas que não tevecontato anterior com o paradigma funcional, ou teve um contato apenas su-per�cial. Esse ponto de referência é utilizado para centrar as explicações aolongo do texto.

OCaml não é uma linguagem minimalista nem tem a pretensão de ser“simples"; é expressiva e poderosa com um conjunto considerável de featuresadicionadas por cimadonúcleo funcional da famíliaML.A sequência de capí-tulos do livro pretende introduzir a maior parte dessas features em uma or-dem que faça sentido para um iniciante na linguagem. Ao �m do capítulo �,o leitor terá visto todo o núcleo funcional; o �m do capítulo � marca a ex-posição completa do que podemos chamar de núcleo básico das linguagens

iii

Page 6: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

ML. Exceto por diferenças sintáticas, esse núcleo é praticamente o mesmoem OCaml, Standard ML e F�, três linguagens da família ML. A partir daí,passamos a cobrir características mais avançadas de OCaml e que a tornammais única dentro de sua família. No meio dos capítulos introduzindo novaspartes da linguagem, temos dois com estudos de caso mostrando programasmais substanciais em OCaml: um dos capítulos mostra um compilador, uminterpretador e umamáquina virtual para linguagens simples; o outromostracomo analisar dados e como empregar técnicas de aprendizado de máquinapara classi�car informações automaticamente.

A forma recomendada de ler o livro, como qualquer outro livro de pro-gramação, é ativamente: tentando os exemplos, fazendo perguntas ao texto (etentando respondê-las com experimentação), usando o que foi introduzidopara escrever alguns programas pequenos mas interessantes etc. Como disseAristóteles, aquilo que devemos aprender a fazer nós aprendemos fazendo. Osite do livro inclui como material adicional algumas sugestões de exercícios eprojetos de vários níveis de esforço e complexidade para um leitor interessadoem praticar mais.

Site e material adicional

Acompanhando o livro, existe um site commaterial adicional sobre a lin-guagem OCaml, incluindo exercícios, maneiras de fazer perguntas ou discu-tir sobre o livro, textos sobre assuntos não cobertos no texto, indicações deprojetos para escrever em OCaml, e potencialmente mais. É importante paraquem quer aprender mais sobre a linguagem ou o paradigma funcional nãoapenas ler o livro, mas se engajar com o assunto.

O endereço é http://andreiformiga.com/livro/ocaml

iv

Page 7: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

Agradecimentos

Escrever um livro é uma tarefa cansativa, mas recompensadora, e que se tornapossível apenas com a ajuda de algumas pessoas. Embora muita gente adi-cione algo à soma de experiências pessoais que compõem a vida do autor, eugostaria de agradecer em especial a algumas delas.

Primeiramente a meus pais, pelo fato clichê mas verdadeiro de que elessempre �zeram tudo ao alcance para que eu tivesse acesso a uma educação dequalidade e ao conhecimento. Nunca negaram um pedidomeu para comprarlivros e olhe que eu pedi muitos.

À Casa do Código e ao Paulo Silveira, por terem embarcado na ideia defazer um livro emportuguês sobre uma linguagempouco conhecida, que nemé a linguagem funcional mais famosa. Espero que esse livro contribua paraque ela receba um maior reconhecimento, merecidamente.

A Gio e João pela convivência familiar agradável (na maior parte dotempo) e recompensadora, pelo apoio incessante e por tomar a frente em al-gumas tarefas em que eu não podia contribuir mais, pois estava escrevendo.José Antônio ainda está em compilação (em um build de nove meses) mas jáserve como fonte de inspiração.

Aos amigos Maurício Linhares e Yuri Malheiros por terem lido algunscapítulos e sugerido ótimas ideias, algumas das quais foram implementadas etornaram o livro melhor.

Ao leitor que decidiu pegar esse livro e aprender algo novo. Apesar dotrabalho envolvido, posso dizer com sinceridade que foi divertido escrevê-loe espero que você se divirta lendo.

v

Page 8: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa
Page 9: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código

Sobre o autor

Andrei de Araújo Formiga é professor no Centro de Informática da Univer-sidade Federal da Paraíba, mas jura que ainda sabe programar. Apaixonou-sepela programação ainda cedo e nunca a deixou, embora às vezes seja um rela-cionamento à distância por conta de outras obrigações. Mas o reencontro ésempre emocionante.

Suas áreas de interesse como professor, pesquisador e eventual hackerda Torre de Mar�m incluem tudo sobre linguagens de programação (teoria,semântica, implementação etc.). Recentemente tem se interessado muito poraprendizado de máquina e temas relacionados, mas também se diverte lendolivros de matemática e textos escritos por Knuth.

Seu site está localizado em http://andreiformiga.com

vii

Page 10: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa
Page 11: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Sumário

Sumário

� Introdução ��.� Por que programação funcional? . . . . . . . . . . . . . . . . . ��.� Características de OCaml . . . . . . . . . . . . . . . . . . . . . ��.� Por que OCaml? . . . . . . . . . . . . . . . . . . . . . . . . . . ��.� Usos e aplicações . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� O sistema OCaml . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Organização do livro . . . . . . . . . . . . . . . . . . . . . . . ��

� Tipos e valores básicos ���.� Primeiros passos . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Variáveis e tipos básicos . . . . . . . . . . . . . . . . . . . . . . ���.� Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Tipos agregados . . . . . . . . . . . . . . . . . . . . . . . . . . ��

� Registros e variantes ���.� Sinônimos de tipos . . . . . . . . . . . . . . . . . . . . . . . . ���.� Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Variantes simples . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Variantes com valores associados . . . . . . . . . . . . . . . . ���.� Tipos recursivos . . . . . . . . . . . . . . . . . . . . . . . . . . ���.� Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ��

ix

Page 12: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Sumário Casa do Código

� Polimor�smo e mais padrões ���.� As listas prede�nidas . . . . . . . . . . . . . . . . . . . . . . . ���.� Mais sobre padrões . . . . . . . . . . . . . . . . . . . . . . . . ���.� Árvores polimór�cas e valores opcionais . . . . . . . . . . . . ��

� Programação funcional ���.� A essência da programação funcional . . . . . . . . . . . . . . ���.� Mutabilidade e outros efeitos . . . . . . . . . . . . . . . . . . . ���.� Programação recursiva . . . . . . . . . . . . . . . . . . . . . . ���.� Funções de primeira classe . . . . . . . . . . . . . . . . . . . . ���.� Padrões de recursividade . . . . . . . . . . . . . . . . . . . . . ����.� Tipos como fonte de informação . . . . . . . . . . . . . . . . ����.� Dois operadores para aplicar funções . . . . . . . . . . . . . . ����.� Funções de alta ordem em árvores . . . . . . . . . . . . . . . . ���

� Exemplo: interpretador e compilador ����.� Expressões aritméticas . . . . . . . . . . . . . . . . . . . . . . ����.� Interpretação . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Uma máquina de pilha . . . . . . . . . . . . . . . . . . . . . . ����.� Compilação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Otimização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

� Características imperativas ����.� O tipo unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Entrada e saída . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Sequenciamento de expressões . . . . . . . . . . . . . . . . . . ����.� Atualização funcional de registros . . . . . . . . . . . . . . . . ����.� Registros com campos mutáveis . . . . . . . . . . . . . . . . . ����.� Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Estruturas de controle imperativas . . . . . . . . . . . . . . . ����.� Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

x

Page 13: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Sumário

� Módulos ����.� Estruturas e assinaturas . . . . . . . . . . . . . . . . . . . . . . ����.� Acesso aos itens de um módulo . . . . . . . . . . . . . . . . . ����.� Módulos e arquivos . . . . . . . . . . . . . . . . . . . . . . . . ����.� Funtores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ����.� Extensão de estruturas e assinaturas . . . . . . . . . . . . . . . ����.� Módulos de primeira classe . . . . . . . . . . . . . . . . . . . . ���

� Exemplo: árvores de decisão ����.� O problema do Titanic . . . . . . . . . . . . . . . . . . . . . . ����.� Um pouco sobre aprendizado de máquina . . . . . . . . . . . ����.� Inferência de árvores com ID� . . . . . . . . . . . . . . . . . . ���

�� Parâmetros rotulados �����.� Rótulos para nomear parâmetros . . . . . . . . . . . . . . . . �����.� Parâmetros opcionais . . . . . . . . . . . . . . . . . . . . . . . �����.� Inferência de tipos e funções de alta ordem . . . . . . . . . . �����.� Sugestões para o bom uso de rótulos . . . . . . . . . . . . . . ���

�� Variantes polimór�cas e extensíveis �����.� Limitações dos tipos variantes . . . . . . . . . . . . . . . . . . �����.� Variante polimór�cas . . . . . . . . . . . . . . . . . . . . . . . �����.� Variantes extensíveis . . . . . . . . . . . . . . . . . . . . . . . . �����.� Variantes de tipos variantes . . . . . . . . . . . . . . . . . . . . ���

�� Um pouco sobre objetos �����.� Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . �����.� Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ���

�� Organização de projetos e testes �����.� Organização do projeto com OASIS . . . . . . . . . . . . . . . �����.� Testes com OUnit . . . . . . . . . . . . . . . . . . . . . . . . . ���

Versão: ��.�.�

xi

Page 14: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa
Page 15: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

C������� �

Introdução

OCaml é uma linguagem funcional com tipagem estática criada pelo institutode pesquisa francês INRIA (Institut National de Recherche en Informatique eten Automatique). O “Caml” no nome é pronunciado como “camel” mesmo, epor isso os logotipos da linguagem geralmente representam um camelo (veja�gura �.�). Fora isso, não é preciso se preocupar muito em como pronunciar onome da linguagem, já que os falantes de língua inglesa pronunciam de umaforma e os criadores da linguagem, que são franceses, pronunciam de outra.

Page 16: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Por que programação funcional? Casa do Código

Fig. �.�: Logotipo da linguagem OCaml

�.� P�� ��� ����������� ����������Aprender um novo paradigma de programação requer sair da zona de con-forto. Os primeiros passos são difíceis, e às vezes é frustrante tentar se ex-pressar e resolver problemas no novo modelo, pensando que, se fosse umalinguagem que conhecemos, o mesmo problema seria resolvido em poucosminutos.

Mas em compensação aprender um novo paradigma nos dá uma novavisão sobre programação e como resolver problemas. Essa nova perspectivarende benefícios que vão além de linguagens de programação especí�cas, egera insights que podem ser usados em muitas linguagens diferentes, mesmoque não sejam do novo paradigma.

“Uma linguagem que não afeta sua forma de pensar sobre programação é umalinguagem que não vale a pena conhecer”– Alan Perlis

Se você está lendo até aqui, é porque já tem algum interesse em apren-der programação funcional. Talvez você tenha visto que várias linguagenspopulares estão incorporando mais características funcionais em cada ver-são. Talvez você tenha percebido que várias das novas linguagens que es-tão sendo discutidas por desenvolvedores no mundo todo, como Rust, da

Page 17: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

Mozilla, Hack do Facebook ou Swi� da Apple, são fortemente in�uenciadaspela programação funcional. Talvez você tenha ligado os pontos e visto quea programação funcional se torna cada vez maismainstream, e conhecer esseparadigma se torna importante até para usar bem linguagens tradicionaiscomo Java.

Como o objetivo é aprender programação funcional através de umalinguagem, é interessante escolher uma que seja primariamente funcional,mesmo que tenha características de outros modelos. OCaml tem essa carac-terística e é uma boa escolha para aprender o paradigma. Mas não é a única:muita gente já ouviu falar de linguagens como Scala, Clojure, Haskell e F�.

Não que OCaml seja a melhor opção absoluta entre essas, mas ela é umaopção muito boa. Antes de justi�car essa a�rmação, veremos algumas carac-terísticas da linguagem.

Page 18: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Características de OCaml Casa do Código

O ���� OC��� ������� ��� ��������

Onome da linguagem carrega vários aspectos de sua história. OCamlfaz parte da família ML de linguagens, que começou com a ML originalcriada na universidade de Edimburgo por Robin Milner, no começo dadécada de ��. ML signi�ca Meta Language pois ela foi feita para fun-cionar como a meta-linguagem do provador de teoremas LCF. Mas osprimeiros usuários deML perceberam que ela funcionava bem para pro-gramar outras coisas, então ela foi separada do seu sistema de origem.

Com o aumento de popularidade, ainda no meio acadêmico, váriasversões de ML foram desenvolvidas em universidades e institutos da Eu-ropa. No INRIA da França, Pierre-Louis Curien criou a Categorical Ab-stract Machine (CAM), uma máquina virtual e modelo de computaçãoadequado para execução de linguagens funcionais. Gérard Huet e outrospesquisadores criaram uma versão de ML usando a máquina CAM, e achamaram de CAML.

A máquina CAM e a linguagem CAML surgiram em meados da dé-cada ��, mas a implementação de CAML era considerada “pesada”, poiso código executado era lento e usava muita memória. Isso levou XavierLeroy e Damien Doligez a criarem, no início dos anos ��, a implemen-tação Caml Light para a linguagem, que era muito mais rápida e com-pacta. Orientação a Objetos estava na moda na década de ��, de modoque a linguagem foi estendida com a adição de classes e objetos, resul-tando na Objective Caml, que é basicamente a versão usada até hoje. Em����, o nome foi mudado o�cialmente paraOCaml, que era o apelido in-formal usado pela comunidade. Mais detalhes sobre sua história podemser encontrados na URL http://caml.inria.fr/about/history.en.html

�.� C�������������� ��OC���Acho que a essa altura já deu para perceber que OCaml é uma linguagemfuncional (tem até no título do livro). Mas nem toda linguagem funcional éigual, então começamos listando as suas principais características.

Page 19: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

Estaticamente tipada: assim como Java, C�, Haskell e Scala, OCaml éestaticamente tipada; o compilador veri�ca os tipos dos valores e variáveisutilizadas, e não compila código que apresente erros de tipo. Tipos são impor-tantes na programaçãoOCaml não só para detectar erros no código,mas tam-bém como forma de expressar ideias relacionadas ao projeto do programa.Esse tema será explorado repetidamente, ao longo do livro.

Inferência de tipos: se mostrarmos um trecho de código OCaml parauma programadora que não conhece a linguagem (nem outras similares aela), ela pode achar que ela é dinamicamente tipada. Por exemplo, segue umafunção em OCaml que retorna a diferença entre dois números, em valor ab-soluto:

A função se chama dif, mas onde estão os tipos? Diferente de umalinguagem como Java, em OCaml o programador geralmente não precisadeclarar os tipos de variáveis e funções. O compilador de OCaml deter-mina automaticamente os tipos envolvidos. Para essa função, é determinadoo seguinte tipo:

Isso signi�ca que a função dif recebe dois parâmetros inteiros e re-torna um inteiro, como aprenderemos mais tarde. A inferência de tipos sig-ni�ca que código OCaml pode ser compacto como o de uma linguagem comtipagem dinâmica, mas com todas as garantias e vantagens de ter um sistemade tipos com tipagem estática.

Orientada a expressões: diferente da maioria das linguagens imperativas(mas similar a outras funcionais), OCaml é orientada a expressões e não ori-entada a comandos. Isso signi�ca que todas as estruturas em código OCamlsão declarações ou expressões. O interessante de expressões é que elas têmumvalor, e as partes de uma expressão que também são expressões (chamadasde subexpressões) também têm um valor associado a elas. A ideia da progra-mação funcional é que o programa seja uma composição de expressões, comoocorre na matemática, em vez de uma lista de comandos como acontece na

Page 20: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Características de OCaml Casa do Código

programação imperativa. As consequências práticas disso serão discutidas apartir do próximo capítulo.

Compilação nativa ou para bytecode: OCaml tem dois compiladores:um que gera código nativo para um processador especí�co e um que geracódigo bytecode para uma máquina virtual. O compilador para código na-tivo é o ocamlopt, enquanto que o de bytecode é ocamlc. Ambos devemestar presentes em qualquer instalação do sistema OCaml. O código compi-ladonativamente executarámais rápido e é normalmente usado emprodução.Em teoria, o código bytecode deveria ser portável para diferentes plataformas(como acontece em Java) mas, na prática, não é. A grande vantagem de com-pilar para bytecode é a velocidade de compilação, e a possibilidade de usaro código compilado para bytecode no modo interativo da linguagem (comoveremos a seguir). Em geral, usa-se o compilador bytecode durante o desen-volvimento, e o compilador nativo em produção.

Uso interativo ou em batch: não é raro ver as linguagens de programaçãoseparadas em duas classes: linguagens compiladas e linguagens interpretadas.Essa classi�cação segue o senso comum, mas não é muito correta. Uma lin-guagem de programação pode ser implementada de várias formas, as maiscomuns sendo através de interpretação ou compilação (mesmo a diferençareal entre interpretação e compilação seja mais complicada do que a maioriados programadores tem conhecimento).

OCaml tem, de certa forma, algo parecido com os dois modos: interpre-tação e compilação. Código OCaml pode ser compilado com um dos com-piladores e executado (modo batch) ou pode ser usado interativamente, exe-cutando código à medida em que é digitado. Mas esse modo interativo nãoé, realmente, um interpretador: ele apenas compila cada expressão que é dig-itada para bytecode imediatamente, e o executa quando necessário. O quemuitos chamam de interpretador é mais precisamente chamado de loop inter-ativo ou REPL, sigla de Read-Eval-Print Loop. Porque o REPL faz exatamenteisso: é um loop contínuo de ler (Read) a entrada, executá-la (Eval) de algumaforma, e imprimir (Print) o resultado. Daqui para frente, usaremos o termoREPL neste livro (alguns textos que falam sobreOCaml usam o termo toplooppara o REPL).

ADTs e Pattern matching: assim como acontece em outras linguagens

Page 21: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

funcionais como Scala e Haskell, é difícil ler um programa não trivial emOCaml que não use os tipos de dados algébricos (ADTs, do inglês algebraicdata types) e pattern matching. Os ADTs nos permitem construir valores comestrutura complexa de maneira simples, e o pattern matching nos dá a capaci-dade de examinar valores com estrutura complexa de forma simples. Quemse acostuma a usar essas características por um tempo geralmente não quermais voltar a programar sem elas.

Módulos: OCaml possui um avançado sistema de módulos para orga-nização do código. Programas simples geralmente existem em um únicomódulo, mas a capacidade de criar e combinar módulos com característi-cas avançadas ajuda na estruturação de aplicações e bibliotecas complexas.Osmódulos de primeira-classe também podem ajudar na organização de umaaplicação em um núcleo �xo e um conjunto demódulos dinamicamente con-�gurados, como um sistema de plugins.

Objetos e classes: embora não seja muito usado pela comunidade,OCaml inclui um sistema de objetos que, embora tenha características umpouco diferentes das linguagens orientadas a objetos mais tradicionais, in-clui a possibilidade de usar várias práticas do paradigma OO, como herança,encapsulação, métodos virtuais etc.

Avaliação estrita: similar à maioria das linguagens de programação maisconhecidas, mas diferente de linguagens comoHaskell, a avaliação emOCamlé estrita. De forma simples, a maneira mais direta de ilustrar a diferença entreavaliação estrita e não-estrita é usando a operação de chamada de função; naprogramação funcional, essa operação é normalmente chamada de aplicaçãode uma função aos seus argumentos. Em uma linguagem estrita, primeiro édeterminado o valor de todos os argumentos para a função, e os valores deter-minados são passados para a função. Em uma não-estrita, esse valor é deter-minado quando necessário, o que às vezes é chamado de avaliação preguiçosa,embora os dois termos (avaliação não-estrita e avaliação preguiçosa) não sig-ni�quem exatamente a mesma coisa. O código compilado para uma lin-guagem usando avaliação estrita tende a ser mais e�ciente, e sua e�ciênciatende a ser mais previsível, principalmente com relação ao uso da memória.

Mas a avaliação não-estrita também tem suas vantagens. Um exemploé que é muito mais simples trabalhar com estruturas de dados in�nitas na

Page 22: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Por que OCaml? Casa do Código

avaliação não-estrita.

�.� P�� ���OC����Além do benefício de aprender um novo paradigma de programação, a lin-guagem OCaml pode ser utilizada com vantagem em projetos de progra-mação. Em comparação com outras linguagens, OCaml oferece uma boacombinação de poder expressivo e e�ciência. Programas escritos em OCamltendem a ter desempenho mais próximo de linguagens como C++, mas comcódigo mais sucinto, geralmente mais próximo de linguagens como Python eRuby.

Desempenho e expressividade

O grá�co na �gura �.� mostra os dados do Computer Language Bench-marks Game um benchmark comparativo que consiste em executar progra-mas equivalentes em várias implementações de linguagens de programação.O grá�co mostra o tempo de execução dos programas no eixo horizontal, e otamanho do código (em linhas) no eixo vertical (ambos os eixos estão em es-cala logarítmica para facilitar a visualização). Cada ponto representa um pro-grama do benchmark, e os asteriscos grandes representam as médias de cadalinguagem. Os dados podem ser encontrados em http://benchmarksgame.alioth.debian.org/

Pelas médias, vemos que o desempenho dos programas emOCaml é bas-tante próximo dos programas em C++, mas o tamanho dos programas tam-bém. Comparações baseadas nesse tipo de programa pequeno frequente-mente apontam resultados que não ocorrem muito em programas reais. Nosdados da �gura �.�, os programas emOCaml e C++ são, namédia, cerca de ��vezesmais rápidos que emPython eRuby; essa diferença tende a sermenor naprática. Damesma forma, a experiência de programar emOCamlmostra queo tamanho do código deveria ser mais próximo do nível de Python e Ruby.Um fato que pode explicar a diferença é que a biblioteca padrão OCaml vemcommenos funcionalidades prede�nidas que as de Python e Ruby; isso podeaumentar o tamanho dos programas OCaml nessa comparação direta de pro-gramas pequenos, mas não faria muita diferença em programas maiores.

Page 23: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

Fig. �.�: Desempenho e tamanho de código para dez programas do shootoutem quatro linguagens.

Uma experiência realista interessante foi a conversão do programa0install de Python para OCaml. O �install é um sistema multiplataformade instalação para programas, e em junho de ���� o autor do �install,�omasLeonard, decidiu estudar a viabilidade de várias linguagens para reescrevero programa, substituindo Python. Após análise, ele decidiu usar OCaml eportar para essa linguagem as mais de �� mil linhas de código. O programaresultante em OCaml tem aproximadamente o mesmo tamanho da versãooriginal em Python (com uma pequena vantagem para o código OCaml) e écerca de dez vezes mais rápido, na média. O autor gostou tanto da experiên-cia de usar OCaml que hoje trabalha pro�ssionalmente com a linguagem. Ostextos dele sobre a conversão do �install para OCaml são interessantes paramostrar o ponto de vista de alguém interessado em usá-la. Uma retrospectivaque contém links para os outros textos que ele escreveu sobre o assunto podeser encontrada em

Page 24: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Por que OCaml? Casa do Código

http://roscidus.com/blog/blog/����/��/��/python-to-ocaml-retrospective/

Outras linguagens funcionais

É natural comparar a linguagem OCaml a outras linguagens funcionais.Algumas das mais conhecidas e usadas são Haskell, Scala, Clojure, F� eScheme. Todas essas linguagens são interessantes para aprender e podem serúteis em uma variedade de situações práticas. Haskell é uma linguagem fun-cional pura e com avaliação não-estrita, o que exige o uso de métodos deprogramação bastante únicos que podem providenciar vários insights sobrea prática da programação. Clojure e Scheme são linguagens da família Lisp,que são interessantes pelamaleabilidade do sistema demetaprogramação e daideia de representar código e dados da mesma forma. F� tem acesso às bib-liotecas da plataforma .NET e do Mono, incluindo várias boas opções paradesenvolvimento de jogos (MonoGame, Unity e o Unreal Engine por exem-plo).

Ainda assim, OCaml é uma boa opção para aprender como primeira lin-guagem funcional. Um dosmotivos para isso é que OCaml émultiparadigmae permite o uso de características imperativas, oumesmoorientadas a objetos,de maneira similar às linguagens mais conhecidas; isso possibilita uma tran-sição mais fácil para a programação funcional, ou mesmo a opção de usarcódigo imperativo ou OO quando for a melhor solução. Ao mesmo tempo,muitos dos conceitos de programação funcional da linguagem OCaml pos-suem similares próximos em outras linguagens funcionais, especialmente naslinguagens com tipagem estática como Haskell.

Assim, um programador familiar com OCaml deve ter maior facilidadeem aprender Haskell do que alguém que nunca trabalhou com uma lin-guagem funcional antes. Por outro lado, começar comHaskell como primeiralinguagem funcional tende a sermais difícil do que começar comOCaml, poisa quantidade de novos conceitos a aprender émaior. Diferente damaioria dasoutras linguagens, Haskell tem avaliação não-estrita e usa o conceito de mô-nadas para controlar os efeitos colaterais.

Aprender F� para quem sabe OCaml é simples, já que as duas linguagensestão fortemente relacionadas. Os conceitos funcionais se aplicamdemaneira

��

Page 25: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

similar em linguagens como Scala e Clojure, e mesmo em linguagens maisrecentes como Idris.

OC��� � F�

As linguagens OCaml e F� são bastante similares, e não é à toa: F�foi basicamente criada para ser uma versão de OCaml para a plataforma.NET. Inicialmente criada como uma linguagem experimental por DonSyme, na Microso� Research (braço da Microso� ligado à pesquisa), F�rapidamente começou a achar usuários dentro da própria Microso�, oque estimulou a continuação de seu desenvolvimento. F� começou comum núcleo quase idêntico ao de OCaml, embora já com algumas difer-enças; com o tempo, F� foi adquirindo características que não existiamoriginalmente em OCaml, mesmo sem ter adquirido todas os aspectosda linguagem original. OCaml também continuou a ser desenvolvidae ganhou novas facetas que até hoje não existem F�. A situação hoje éque ambas são quase idênticas nos seus núcleos básicos, mas cada umapossui uma série de características mais avançadas que a outra não tem.Além disso, existem diferenças importantes na questão das bibliotecas:F� tem acesso fácil às bibliotecas da plataforma .NET e do Mono, en-quanto que OCaml tem acesso mais direto a bibliotecas criadas na lin-guagem C. Esses fatores fazem com que, na prática, código OCaml e F�tenham diferenças signi�cativas em projetos reais, apesar de as duas lin-guagens terem núcleos tão similares.

OCaml possui um sistema de tempo de execução (runtime) relativamentesimples, principalmente quando comparado a plataformas complexas como aJVM e oCLR da plataforma .NET e doMono. O compiladorOCaml funcionademaneira relativamente transparente quanto ao desempenho do código ger-ado: a relação entre o código e seu desempenho quando compilado é relativa-mente previsível; ou seja, um programador OCaml com alguma experiênciaconsegue ter uma boa ideia de se um trecho de código vai executar rapida-mente ou não. Esses fatos são importantes em aplicações que fazem interfacecom sistemasmais básicos, como sistemas embarcados. Isso também signi�ca

��

Page 26: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Usos e aplicações Casa do Código

que saber como o runtime representa os valores de OCaml na memória tornao interfaceamento com bibliotecas criadas na linguagem C uma tarefa sim-ples.

�.� U��� � ����������OCaml certamente é menos utilizada do que linguagens conhecidas, comoC++ e Java, mas está longe de ser apenas uma linguagem experimental. Ex-istem usuários com aplicações de complexidade e tamanho signi�cativos es-critas na linguagem. Muitas dessas aplicações tendem a ser de domínios rel-ativamente complexos ou que usam pesquisa de ponta, e algumas delas fun-cionam em um ambiente que requer alta con�abilidade. Nesta seção men-cionamos alguns dos usos, usuários e aplicações importantes de OCaml.

A Jane Street Capital é uma empresa �nanceira especializada na com-pra e venda de produtos �nanceiros em alta frequência (High-Speed Trading).A Jane Street usa OCaml como sua linguagem principal em toda a empresa,inclusive os programas que realizam altos volumes de transações �nanceiras.Como essas transações ocorrem muito rapidamente, defeitos no código dosprogramas podem causar prejuízos enormes em pouquíssimo tempo; isso ex-ige so�ware de alta con�abilidade. Após um tempo usando linguagens maisconhecidas, a Jane Street escolheu OCaml para criar esses programas, con-siderando que essa é uma boa escolha devido aos requerimentos impostospela atuação da empresa. Atualmente, a Jane Street é umdosmaiores usuáriosda linguagem, comuma base de códigoOCaml demais de trêsmilhões de lin-has. Yaron Minsky da Jane Street explica a experiência deles usando OCamlno vídeo Caml Trading http://vimeo.com/��������

Coq é um sistema assistente para provas (proof assistant) que pode serusado para auxiliar na prova de teoremas matemáticos (e veri�car as provascriadas), para veri�cação de outros sistemas de so�ware (provar que um pro-grama segue a sua especi�cação), e como sistema de programação, para criaros chamados programas certi�cados. Um programa certi�cado é um pro-grama correto por construção, ou seja, que já é criado com uma prova decorretude associada. Simpli�cando, a ideia é que, se um programa escrito emCoq usando especi�cações fortes é compilado corretamente (embora não seja

��

Page 27: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

exatamente um compilador), temos uma garantia de que o programa seguea sua especi�cação. Coq já foi usado na veri�cação de importantes teoremasmatemáticos (como o teorema das quatro cores), na escrita de um compiladorcerti�cado para a linguagem C (http://compcert.inria.fr/) e na veri�cação devários sistemas de missão crítica. O sistema Coq em si é o resultado de trêsdécadas de pesquisa no INRIA e é escrito em OCaml, incluindo cerca de ���mil linhas de código na linguagem. Em ����, o sistema Coq ganhou o prêmioSo�ware SystemAwardda ACM (Association for ComputingMachinery) comoreconhecimento por ser um sistema de so�ware com in�uência duradoura.

O Mirage OS é um sistema operacional criado especi�camente para acomputação em nuvem, e é escrito completamente em OCaml. O site do sis-tema operacional em http://www.openmirage.org/ funciona a partir de umservidor em que todo o so�ware foi escrito em OCaml, incluindo os pro-tocolos de rede. Para criar uma aplicação que rodará na nuvem, o usuáriocria um programa OCaml que usa as bibliotecas do Mirage. Durante o de-senvolvimento, essas APIs funcionam como bibliotecas que executam acimade sistemas Unix, e o programa compilado pode ser testado como qualqueroutro. Quando é necessário fazer deploy do serviço ou aplicação, o programaemOCaml é compilado para um unikernel, umnúcleo de sistema operacionalcriado especi�camente para a aplicação; as chamadas à API do Mirage nessecontexto viram chamadas de sistema. A aplicação criada dessa forma podeexecutar em qualquer plataforma que suporte o hipervisor Xen, o que incluia maior parte dos fornecedores de servidores na nuvem como Amazon EC�,Linode, Rackspace e outros.

Um dos problemas que a Microso� tinha com o Windows era o grandenúmero de erros críticos que o sistema apresentava (a famosa tela azul porexemplo). Analisando os dados relativos a esses erros, �cou claro que amaiorparte dos problemas era causada por falhas nos drivers de dispositivos, muitosdeles criados por outras empresas e não pela própria Microso�. Essa de-scoberta estimulou a criação de um projeto para detecção automática de de-feitos e veri�cação de drivers escritos em C. Esse projeto se chamou SLAM eumdos produtos resultantes dele foi a ferramenta SDV (Static Driver Veri�er),que foi criada para a veri�cação de drivers. O SDV foi escrito em OCaml efoi incluído noKit de desenvolvimento para drivers o�cial daMicroso� (Win-

��

Page 28: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. O sistema OCaml Casa do Código

dowsDriver Development Kit), e essa tecnologia foi importante na diminuiçãodos erros críticos em versões mais recentes do Windows.

Além do compilador da linguagem Hack, o Facebook tem várias ferra-mentas internas criadas na linguagem OCaml. Um exemplo é o pfff, umconjunto de ferramentas para analise de código escrito em várias linguagens(incluindo OCaml e PHP); essas análises auxiliam na implementação, de-tecção automática de defeitos, indexação e busca de código, e visualizaçãode código. As ferramentas pfff são usadas no código do próprio Facebook,uma base de mais de �milhões de linhas de código em PHP (e, hoje em dia,uma parte em Hack).

Esses são apenas alguns exemplos. Para encontrar outros basta procurarpelas palestras apresentadas em eventos como oOCaml Users and DevelopersWorkshop (OUD) e o Commercial Users of Functional Programming (CUFP).

�.� O �������OC���O sistema OCaml é um conjunto de ferramentas criadas para programar emOCaml, incluindo os compiladores e o REPL. Além do sistema básico, criadoe mantido pela INRIA, a maioria dos programadores OCaml utiliza um con-junto de ferramentas e bibliotecas externas que tornam o uso da linguagemmais prático. Uma delas é o gerenciador de pacotes OPAM (OCaml PAck-age Manager), que serve tanto para instalar o próprio sistema OCaml quantobibliotecas criadas por terceiros.

Nesta seção, o objetivo é entender, em linhas gerais, como as ferramentaspara programação OCaml estão organizadas, quais não são parte do sistemabásico são recomendadas para uso, e como instalá-las.

Ferramentas da distribuição

A distribuição OCaml básica inclui um conjunto de ferramentas impor-tantes para a programação na linguagem. Além do REPL ( ocaml), do com-pilador nativo ( ocamlopt) e do compilador de bytecode ( ocamlc), algumasoutras ferramentas importantes são:

• ocamldoc é um gerador de documentação baseada em comentários,similar ao JavaDoc.

��

Page 29: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

• ocamlbuild é uma ferramenta para compilação de projetos OCaml.

• ocamldep é um analisador de dependências entre arquivos de código-fonte, geralmente usado para determinar a ordem de compilação dosarquivos.

• ocamllex e ocamlyacc são geradores de analisadores léxicos e sin-táticos, usados principalmente na criação de compiladores e interpre-tadores para outras linguagens.

• ocamlmktop possibilita a criação de REPLs custommizados paraOCaml. As customizações incluem, por exemplo, carregar certas bib-liotecas automaticamente para uso no modo interativo.

A distribuição também inclui algumas outras ferramentas, mas as duasprimeiras ( ocamldoc e ocamlbuild) são as mais utilizadas.

REPL e uso interativo

Usar a linguagem em modo interativo pode ser bem útil principalmentepara testar e explorar novas ideias. A possibilidade de obter respostas ime-diatamente, sem precisar compilar um arquivo e executá-lo na linha de co-mando, é uma conveniência que muitos usuários consideram imprescindível.

Esse uso interativo é especialmente útil para testar os trechos de códigoque são apresentados como exemplo neste livro. Poder reproduzir os exem-plos, tentar variações e ver imediatamente os resultados tende a acelerar oaprendizado. Para usar a linguagem interativamente, a forma mais comum éusar algum tipo de REPL (Read Eval Print Loop).

O REPL padrão incluído com a distribuição da linguagem ( ocaml) fun-ciona, mas tem muitas de�ciências importantes. A edição da entrada é bas-tante básica e não permite, por exemplo, usar as teclas direcionais paramudaro local do cursor. Também não há suporte para um histórico de linhas digi-tadas. Uma solução é o utilitário ledit para adicionar essas capacidades aoREPL padrão.

Melhor ainda é usar o utop, um REPL bastante melhorado para a lin-guagem, que inclui o uso de cores no terminal e suporte a autocompletar.Instalá-lo é fácil para quem usa o OPAM, como veremos a seguir.

��

Page 30: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. O sistema OCaml Casa do Código

Outra opção é o ocaml-top, que usa uma interface grá�ca com ousuário.

Pacotes e bibliotecas: OPAM e �ndlib

Duas ferramentas externas ajudam na instalação e uso de bibliotecas eoutros pacotes para a linguagem OCaml: OPAM (OCaml Package Manager) efindlib. findlib é uma ferramenta para instalação, gerenciamento e usode bibliotecas para a linguagem OCaml. Os compiladores OCaml acessambibliotecas de forma similar aos compiladores das linguagens C e C++, us-ando opções de linha de comando para incluir certos diretórios onde o com-pilador deve buscar os arquivos necessários. O findlib inclui uma ferra-menta chamada ocamlfind que simpli�ca bastante o uso das bibliotecas noscompiladores e outras ferramentas do sistema OCaml.

findlib funciona apenas localmente, como um registro central de bib-liotecas e uma forma de usá-las facilmente. O cenário de uso apenas dofindlib é obter o código-fonte de uma biblioteca, compilar o código, e in-stalar a biblioteca compilada, isso tudo feito pelo usuário. findlib nãobaixa pacotes da internet, não gerencia as dependências, não compila os pa-cotes nem sabe como atualizar as bibliotecas. Para isso é necessário usar oOPAM.

OPAM é um sistema de gerenciamento de pacotes para a linguagemOCamlcom um sistema de gerenciamento de dependências avançado. Apesar de seruma ferramenta recente em comparação a outras do ecossistemaOCaml, hojea maioria dos usuários da linguagem usa o OPAM. Com ele, é possível instalarbibliotecas (e suas dependências) automaticamente, e mantê-las atualizadas.Também é possível ter várias versões do sistema OCaml instaladas, e sele-cionar qual versão se quer usar (isso é usado inclusive para testar versõesfuturas do compilador e novas features). O OPAM se encarrega de baixar ocódigo-fonte, compilar e instalar a biblioteca; esse processo de instalação in-clui instalar a biblioteca no registro de bibliotecas do findlib. O uso dasbibliotecas continua sendo através do findlib. Também é fácil publicarseus próprios pacotes usando o OPAM.

��

Page 31: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

Instalação

O sistema OCaml está disponível para Windows, Mac OS X, Linux eFreeBSD, e pode funcionar em outros sistemas Unix. Instruções que in-dicam a melhor forma de instalar em cada sistema podem ser encontradasem http://ocaml.org/docs/install.html

Basicamente, em sistemas Linux, o mais adequado é instalar o sistemaOCaml usando o gerenciador de pacotes da distribuição; a maioria das dis-tribuições mais usadas tem um pacote com o sistema OCaml. Em algumasdistribuições (por exemplo, versões recentes de Debian e Ubuntu), tambémé possível instalar o OPAM pelo gerenciador de pacotes. Caso ele não estejadisponível, as instruções para instalar estão em http://opam.ocaml.org/doc/Install.html.

NoMacOSX, é recomendável usar o homebrew, que contém pacotes parao sistema OCaml e para o OPAM, e eles costumam ser bem mantidos e atu-alizados. O comando a seguir é su�ciente para instalar o sistema OCaml e oOPAM.

Independente do sistema operacional, com as ferramentas OCaml e oOPAM instalados, para instalar o utop basta usar, na linha de comando:

Para quem prefere uma interface grá�ca, existe o ocaml-top:

Infelizmente, o OPAM ainda não suporta o uso em sistemas Windows,mas o findlib e muitas bibliotecas importantes funcionam bem no Win-dows. Uma forma de instalar o sistema OCaml é usando o Cygwin, quefornece vários componentes de um sistema Unix no Windows. Dependendode que pacotes sejam instalados no Cygwin, os programas OCaml compila-dos poderão precisar da DLL do Cygwin para executar.

Um instalador que automatiza a instalação do sistema OCaml e váriosoutros componentes da melhor maneira possível no Windows (incluindo a

��

Page 32: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

�.�. Organização do livro Casa do Código

geração de executáveis que não dependem da DLL do Cygwin) pode ser en-contrado em https://protz.github.io/ocaml-installer/.

Um instalador criado pelaOCamlPro e que inclui algumas extensões pro-prietárias para funcionar melhor no Windows é o OCPWin http://typerex.ocamlpro.com/ocpwin.html.

Instalar o utop noWindows é possível mas é preciso compilar várias bib-liotecas das quais o utop depende. Uma alternativamais interessante é instalaro ocaml-top http://typerex.ocamlpro.com/ocaml-top.html.

Editores

Existe suporte de boa qualidade para programação na linguagem OCamlem vários editores de código. Os tradicionais Emacs e vim incluem modospara a linguagem OCaml; na verdade, existem dois modos para usar OCamlno Emacs, caml-mode e tuareg, com muitos usuários preferindo a se-gunda opção.

Uma outra opção popular para edição de texto é Sublime Text. Para quemusa o Package Control no Sublime, é recomendado buscar e instalar o pacotede nomeOCaml em vez de usar o suporte default para a linguagem. Tambémexistempacotes de suporte para outros editores comoTextmate eAtom, assimcomo a maioria dos outros editores usados por programadores.

Material o�cial

O sitemais indicado como página principal para OCaml é o http://ocaml.org.

O INRIA, instituição que criou e atua como principal mantenedor da lin-guagem, tem um site com menos informações em http://caml.inria.fr.

A versão estável mais recente do manual de referência o�cial de OCamlpode ser encontrada em http://caml.inria.fr/pub/docs/manual-ocaml/.

�.� O���������� �� �����Podemos organizar os capítulos do livro em basicamente duas partes: aprimeira (capítulos � a �) é uma introdução à linguagem e descrição dos seus

��

Page 33: © Casa do Código - s3.amazonaws.com · linguagem, é interessante escolher uma que seja primariamente funcional, mesmo que tenha características de outros modelos. OCaml tem essa

Casa do Código Capítulo �. Introdução

aspectos fundamentais, incluindo as suas características funcionais e imper-ativas. No meio dessa parte, há um capítulo com um exemplo mais substan-cial: o capítulo � mostra a criação de um interpretador, um compilador eumamáquina virtual simples. A segunda parte introduz um conjunto de car-acterísticas mais avançadas de OCaml, começando pelo sistema de módulosno capítulo �, e continuando com rótulos, variantes polimór�cas e objetos.No meio desta parte, também há um capítulo com um exemplo maior: nocapítulo � vemos como analisar dados comOCaml e como criar, automatica-mente, classi�cadores de dados empregando a técnica das árvores de decisão.

O objetivo de cobrir esses tópicos é possibilitar ao leitor escrever pro-gramas OCaml e ler e entender a maior parte (de ��� a ���) do códigoOCaml disponível na internet. A partir daí, o leitor pode continuar se apro-fundando na linguagem com outros materiais, consultas ao manual de refer-ência, etc. Materiais adicionais serão publicados também no site do livro emhttp://andreiformiga.com/livro/ocaml.

��