Uma linguagem de configuração razoável

Os arquivos de configuração estão evoluindo cada vez mais de formatos simples como JSON ou YAML para linguagens completas, às vezes Turing-completas, levantando dúvidas sobre onde traçar a linha entre “config” e “código.” Os comentaristas ponderam os trade-offs entre linguagens de configuração especializadas (como HCL, Dhall, Jsonnet, Nix, abordagens baseadas em Lua ou a recentemente proposta RCL) e o reaproveitamento de linguagens de propósito geral, com foco em segurança, legibilidade, ferramentas e interoperabilidade entre linguagens. Muitos defendem linguagens declarativas, side-effect-free e restritas, mas ainda capazes de expressar reutilização e lógica, enquanto outros veem a proliferação de soluções próprias como evidência de que a configuração para sistemas complexos continua sendo um problema não resolvido — e operacionalmente crítico.

Complexidade crescente da configuração

  • Muitos sistemas começam com formatos simples (INI/JSON/YAML) e depois gradualmente adicionam overlays, templating, expressões e, por fim, computação completa.
  • Esse “buraco do coelho” é visto como quase inevitável para ferramentas de provisionamento e infraestrutura; cada ecossistema reinventa motores semelhantes de fluxo de trabalho/configuração.
  • Alguns argumentam que a maior parte do software na verdade para em parâmetros hierárquicos; apenas sistemas de infraestrutura/fluxo de trabalho afundam tão fundo na complexidade de configuração.

Por que uma linguagem especial de configuração?

  • Céticos perguntam por que não usar simplesmente linguagens de programação existentes junto com formatos de dados.
  • Os defensores respondem que config tem necessidades distintas: poder restrito, curva de aprendizado mais fácil, interoperabilidade agnóstica em relação à linguagem e processamento mais seguro (por exemplo, análise estática de configs sem executar código arbitrário).
  • Também há um aspecto social: muitos usuários de infra não querem se tornar programadores de verdade, mas ainda precisam de alguma abstração e reutilização.

Completude de Turing, segurança e avaliação

  • Vários comentários rebatem a configuração totalmente Turing-completa, preferindo linguagens totais ou primitivamente recursivas, possivelmente com limites de “gas” nos passos de avaliação.
  • Outros observam que mesmo sistemas não Turing-completos podem travar ou ser complexos; os problemas reais são simplicidade, garantias de término e limitação da avaliação.

Comparações e alternativas

  • Jsonnet, Kapitan, CUE, Dhall, Nix, Nickel, Starlark, HCL, Lua, templating em YAML, TypeScript como DSL e até WASM são discutidos como opções de configuração ou geração de configuração.
  • JSON/YAML com templating é amplamente visto como um compromisso ruim, mas popular, indicando necessidades não atendidas.
  • Lua recebe elogios como uma linguagem de configuração minúscula, embutível e com sandbox, “quase perfeita”.

Sintaxe e ergonomia

  • Debates sobre vírgulas e vírgulas finais: alguns querem que sejam opcionais, com quebras de linha como separadores; outros valorizam a redundância para detecção de erros e listas em linha.
  • Alegações de que novas linguagens são “supersets de JSON” são contestadas em casos-limite (por exemplo, pares substitutos), sugerindo que modos explícitos de JSON são mais seguros.

Configuração vs infraestrutura e fluxos de trabalho

  • Alguns argumentam que o problema real não é “config” simples, mas sim a descrição de infraestrutura e a orquestração de fluxos de trabalho sendo forçadas a caber em linguagens de configuração.
  • As visões divergem sobre DRY versus verbosidade: alguns preferem copy-paste em configs de infra por clareza; outros querem abstrações para expressar “o mesmo com variação” e evitar desvio lógico.

Configuração como um problema real

  • Apesar do cansaço com “mais uma linguagem de configuração”, vários comentários enfatizam que má configuração é uma grande fonte prática de indisponibilidade e complexidade, então a experimentação nessa área é vista como justificada.