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:
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:
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.
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:
- um frontend traduz o programa fonte em uma estrutura de grafos; aqui estão o lexer e o parser;
- essa estrutura é compilada para um grafo de combinadores básicos (SKI);
- o grafo de combinadores é otimizado para usar os combinadores de Turner;
- o grafo é avaliado (reduzido), efetivamente executando o programa fonte;
- 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
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