Aho, Git implementado em Awk
(github.com/djanderson)- 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
gawk5.0 ou superior; atualmente usapigzpara 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,configsomente leitura ecat-file; não há planos de adicionar recursos de rede comocloneepush
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
gawk5.0 ou superiorpigzpara 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, executaraho initinicializa um repositório Git vazio no diretório.aho aho add -v .adiciona arquivos e exibe itens como.gitignore,LICENSE,README.md,aho,aho.awkeinclude/*.awk- Depois de criar um novo arquivo, executar novamente
aho add -v .também adiciona esse arquivo - Sob
.aho/, é criada uma estrutura semelhante à do GitbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- É fornecido um exemplo em que ferramentas do Git leem os itens do índice do repositório
.ahocomGIT_DIR=.aho git ls-files --stage
Funcionalidades implementadas e trabalhos restantes
- Funcionalidades concluídas
initadd/rmstatuscommitconfigsomente leituracat-file
- Funcionalidades ainda não concluídas
resetbranchswitchls-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
cloneoupushno 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
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...
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.
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/
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 -rnera 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.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.
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 comsubstr().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
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
letpara vincular variáveis léxicas de verdade, permitindo algo comofunction 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/
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
Sequências parecidas com
CTRL+Dpodem 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ívelAwk é 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
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
adeawk. Talvez sejam as duas coisas?É 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
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
https://github.com/soimort/translate-shell
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 deAWKPATHTambé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/