Fusca amarelo com uma grande pintura de dragão no evento Bèrghem Bug, ocorrido em 2020 na comuna de San Pellegrino Terme, na Itália. Foto por Raffaele Mottalini, via Dreamstime. |
O herbiec é um interpretador do tipo tree-walking feito especificamente para a
Rinha de Compiladores
desse ano, organizada pelas srtas. Sofia Rodrigues e Gabrielle Guimarães.
Por mais que o programa (ou script, chame-o como preferir) não tenha muito
propósito fora do desafio enquanto interpretador propriamente dito, alguns usos de
funções da linguagem aqui se mostraram interessantes para replicar posteriormente como,
por exemplo, uma função para conversão de JSON para uma estrutura de variável
composta ---
que precisaria ser melhorada para conseguir lidar com JSONs compactados,
eliminando o a necessidade do jq
(1) como
formatador --- e métodos para poder receber elementos de variáveis compostas como
entrada de função ---
o que talvez já existisse de outra forma "oficialmente" e eu desconheça ---,
algo que é pouco explorado na linguagem mesmo estando ali desde a criação do padrão.
Creio que servirá bem para questão de aprendizado.
Como de costume, normalmente coloco nomes de locais ou referências culturais nos
programas que crio, normal entre todo programador, engenheiro, cientista, artista
ou alquimista.
"Herbie" em si vem de dois lugares: "Herbie, The Love Bug" (vulgo "Se meu Fusca
falasse"), aquela série de filmes da Disney que creio todos já terem pelo menos
ouvido falar, e do músico instrumentista Herbie Mann, que gravou o álbum
"Memphis Underground" em 1969, ao qual eu estava ouvindo no momento em que testei
o programa pela primeira vez e obtive êxito --- mais especificamente, estava
ouvindo a faixa 3 dele --- e
que é o meu álbum favorito de crossover jazz.
Graças à minha brilhante ideia de fazer um interpretador em KornShell 93 --- mesmo que a linguagem tenha se mostrado mais-do-que capaz de fazer ---, acabei por descobrir alguns bugs no processo, tanto na hora de programar quanto na hora de testar.
- No dia 22 de Setembro de 2023, enquanto testava o algoritmo da soma de Gauss,
descobri um bug que causa um "Memory fault" (lit. "Falha de memória") quando
tenta se somar até 1 milhão, o que foi reportado à equipe de desenvolvimento
do KornShell 93 na issue #686.
Atualização: O @phidebian me respondeu nessa issue mostrando que o erro se dá não pelo tamanho do tipointeger
no KornShell, que é de umdouble
--- ou seja, 9.223.372.036.854.775.807, nove quintilhões, duzentos e vinte e três quatrilhões, trezentos e setenta e dois trilhões, trinta e seis bilhões, oitocentos e cinquenta e quatro milhões, setecentos e setenta e cinco mil, oitocentos e sete, um número ridiculamente grande que faz a soma Gaussiana de 1.000.000 parecer um número ínfimo ---, mas sim pelo tamanho da pilha de recursão de função de KornShell ser de 1024, fazendo recursão inviável nesse caso. - O KornShell 93, na versão 1.0.0-beta.2, lançada em 17 de Dezembro de 2021, não
suporta variáveis com identificadores UTF-8, como, por exemplo,
float φ=$(( (1 + sqrt(5)) / 2 ))
--- entretanto, isso funciona perfeitamente nas versões mais recentes, então não reportei.
Pelo visto, o programa ficou com a pontuação zerada graças a uma limitação do jq
que faz com que ele não formate ou nem sequer imprima JSONs com "profundidade" ---
no caso, elementos dentro de outros elementos principais, como uma árvore --- maior
do que 1.024, ou seja,
Dona Culpa ficou solteira,
ao menos comigo não se casou. 🤣
Entretanto, se o JSON for formatado previamente (seja gerando-o com rinha -p
ou usando outro programa, como o jj
(1)), o
herbiec aparentemente roda os testes tranquilamente sem demais problemas ---
tirando o fato da implementação de tuplas não estar tão completa e nem
"intocável", "bulletproof", além do programa não imprimir os resultados em ordem
de execução, mas tudo apenas no final, entretanto aí já é, de fato, um affair meu
com a Dona Culpa.
Rodeios culturais dignos de um ouvinte de noticiário em rádio à parte, valeu muito a
experiência, mesmo não tendo entrado para o topo da classificação ou nem ao menos
pontuado, além de ter deixado um bom exemplo do que KornShell/93 realmente é capaz.