Realidades Paralelas

Wednesday, June 15, 2005

Comparação, round 2

Para tirar um pouco da poeira aqui, vão os números finais da comparação informal C versus OCaml.

Recaptulando: eu precisei alterar os algoritmos de gerenciamento de memória de um interpretador de uma linguagem funcional simples. A estrutura do programa é a seguinte:

  1. um frontend traduz o programa fonte em uma estrutura de grafos; aqui estão o lexer e o parser;
  2. essa estrutura é compilada para um grafo de combinadores básicos (SKI);
  3. o grafo de combinadores é otimizado para usar os combinadores de Turner;
  4. o grafo é avaliado (reduzido), efetivamente executando o programa fonte;
  5. o runtime consiste de algumas funções pré-definidas e um coletor de lixo modular, que deve usar diferentes estratégias (mark-scan, coletor de cópia ou contagem de referências)

O interpretador original tinha sido escrito em C. Não muito bem, diga-se de passagem. Quando eu tentei alterar o que eu queria, core dumps e ponteiros nulos pularam de todos os recantos escuros para me atingir. Em pouco tempo descobri o modo atroz que o programa tratava os ponteiros, e decidi que demoraria muito consertar. O melhor seria fazer de novo. Então decidi fazer em OCaml, depois de ver que Haskell não seria legal (vide posts anteriores).

Há umas semanas isso ficou pronto. Funcionando melhor que a versão C, e feito em aproximadamente um mês de trabalho. Os resultados final da contagem de linhas:

  • C - 11486 linhas de código
  • OCaml - 1964 linhas de código
Ou seja, o programa em C é uma ordem de magnitude maior. Bem, a comparação não é completamente justa por um motivo: o programa C inclui lexer e parser, enquanto que o similar OCaml trata diretamente com uma sintaxe abstrata; faltaria implementar um frontend que traduzisse da sintaxe concreta para a abstrata. Para deixar a história um pouco mais justa: a parte do frontend no programa em C usa umas 2 mil linhas; mesmo que fosse retirada, ainda seria uma economia de quase 5 vezes. Mas recentemente eu implementei um frontend simples em SML; acredito que para a linguagem em questão, e usando OCaml, não seria muito diferente: lexer + parser em 200 linhas de código, apenas.

Características principais em OCaml que ajudaram a fazer tanta diferença: pattern-matching em estruturas de dados, funções de ordem superior e tipos de dados algébricos.

0 Comments:

Post a Comment

<< Home