Aho, Git implementado en Awk
(github.com/djanderson)- Aho es una implementación de Git en AWK, un proyecto de juguete para explorar la estructura interna de Git y las nuevas funciones de GNU AWK
- Su objetivo no es el uso real, sino el entretenimiento y la educación; no es un proyecto pensado como reemplazo de Git
- Para ejecutarlo se necesita
gawk5.0 o superior; actualmente usapigzpara la compresión zlib, y asume un entorno donde el resto lo provee GNU coreutils - Puede ejecutarse en la mayoría de los sistemas Linux, pero no encaja bien en entornos BSD/Mac
- Las funciones implementadas son
init,add/rm,status,commit,configde solo lectura ycat-file; no hay planes de agregar funciones de red comocloneypush
Propósito y alcance de Aho
- Aho es un proyecto cuyo objetivo es ser “Git implementado en AWK”
- Es un proyecto de juguete para demostrar que Modern AWK puede hacer mucho más que scripts de una sola línea
- Se centra en explorar la estructura interna de Git y las nuevas funciones de GNU AWK
- Es un proyecto pensado más para el entretenimiento y la educación que para usos prácticos
Entorno de ejecución
- El entorno necesario es el siguiente
gawk5.0 o superiorpigzpara compresión zlib- GNU coreutils
- Puede ejecutarse en la mayoría de los Linux, pero no es adecuado para entornos BSD o Mac
Flujo básico de uso
- Después de preparar el entorno con
source ./modpath, al ejecutaraho initse inicializa un repositorio Git vacío en el directorio.aho aho add -v .agrega archivos y muestra elementos como.gitignore,LICENSE,README.md,aho,aho.awkeinclude/*.awk- Si se crea un archivo nuevo y luego se vuelve a ejecutar
aho add -v ., ese archivo también se agrega - Bajo
.aho/se crea una estructura similar a la de GitbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- Se ofrece un ejemplo en el que las herramientas de Git leen las entradas del índice del repositorio
.ahoconGIT_DIR=.aho git ls-files --stage
Funciones implementadas y trabajo pendiente
- Funciones completadas
initadd/rmstatuscommitconfigde solo lecturacat-file
- Funciones aún no completadas
resetbranchswitchls-files
Se excluyen las funciones de red
- No hay planes de agregar funciones de red
- Aunque es posible implementar funciones de red con GNU AWK, no se planea incluir
clonenipushen Aho - Se aceptan contribuciones que ayuden a mejorar el conocimiento sobre AWK o Git
1 comentarios
Comentarios de Hacker News
Awk es genial. Es un lenguaje de programación completo que está prácticamente en todas partes en sistemas tipo Unix, pero en la práctica parece usarse sobre todo como comando de una sola línea para extraer fragmentos de texto de la salida estándar canalizada
Pero Awk también puede usarse como lenguaje de scripting de propósito general, y para ese uso es mejor que Bash en varios aspectos. Me pregunto por qué no vemos más seguido scripts de Awk en la naturaleza. Tal vez se deba a que Perl intentó combinar en un solo lenguaje las ventajas del shell, Awk y sed, y luego la gente terminó viendo mal a Perl y alejándose de esa línea
[1] Extracto aleatorio del código fuente de NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...
No significa que nadie lo lograra bien, pero la tasa de éxito en toda la industria fue baja, así que Perl terminó con una reputación bastante mala
Me gustaría ver un renacimiento de Awk. Como Awk es menos fácil de escalar demasiado, hay menos riesgo de que un proyecto que empezó como un pequeño script de Awk termine pasándose a la siguiente persona como una base de código de miles de líneas en Awk. En cambio, se reescribe relativamente temprano en un lenguaje más escalable y mantenible
Fue divertido y volveré a usar Perl. Ahora que veo que Awk también es así de genial, quizá algún día lo use
[1] https://github.com/csdvrx/hdisk/
Bastaron unas cuantas funciones, en total como 20 líneas de código, y algunos pipes con sort y uniq, y fue bastante rápido. Especialmente si le pones LC_ALL=C al inicio
[0]: si preguntas por qué no había observabilidad lo bastante buena como para no necesitar este trabajo, no estás equivocado, pero a veces hay que vivir con la realidad que te toca
[1]: sé que gawk puede hacer ordenamiento único mientras construye listas. Ya estaba cansado al final de la respuesta al incidente, y
| sort | uniq -c | sort -rnera mucho más fácil de recordar[1].a: también sé que sort tiene el argumento
-u. No da conteos, y el procesamiento único también es bastante más lento que la implementación de uniqComo la gente con gustos tipo HN consideró que Perl “no era cool”, ahora Perl y todo el código escrito en Perl tienen, por así decirlo, fecha de vencimiento. Pero Awk es un estándar POSIX, así que esa gente no puede hacerlo desaparecer
0,""y literalmente la nada son todos el mismo valor falsoLos números, como en Lua, no son distintos de las cadenas que representan números. Y de algún modo eso no me molesta. Si de verdad necesitas mantener los números como números y las cadenas como cadenas, puedes poner un marcador como
#o$al principio del valor y luego quitarlo más tarde consubstr()The AWK Programming Language, Second Edition salió en septiembre de 2023
https://awk.dev
La primera edición se publicó en 1988 y puede verse aquí: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
Discusión: https://news.ycombinator.com/item?id=13451454
Si ves código como el siguiente, en
function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header)los parámetros después del gran espacio en blanco son variables locales. Se les pueden pasar valores, pero no fue diseñado para usarse asíEscribí un parche para GNU Awk que agrega una sentencia
letque vincula variables léxicas reales, para que se pudiera escribir algo comofunction read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }Lamentablemente fue rechazado en el proyecto, y me sugirieron crear un fork de GNU Awk con otro nombre, así que eso hice
https://www.kylheku.com/cgit/egawk/about/
Si me preguntan por qué dicen que la línea de comandos de Linux es el mejor entorno de desarrollo, una de las herramientas que suelen señalar es Awk. Con solo conocer lo básico de Awk se puede hacer muchísimo con muy poco, y hasta los IDE empiezan a sentirse torpes
Si quieres aprender Awk y te funciona bien el aprendizaje tipo curso, hace unos años grabé en YouTube una charla que preparé para Linux Fest Northwest: https://youtu.be/E5aQxIdjT0M
Secuencias parecidas a
CTRL+Dpueden cortar la entrada, y seguro hay decenas de otros casos límite que no conozco y que me van a morder en el peor momentoAwk es una herramienta impresionante, pero cuando la ponen en un pedestal sus debilidades quedan ocultas. Para trabajo serio, puede ser mejor pasarse a una herramienta más especializada y moderna, adecuada para esa tarea
La mayor parte de lo que hace un IDE no es trabajo de edición de texto, sino ayudarte a entender y modificar el código. No intento decir que esté mal, solo me da curiosidad la perspectiva de ese comentario
Al principio pensé que este nombre venía de
aho, el argot japonés para “idiota” (アホ), pero luego recordé que Alfred Aho es laadeawk. ¿Quizá sean ambas?Es un gran proyecto y una buena idea. Entender los fundamentos te da otra perspectiva para ver otros proyectos y problemas
Hace tiempo hice una wiki web con Awk. La razón fue que estaba usando un router Linksys con muy poca memoria
Fue excelente para aprender tanto cómo funciona una wiki como lo que se puede hacer con Awk. Como no había librerías en las que apoyarme, tuve que implementar lo básico yo mismo, y gracias a eso terminé entendiéndolo de verdad
Dijeron: “No planeo agregar funciones de red aquí. Claro que se puede, pero no habrá clone ni push”, pero también se puede hacer git clone y push con repositorios que están en otros directorios de la misma computadora
Me sigue rondando la idea de que, con unas cuantas utilidades y programas GNU, y quizá no mucho más, podríamos construir una herramienta todopoderosa de base de datos y procesamiento que supere a herramientas profesionales tanto en rendimiento como en funcionalidad. ¿Soy el único que siente eso?
Puede estar relacionado
sed-chess: https://news.ycombinator.com/item?id=37896854
awk-raycaster: https://github.com/TheMozg/awk-raycaster
https://github.com/soimort/translate-shell
Si hubieran usado cppawk, que no existía cuando esto se desarrolló, habrían podido usar
#include. Funciona bien con rutas relativas al archivo y no requiereAWKPATHTambién puedes “compilar” el programa preprocesado en un solo archivo, así que después ya no hace falta cppawk
https://www.kylheku.com/cgit/cppawk/about/