2 pontos por GN⁺ 2024-02-12 | 1 comentários | Compartilhar no WhatsApp
  • Aho é um Git implementado em AWK, um projeto de brinquedo para explorar a estrutura interna do Git e novos recursos do GNU AWK
  • O objetivo não é uso real, mas diversão e educação; não é um projeto destinado a servir como ferramenta substituta do Git
  • Para executar, é necessário gawk 5.0 ou superior; atualmente usa pigz para compressão zlib e pressupõe um ambiente em que o restante é fornecido pelo GNU coreutils
  • Deve rodar na maioria dos Linux, mas não é muito adequado para ambientes BSD/Mac
  • As funcionalidades implementadas são init, add/rm, status, commit, config somente leitura e cat-file; não há planos de adicionar recursos de rede como clone e push

Objetivo e escopo do Aho

  • Aho é um projeto que tem como objetivo ser um “Git implementado em AWK”
  • É um projeto de brinquedo para mostrar que o AWK moderno pode fazer mais do que scripts de uma linha
  • O foco está em explorar a estrutura interna do Git e novos recursos do GNU AWK
  • É um projeto voltado mais a diversão e educação do que a usos práticos

Ambiente de execução

  • O ambiente de execução necessário é o seguinte
    • gawk 5.0 ou superior
    • pigz para compressão zlib
    • GNU coreutils
  • Pode ser executado na maioria dos Linux, mas não é adequado para ambientes BSD ou Mac

Fluxo básico de uso

  • Depois de preparar o ambiente com source ./modpath, executar aho init inicializa um repositório Git vazio no diretório .aho
  • aho add -v . adiciona arquivos e exibe itens como .gitignore, LICENSE, README.md, aho, aho.awk e include/*.awk
  • Depois de criar um novo arquivo, executar novamente aho add -v . também adiciona esse arquivo
  • Sob .aho/, é criada uma estrutura semelhante à do Git
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • É fornecido um exemplo em que ferramentas do Git leem os itens do índice do repositório .aho com GIT_DIR=.aho git ls-files --stage

Funcionalidades implementadas e trabalhos restantes

  • Funcionalidades concluídas
    • init
    • add/rm
    • status
    • commit
    • config somente leitura
    • cat-file
  • Funcionalidades ainda não concluídas
    • reset
    • branch
    • switch
    • ls-files

Recursos de rede ficam de fora

  • Não há planos de adicionar recursos de rede
  • Embora seja possível implementar recursos de rede com GNU AWK, não há planos de incluir clone ou push no Aho
  • Contribuições são bem-vindas na forma de comentários que ajudem a melhorar o conhecimento sobre AWK ou Git

1 comentários

 
GN⁺ 2024-02-12
Opiniões no Hacker News
  • Awk é incrível. Em sistemas do tipo Unix, é uma linguagem de programação completa presente em quase qualquer lugar, mas na prática parece ser usada principalmente como comandos de uma linha para extrair pedaços de texto da saída padrão encadeada por pipes.
    Mas Awk também pode ser usada como linguagem de scripting de uso geral e, nesse papel, é melhor que Bash em vários aspectos. Fico me perguntando por que não vemos scripts em Awk com mais frequência por aí. Talvez seja por causa do Perl, que tentou juntar os pontos fortes do shell, do Awk e do sed em uma só linguagem, e do movimento posterior em que as pessoas passaram a ver Perl com maus olhos e o abandonaram.
    [1] Trecho aleatório do código-fonte do NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...

    • É verdade. Perl substituiu Awk, mas em muitos casos isso foi um tiro pela culatra. Não havia uma forma simples e amplamente compreendida de escrever código Perl que fosse fácil para outro programador ler e que escalasse até programas médios e grandes.
      Não estou dizendo que ninguém tenha conseguido fazer isso bem, mas a taxa de sucesso no setor como um todo foi baixa, e Perl acabou ganhando uma reputação bem ruim.
      Eu gostaria de ver um renascimento do Awk. Como Awk é menos fácil de expandir muito, há menos risco de um projeto que começou como um pequeno Awk acabar sendo passado para a próxima pessoa como uma base de código Awk de milhares de linhas. Em vez disso, ele tende a ser reescrito relativamente cedo em uma linguagem mais escalável e mais fácil de manter.
    • Não importa o que as pessoas pensem; descobri que gosto de Perl. O que fiz recentemente foi um editor de partições programável. Era parecido com limpar partições usando sfdisk, mas eu queria fazer mais do que simplesmente excluir, e queria combinar tabelas de partição MBR e GPT para criar um híbrido.
      Foi divertido e vou usar Perl de novo. Agora que vi que Awk também é tão legal assim, talvez eu o use algum dia.
      [1] https://github.com/csdvrx/hdisk/
    • Awk é incrivelmente útil. Esta semana escrevi um script para analisar muitos GB de logs do Postgres e responder: “quem foi o usuário que mais disparou consultas nos minutos logo depois de cada hora cheia?”
      Bastaram algumas funções, pouco mais de 20 linhas de código no total e alguns pipes com sort e uniq, e ficou bem rápido. Especialmente colocando LC_ALL=C na frente.
      [0]: Se você perguntar por que não havia observabilidade adequada o bastante para tornar esse tipo de trabalho desnecessário, não está errado, mas às vezes é preciso viver com a realidade dada.
      [1]: Sei que o gawk consegue fazer uma ordenação única enquanto constrói a lista. Eu estava cansado no fim de uma resposta a incidente, e | sort | uniq -c | sort -rn era muito mais fácil de lembrar.
      [1].a: Também sei que sort tem o argumento -u. Ele não fornece contagens, e sua deduplicação também é bem mais lenta do que a implementação do uniq.
    • O julgamento de que Perl é ruim é uma grande força por trás do renascimento do Awk. Desenvolvedores que nunca aprenderam Perl desde o começo querem algo para preencher a lacuna entre shell e Python, e também há desenvolvedores como eu que abandonaram Perl com relutância.
      Como o pessoal com gosto de HN passou a considerar Perl “não cool”, Perl e todo código escrito em Perl agora ganharam uma espécie de prazo de validade. Mas Awk é um padrão POSIX, então essas pessoas não conseguem fazê-lo desaparecer.
    • Gosto de AWK. Sua tipagem centrada em strings é de fazer até programador Javascript corar. 0, "" e a ausência real de qualquer coisa são todos o mesmo valor falso.
      Números não são diferentes de strings que representam números, como em Lua. Mas, curiosamente, isso não me incomoda. Se você realmente precisa manter números como números e strings como strings, basta prefixar os valores com algum marcador como # ou $ e depois removê-lo com substr().
  • The AWK Programming Language, Second Edition saiu em setembro de 2023.
    https://awk.dev
    A primeira edição foi publicada em 1988 e pode ser vista aqui: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
    Discussão: https://news.ycombinator.com/item?id=13451454

    • Esse intervalo de 35 anos é uma boa história para contar quando o editor perguntar: “E então, como anda a segunda edição?”
    • Brian Kernighan também está junto. Ele é o “K” de K&R C e protagonista de muitas outras lendas do Unix.
  • Ao ver um código como function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header), os parâmetros depois do grande espaço são variáveis locais. É possível passar valores para eles, mas não foi para isso que foram criados.
    Escrevi um patch para o GNU Awk que adicionava uma instrução let para vincular variáveis léxicas de verdade, permitindo algo como function read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }.
    Infelizmente o projeto recusou, e fui aconselhado a criar um fork do GNU Awk com outro nome; foi o que fiz.
    https://www.kylheku.com/cgit/egawk/about/

    • Acho que a decisão deles faz sentido. O gawk já tem diferenças demais em relação ao awk. Se for adicionar uma sintaxe ainda mais distinta, é melhor simplesmente fazer um fork e dar outro nome.
  • Quando perguntam por que eu digo que a linha de comando do Linux é o melhor ambiente de desenvolvimento, uma das ferramentas que costumo apontar é o Awk. Só de conhecer o básico de Awk, dá para fazer muito com pouco, e uma IDE começa até a parecer lenta
    Se você quer aprender Awk e se dá bem com aprendizado em formato de aula, gravei no YouTube uma apresentação que fiz alguns anos atrás para o Linux Fest Northwest: https://youtu.be/E5aQxIdjT0M

    • Ao mesmo tempo, o suporte a Unicode foi adicionado muito tarde, talvez só uns 2 anos atrás. Como outras ferramentas de shell, também há casos de borda ao passar conteúdo para o Awk por pipe
      Sequências parecidas com CTRL+D podem encerrar a entrada, e deve haver dezenas de outros casos de borda que eu nem conheço e que vão morder no pior momento possível
      Awk é uma ferramenta impressionante, mas colocá-la num pedestal esconde suas fraquezas. Para trabalhos sérios, talvez seja melhor migrar para ferramentas mais especializadas, modernas e adequadas à tarefa
    • Como o Awk substitui uma IDE? Gosto de Awk e sei que ele é poderoso se você dedicar tempo para aprender, mas sem uma IDE minha produtividade teria caído bastante
      A maior parte do que uma IDE faz não é edição de texto, mas ajudar a entender e alterar código. Não estou dizendo que você está errado; só estou curioso sobre a perspectiva dessa afirmação
  • No começo achei que esse nome vinha de aho (アホ), gíria japonesa para “idiota”, mas então lembrei que Alfred Aho é o a de awk. Talvez sejam as duas coisas?

    • Acho que são as duas. “Git” também já era uma gíria para “pessoa idiota”, então é um nome espirituoso
    • Ouvi isso recentemente em Reservation Dogs: https://en.wiktionary.org/wiki/aho#Navajo
    • Acho que são as duas. É um trocadilho realmente inteligente
  • É um ótimo projeto e uma boa ideia. Entender os fundamentos dá outra perspectiva para olhar outros projetos e problemas
    Antigamente, cheguei a criar uma wiki baseada na web em Awk. O motivo era que eu usava um roteador Linksys com pouquíssima memória
    Foi ótimo para aprender tanto como uma wiki funciona quanto o que dá para fazer com Awk. Como não havia bibliotecas das quais depender, precisei implementar os fundamentos por conta própria, e isso me fez entendê-los de verdade

  • Foi dito que “não há planos de adicionar funcionalidades de rede aqui. Claro que é possível, mas não haverá clone nem push”, mas dá para fazer git clone e também push em repositórios que ficam em outros diretórios no mesmo computador

    • Sim. Mas, com branches, a necessidade de criar clones locais diminui um pouco. Na prática, estou usando rsync para duplicar repositórios git locais. A questão é o que é melhor
    • É tão óbvio, mas em 10 anos usando git eu nunca pensei em tentar
  • Fico com a ideia de que talvez seja possível criar uma ferramenta onipotente de banco de dados e processamento que supere ferramentas especializadas em desempenho e funcionalidade usando apenas utilitários e alguns programas GNU, e talvez nem muito mais que isso. Só eu sinto isso?

  • Pode ter relação
    sed-chess: https://news.ycombinator.com/item?id=37896854
    awk-raycaster: https://github.com/TheMozg/awk-raycaster

  • Se isso tivesse usado cppawk, que não existia na época do desenvolvimento, poderia ter usado #include. Ele funciona bem com caminhos relativos ao arquivo e não precisa de AWKPATH
    Também dá para “compilar” o programa pré-processado em um único arquivo, de modo que depois o cppawk não seja mais necessário
    https://www.kylheku.com/cgit/cppawk/about/