-
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 (
hashmapsen Java o C++) o como parte del propio lenguaje (dictionariesen 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
- La idea principal de AWK son los arreglos asociativos (
-
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
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
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
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.
En el libro Masterminds of Programming hay una entrevista más completa que incluye también a Aho y Weinberger. Lo recomiendo mucho.
https://en.wikipedia.org/wiki/Brian_Kernighan
http://www.linuxjournal.com/article/7035
http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/index.html
https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory
https://web.archive.org/web/20131126220450/http://princetonstartuptv.com/post/49379235060/the-legendary-brian-kernighan-on-teaching-writing
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 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.
function,for e in a, la sintaxis sin punto y coma, el manejo de tipos centrado en cadenas ydelete 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/01983o01979no es una forma de escribir años y, de hecho, también es raro como forma de escribir números.Recuerdo que hace mucho alguien escribió en su
.sigde 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.
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.
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
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.
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 comoeval 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.