1 puntos por GN⁺ 2024-07-19 | 1 comentarios | Compartir por WhatsApp
  • Breve entrevista con el Dr. Brian Kernighan, creador de AWK

    • Presentación del Dr. Brian Kernighan

      • El Dr. Brian Kernighan es un científico de la computación canadiense que contribuyó al desarrollo de UNIX en Bell Labs
      • Coescribió junto con Dennis Ritchie el libro fundamental sobre el lenguaje de programación C, "The C Programming Language"
      • Desde el año 2000, forma a la siguiente generación de programadores en Princeton University
      • Es famoso por haber escrito el primer programa "Hello World!"
    • La nueva idea de AWK

      • La idea principal de AWK son los arreglos asociativos (associative arrays)
      • En ese momento era un concepto nuevo, pero hoy se usa en la mayoría de los lenguajes como función de biblioteca (hashmaps en Java o C++) o como parte del propio lenguaje (dictionaries en Perl y Python)
      • Los arreglos asociativos son una estructura muy poderosa y pueden usarse para simular diversas estructuras de datos
      • El paradigma patrón-acción tampoco era ampliamente usado en ese entonces, pero es una forma efectiva de organizar ciertos cálculos
    • Referencias utilizadas al crear un lenguaje de programación

      • Dr. Kernighan: "Ninguna"
      • En los años 70 había muchos lenguajes nuevos de propósito específico y casi no existían antecedentes de referencia
      • Yacc fue una herramienta importante que permitía crear y experimentar fácilmente con gramáticas
      • Lex cumplía el mismo papel a nivel léxico, reemplazando mucho código tedioso por un conjunto de reglas
      • Lex y Yacc son ejemplos de lenguajes patrón-acción y formaban un círculo virtuoso entre sí
    • Consejos para jóvenes interesados en el diseño de lenguajes de programación

      • Aconseja diseñar e implementar un lenguaje pequeño de propósito específico
      • Es muy divertido y útil, y mucho más fácil que crear un lenguaje alternativo a Rust o C++
      • Recomienda encontrar una tarea que pueda automatizarse y crear un compilador y un runtime simples
      • Un artículo relacionado que Jon Bentley escribió hace mucho tiempo sigue siendo vigente
    • Fuente de la imagen

      • Wikimedia Commons

Resumen de GN⁺

  • El Dr. Brian Kernighan es una figura clave que contribuyó al desarrollo de UNIX y del lenguaje C, y es el creador del lenguaje AWK, que introdujo los arreglos asociativos y el paradigma patrón-acción
  • Los arreglos asociativos son una poderosa estructura de datos que hoy se usa en la mayoría de los lenguajes de programación
  • Para los programadores jóvenes, resulta útil diseñar e implementar lenguajes pequeños de propósito específico
  • Yacc y Lex son herramientas que facilitan el análisis gramatical y léxico, y son buenos ejemplos de lenguajes patrón-acción

1 comentarios

 
GN⁺ 2024-07-19
Opiniones en Hacker News
  • Datos varios poco conocidos sobre Brian Kernighan: se incorporó al departamento de CS de Princeton en 2000, pero hacia 1993, cuando estaba en Bell Labs Research, ya había dado al menos una clase en Princeton.
    Un estudiante solía llevar una laptop 386sx con Linux pre-1.0, y cuando Brian no recordaba algún detalle del comportamiento de awk, ese estudiante ejecutaba comandos de awk y le mostraba la “implementación correcta”. Así que Brian tuvo contacto con Linux relativamente temprano.
    También hay un texto de 1994 en el que publicó en Internet el directorio de números gratuitos de AT&T: https://www.cs.princeton.edu/~bwk/800.html

    • No me queda claro si gawk es la implementación de referencia de awk, o si en realidad el que era muy distinto era gsed.
    • Huele a que “ese estudiante” era el propio autor del comentario.
  • Si te interesa, la entrevista de hora y media que Lex Fridman le hizo a BK está bastante buena: https://www.youtube.com/watch?v=O9upVbGSBFo

    • En el canal de YouTube Computerphile también hay muchas entrevistas a BK: https://www.youtube.com/results?search_query=computerphile+kernighan
      A veces se siente como un privilegio enorme vivir en esta época. Es parecido a que un matemático pudiera entrevistar a Euler, o un físico a Newton.
    • Antes había visto partes de algunas de sus charlas y no me habían parecido gran cosa, pero esta entrevista, desde el inicio de la conversación real después del anuncio, se ve bastante buena.
  • En el libro Masterminds of Programming hay una entrevista más completa que incluye también a Aho y Weinberger. Lo recomiendo mucho.

  • Esta semana estoy leyendo The Unix Programming Environment, de 1983; digamos que llegué unos 35 años tarde. En el libro, awk realmente se destaca y parece ser lo más cercano a lenguajes hoy populares como JavaScript, Lua, Python, Perl o Tcl.
    A lo que awk llama “arreglos asociativos”, JavaScript simplemente lo llama “objetos”. Es sorprendente que el código fuente de awk en Unix 7th Edition de 1979, según https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk, tenga apenas 2680 líneas, y que el ejecutable fuera de 46 KB y corriera en el espacio de direcciones de 64 KB del PDP-11. Al parecer, ni esa versión ni el awk que aparece en el libro cuatro años después tenían funciones definidas por el usuario, y creo que el V7 Bourne shell tampoco. Pero bc sí las tenía.

    • El awk sin funciones definidas por el usuario se conoce como old awk, o también por el nombre inverso oawk. En Heirloom todavía queda una implementación que parece ser descendiente de ese awk, junto con el más familiar nawk: https://heirloom.sourceforge.net/man/awk.1.html
      El ejecutable de 46 KB también era un poco más grande que Turbo Pascal 3.02: https://prog21.dadgum.com/116.html Claro que Turbo Pascal no tenía motor de expresiones regulares.
    • awk va más allá de eso. Si miras elementos como la palabra clave function, for e in a, la sintaxis sin punto y coma, el manejo de tipos centrado en cadenas y delete x[e], queda bastante claro que awk fue una base de JavaScript, y Brendan Eich también lo dijo: https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • Leí el mismo libro y llegué exactamente a la misma conclusión. Después leí The UNIX-Haters Handbook y sentí que, lamentablemente, herramientas de Unix como awk ya no son lo suficientemente buenas.
    • Escribir cosas como 01983 o 01979 no es una forma de escribir años y, de hecho, también es raro como forma de escribir números.
    • El 0 delante del año me confundió bastante. Pensé que era algún formato de fecha críptico.
  • Recuerdo que hace mucho alguien escribió en su .sig de Usenet: “Perl es margarina, awk es mantequilla”. Tal vez el orden era al revés.
    Perl tiene muchos defectos, pero después de descubrir Perl empecé a usar awk mucho menos.

  • Tengo un ejemplar de K&R firmado por el Dr. Kernighan en una conferencia de Unix en Australia en los años 80. Es una de mis posesiones más preciadas.
    Ese libro, junto con The Practice of Programming de Kernighan/Pike y cosas como la revista Byte, fueron mi “Stack Overflow” de los años 80.

  • Me parece interesante que hable de los arreglos asociativos como algo “relativamente nuevo”, porque en Lisp existían desde hacía casi 20 años.

    • Antes de Internet, aunque fueras hábil y supieras mucho en un área, era fácil no estar expuesto en absoluto a cosas que en otra comunidad se daban por básicas, o que tardaban décadas en difundirse lentamente.
      Incluso cuando empecé a programar en los años 90, buena parte del mundo de C veía las estructuras de datos asociativas, como las tablas hash, como algo un tanto exótico, que solo se sacaba cuando no quedaba más remedio. Pensamos que el mundo de la programación avanza rápido, pero en realidad no es así, y en especial en aquella época era aún más lento. A menudo, una característica que aparecía en algún lenguaje de los años 60 o 70 tardaba décadas en adoptarse ampliamente. Además, el rendimiento de Lisp en ese entonces era bastante malo frente a otras opciones, así que quizá no era un buen caso para promocionar sus propias características.
    • El PDF gratuito de la primera edición de The AWK Programming Language dice que los arreglos asociativos se inspiraron en las tablas de SNOBOL4, pero que no son más generales.
      awk nació en máquinas lentas y con poca memoria, y las características de sus arreglos también fueron resultado de ese entorno. Ejemplos de ello son limitar los subíndices a cadenas y, aun con azúcar sintáctica, restringirlos a una dimensión. Se dice que una implementación más general habría permitido arreglos multidimensionales o, como mínimo, arreglos como elementos de arreglos. La versión estable de SNOBOL4 es de 1967: https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp, por supuesto, trae tablas hash integradas. En MacLisp no parecen estar, al menos viendo el Pitmanual, mientras que ZetaLisp/LML e InterLisp sí las tienen.
      Por lo tanto, si no incluimos las alist o las listas de propiedades dentro de los arreglos asociativos integrados de Lisp, parecen ser casi contemporáneas al nacimiento de awk, o un poco posteriores.
    • Las alist de Lisp también son, en cierto sentido, “arreglos asociativos”, pero son más una estructura hecha con listas que una característica del lenguaje, y no son lo bastante eficientes para los usos que se les da en awk.
      En cualquier lenguaje se puede crear en unos minutos algo parecido a un arreglo asociativo con búsqueda lineal, pero eso es completamente distinto de tenerlo integrado como característica del lenguaje, como en SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua o JavaScript. Lo que el Lisp inicial ofrecía para estructurar datos era cons, car, cdr, y eso no es lo mismo. Dentro de Unix antes de awk también había programas que contenían arreglos asociativos, como los símbolos del linker, el compilador de C, el ensamblador, el kernel en forma de directorios del sistema de archivos y las variables del shell, pero no se ofrecían como característica de un lenguaje de programación. El Bourne shell era lo más cercano, porque se podía simular concatenando nombres de variables con algo como eval myarray_$key=$val, y el manejo de variables del shell en el Bourne shell de V7 estaba implementado con búsqueda en un árbol binario.
  • Es muy impresionante el flujo de desarrollo que va de las expresiones regulares a lex, yacc y awk. Se nota de forma convincente la sensación de que fueron construyendo sobre trabajos anteriores para producir resultados más generales.

  • Sé que me van a caer críticas por decir esto, pero creo que en GitHub hay muchísimos programadores con repositorios mejor escritos que los de estas leyendas del código. En esa época el grupo de talento era mucho más pequeño.

    • Me da curiosidad saber a quién consideras sobresaliente entre la gente actual. Siempre es entretenido seguir la carrera o las novedades de sangre nueva.
    • No creo que nadie haya afirmado alguna vez que Brian Kernighan sea el mejor programador de la historia.
    • Es una pregunta ingenua, pero me da verdadera curiosidad: ¿cómo se mediría que alguien es mejor?