2 puntos por GN⁺ 2024-02-12 | 1 comentarios | Compartir por WhatsApp
  • 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 gawk 5.0 o superior; actualmente usa pigz para 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, config de solo lectura y cat-file; no hay planes de agregar funciones de red como clone y push

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
    • gawk 5.0 o superior
    • pigz para 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 ejecutar aho init se 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.awk e include/*.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 Git
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • Se ofrece un ejemplo en el que las herramientas de Git leen las entradas del índice del repositorio .aho con GIT_DIR=.aho git ls-files --stage

Funciones implementadas y trabajo pendiente

  • Funciones completadas
    • init
    • add/rm
    • status
    • commit
    • config de solo lectura
    • cat-file
  • Funciones aún no completadas
    • reset
    • branch
    • switch
    • ls-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 clone ni push en Aho
  • Se aceptan contribuciones que ayuden a mejorar el conocimiento sobre AWK o Git

1 comentarios

 
GN⁺ 2024-02-12
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...

    • Es cierto. Perl reemplazó a Awk, pero en muchos casos fue contraproducente. No había una forma simple y ampliamente entendida de escribir código Perl que fuera fácil de leer para otros programadores y que además escalara hasta programas medianos o grandes
      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
    • No me importa lo que piense la gente, descubrí que me gusta Perl. Lo más reciente que hice fue un editor de particiones programable. Es parecido a vaciar particiones con sfdisk, pero quería hacer más que una simple eliminación y quería combinar tablas de particiones MBR y GPT para crear un híbrido
      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/
    • Awk es increíblemente útil. Esta semana escribí un script para parsear muchos GB de logs de Postgres y responder: “¿qué usuario lanzó más consultas durante los minutos posteriores a cada cambio de hora?”
      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 -rn era 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 uniq
    • La percepción de que Perl es malo es una gran fuerza impulsora del renacimiento de Awk. Los desarrolladores que nunca aprendieron Perl desde el inicio quieren algo que llene el hueco entre shell y Python, y también están quienes, como yo, dejaron Perl a regañadientes
      Como 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
    • Me gusta AWK. Su tipado centrado en cadenas haría sonrojar incluso a un programador de Javascript. 0, "" y literalmente la nada son todos el mismo valor falso
      Los 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 con substr()
  • 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

    • Este intervalo de 35 años es una buena historia para contar cuando el editor pregunte “entonces, ¿cómo va la segunda edición?”
    • Brian Kernighan también participa. Es la “K” de K&R C y protagonista de muchas más leyendas de Unix
  • 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 let que vincula variables léxicas reales, para que se pudiera escribir algo como function 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/

    • Creo que esa decisión también tiene sentido. gawk ya tiene demasiadas diferencias con awk. Si se le agregara una sintaxis aún más distintiva, sería mejor simplemente hacer un fork y ponerle otro nombre
  • 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

    • Al mismo tiempo, el soporte de Unicode llegó muy tarde, probablemente apenas hace unos 2 años. También hay casos límite al pasar contenido a Awk por pipe, como con otras herramientas de shell
      Secuencias parecidas a CTRL+D pueden cortar la entrada, y seguro hay decenas de otros casos límite que no conozco y que me van a morder en el peor momento
      Awk 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
    • ¿Cómo reemplaza Awk a un IDE? Me gusta Awk y también sé que es potente si le inviertes tiempo para aprenderlo, pero sin IDE mi productividad habría caído muchísimo
      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 la a de awk. ¿Quizá sean ambas?

    • Parece que ambas. “Git” también ya era una forma coloquial de decir “persona tonta”, así que es un nombre ingenioso
    • Lo escuché recientemente en Reservation Dogs: https://en.wiktionary.org/wiki/aho#Navajo
    • Parece que ambas. Es un juego de palabras realmente inteligente
  • 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

    • Sí. Pero si tienes ramas, la necesidad de hacer clones locales se reduce hasta cierto punto. En la práctica estoy usando rsync para replicar repositorios git locales. La cuestión es qué es lo mejor
    • Es tan obvio que, aun usando git desde hace 10 años, nunca se me ocurrió intentar hacerlo
  • 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

  • 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 requiere AWKPATH
    Tambié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/