Ficha OCaml 0: Os primeiros passos com OCaml

 


Esta ficha tem por objetivo a vossa familiarização com as ferramentas básicas de compilação e execução de programas OCaml. Não importa assim tanto aqui perceber em detalhe os programas OCaml que vamos utilizar. Estes vos parecerão familiar mais adiante nesta Unidade Curricular. Não nos debruçaremos sobre o uso dos compiladores que produzem javascript.


 

Ex. Como compilar?

Considere a seguinte implementação do algoritmo designado de Trabb-Pardo-Knuth. Este algoritmo não tem nenhuma outra utilidade fora o de ser um algoritmo da classe "hello world!" que exemplifica muito comodamente e simplesmente algumas características da linguagem de programação usada.

Uma tradução literal deste algoritmo em Ocaml é:

Neste exemplo definimos a função por usar como sendo f=x|x|+5×x3, e o limite como sendo 400.

  1. Passe este programa para um ficheiro de nome tpk0.ml.

  2. Compile este ficheiro com o compilador ocamlopt da seguinte forma: ocamlopt tpk0.ml -o tpk0n.

  3. Compile este ficheiro com o compilador ocamlc da seguinte forma: ocamlc tpk0.ml -o tpk0b.

  4. Execute os dois programas (tpk0n e tpk0b) na linha de comando com base em 11 valores introduzidos no teclado. Por exemplo

    ou, se colocamos as entradas num ficheiro input.txt (desejável) :

     

  5. Experimente o programa dentro de um toplevel. Aconselhamos o uso de utop. Nota: depois do copy-paste do código, não se esqueça de juntar dois pontos-e-vírgulas ;; e carregar no enter.

  6. Uma versão mais no espírito da programação funcional é :

    Compile com os dois compiladores e execute as duas versões.


 

Ex. A diferença entre ocamlopt e ocamlc.

Considere o seguinte código OCaml:

  1. Copie este programa no ficheiro gen_floats.ml e compile com ocamlopt gen_floats.ml -o gen_floats.
  2. Este programa, quando invocado por ./gen_floats X Y gere X números flutuantes entre 0 e Y (excluído), na saída standard. Experimente a sua execução, por exemplo com os valores 11 e 800 : ./gen_floats 11 800.
  3. Considere o seguinte programa OCaml que junta o código acima descrito com o do exercício anterior.

Vamos executar o código do exercício anterior muitas vezes sobre dados gerados aleatoriamente e medir o tempo. Iremos assim mostrar na prática uma diferença de desempenho entre a versão compilada por ocamlc e ocamlopt.

  1. Como explica a diferença?

 

Ex. Bestiário de Erros de Compilação.

Voltemos ao exemplo original. Explique para cada uma das alíneas seguintes o(s) erro(s) que encontra.

Alguns deles são detetados na compilação outros na execução. Proponha uma correção.

  1.  

  2.  

  3.  

  4.  

  5.  

  6.  

     

Quer saber mais ? Veja Common Error Messages.


 

Ex. Compilação de programas que usam bibliotecas externas

O objetivo deste exercício é perceber como compilar programas que fazem uso de bibliotecas externas, isto é, de funcionalidades que não pertençam a biblioteca padrão. A página Compiling OCaml projects lista as diferentes formas de compilar um programa conforme as bibliotecas que pode vir a usar. Vamos aqui ilustrar este processo com um programa que usa a biblioteca gráfica Graphics.

Esta instala-se de forma habitual:

Recupere o ficheiro graph_example.ml no seguinte site (link).

  1. Compile este programa com a ajuda da ferramenta ocamlfind conforme a documentação indicada no início do exercício.
  2. Execute o programa e interaja com ele. Para sair da animação gráfica, basta pressionar uma tecla qualquer.

 

Ex. Perfilar um programa.

O objetivo deste exercício é conhecer como se obtém um perfil de um determinado programa. Vamos fazê-lo para o programa executado em modo bytecode, mas de forma muito semelhante se faz o perfil de um programa em modo nativo. Para mais opções sobre como perfilar um programa, ver a documentação do ocamlprof.

Consideremos novamente o programa de teste temporal do algoritmo TPK.

 

  1. Gravar este programa no ficheiro tpkp.ml. Compilar este programa com o compilador ocamlcp (p de "profile"), usando o comando ocamlcp -P a tpkp.ml -o tpkp.

  2. Executar o programa perfilado tpkp da forma usual. Por exemplo :

    Esta execução criou um ficheiro binário ocamlprof.dump com todas as informações de execução que precisamos agora de recuperar e processar. É o objeto da alínea seguinte.

  3. Usar o utilitário ocamlprof que analisa um ficheiro ml e junta a informação de perfil a partir do ficheiro ocamlprof.dump.

     

  4. Analise o ficheiro tpkp_perfilado.ml. Que parte do programa é o mais requisitado?


 

Ex. Geração de Documentação.

Execute o utilitário de geração de documentação disponível por omissão na distribuição OCaml, ocamldoc (documentação). Usos mais avançados poderão passar, com muito proveito, por ferramentas como odoc.

Explore os ficheiros gerados com recurso ao seu browser (tpkp.html, index.html, etc.).


 

Ex. Uma ferramenta para o advogado do diabo.

Vamos usar um dos muitos programas de testes existentes para programas OCaml : o utilitário de fuzz-testing afl para OCaml (documentação).

  1. Instale o afl para OCaml:

  2. Considere o seguinte programa :

    Grave este programa em fich.ml e compile este programa por forma a que seja instrumentado pela ferramenta afl :

     

  3. Prepare a execução de afl :

    Coloque o ficheiro testecase com o conteúdo

    na pasta input.

  4. Execute a ferramenta afl sobre o binário para a sua descoberta de inputs que causam quebra da execução :

    Tenha em atenção que a ferramenta afl vai gerar casos de teste a partir do exemplo dado (no ficheiro testcase). A procura poderá demorar tempo. Quando o contador uniq crashes apresentado na interface passar do 0, por exemplo uniq crashes : 1 , isso significará que a ferramenta encontrou um teste que provoca o fim abruto da execução. Neste caso aqui vários motivos para crashes são detetados, 4 pelo menos. Poderá aqui interromper a execução carregando em Ctrl-c.

    Após o término da sua execução, analise os ficheiro presentes na pasta output onde o afl colocou o resultado da sua análise. Em particular os ficheiros presentes na pasta crashes. Consegue perceber que falhas foram expostas?