1 points par GN⁺ 2024-07-19 | 1 commentaires | Partager sur WhatsApp
  • Brève interview du Dr Brian Kernighan, créateur d'AWK

    • Présentation du Dr Brian Kernighan

      • Le Dr Brian Kernighan est un informaticien canadien qui a contribué au développement d'UNIX chez Bell Labs
      • Il a coécrit avec Dennis Ritchie l'ouvrage de référence sur le langage de programmation C, "The C Programming Language"
      • Depuis 2000, il forme la nouvelle génération de programmeurs à Princeton University
      • Il est célèbre pour avoir écrit le tout premier programme "Hello World!"
    • La nouvelle idée d'AWK

      • L'idée principale d'AWK est celle des tableaux associatifs (associative arrays)
      • À l'époque, c'était un concept nouveau, mais aujourd'hui il est utilisé dans la plupart des langages, soit via des fonctions de bibliothèque (hashmaps en Java ou en C++), soit directement dans le langage lui-même (dictionaries en Perl et en Python)
      • Les tableaux associatifs sont des structures très puissantes, qui peuvent servir à simuler diverses structures de données
      • Le paradigme pattern-action n'était pas non plus largement utilisé à l'époque, mais constitue une manière efficace d'organiser certains calculs
    • Références utilisées lors de la création du langage

      • Dr Kernighan : "Aucune"
      • Dans les années 1970, il existait beaucoup de nouveaux langages spécialisés, et il n'y avait presque aucun travail antérieur vraiment pertinent sur lequel s'appuyer
      • Yacc était un outil important, car il permettait de créer et d'expérimenter facilement des grammaires
      • Lex jouait le même rôle au niveau lexical, en remplaçant une grande quantité de code fastidieux par un ensemble de règles
      • Lex et Yacc étaient des exemples de langages pattern-action, créant entre eux une boucle vertueuse
    • Conseils aux jeunes intéressés par la conception de langages de programmation

      • Il conseille de concevoir et d'implémenter un petit langage spécialisé
      • C'est très amusant et utile, et bien plus facile que de créer un langage alternatif à Rust ou à C++
      • Il recommande de repérer une tâche pouvant être automatisée, puis de créer un compilateur simple et un runtime
      • Un article connexe écrit il y a longtemps par Jon Bentley reste toujours d'actualité
    • Source de l'image

      • Wikimedia Commons

Le résumé de GN⁺

  • Le Dr Brian Kernighan est une figure majeure ayant contribué au développement d'UNIX et du langage C, ainsi que le créateur du langage AWK, qui a introduit les tableaux associatifs et le paradigme pattern-action
  • Les tableaux associatifs sont aujourd'hui des structures de données puissantes utilisées dans la plupart des langages de programmation
  • Pour les jeunes programmeurs, concevoir et implémenter un petit langage spécialisé est un exercice très bénéfique
  • Yacc et Lex sont des outils qui facilitent l'analyse grammaticale et lexicale, et constituent de bons exemples de langages pattern-action

1 commentaires

 
GN⁺ 2024-07-19
Commentaires sur Hacker News
  • Quelques anecdotes peu connues sur Brian Kernighan : il a rejoint le département d’informatique de Princeton en 2000, mais enseignait déjà au moins un cours à Princeton vers 1993 alors qu’il était encore chez Bell Labs Research
    Un étudiant apportait souvent un portable 386sx faisant tourner Linux pre-1.0, et quand Brian ne se souvenait plus du comportement précis d’awk, cet étudiant lançait une commande awk pour lui montrer « l’implémentation correcte ». Brian a donc découvert Linux relativement tôt
    Il existe aussi un texte de l’automne 1994 où il a mis l’annuaire gratuit d’AT&T sur Internet : https://www.cs.princeton.edu/~bwk/800.html

    • Je ne sais plus trop si gawk était l’implémentation de référence d’awk, ou si c’était en fait gsed qui divergeait vraiment
    • On a l’impression que « cet étudiant », c’est peut-être l’auteur du commentaire lui-même
  • Si ça vous intéresse, l’interview d’1 h 30 de Lex Fridman avec BK est très bien : https://www.youtube.com/watch?v=O9upVbGSBFo

    • Il y a aussi beaucoup d’interviews de BK sur la chaîne YouTube Computerphile : https://www.youtube.com/results?search_query=computerphile+kernighan
      Par moments, j’ai l’impression que vivre à notre époque est un privilège immense. C’est un peu comme si un mathématicien pouvait interviewer Euler, ou un physicien Newton
    • J’avais vu autrefois des extraits de ses conférences et je n’avais pas été très convaincu, mais cette interview a l’air vraiment bonne dès le début de la vraie conversation, après la pub
  • Le livre Masterminds of Programming contient une interview plus large, avec Aho et Weinberger aussi. Je le recommande vivement

  • Cette semaine, je lis The Unix Programming Environment de 1983, avec environ 35 ans de retard. awk y ressort vraiment, et semble être l’ancêtre le plus proche des langages populaires actuels comme JavaScript, Lua, Python, Perl ou Tcl
    Ce qu’awk appelle des « tableaux associatifs », JavaScript l’appelle simplement des « objets ». Le code source d’awk dans Unix version 7 de 1979 ne fait que 2680 lignes selon https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk, et c’est impressionnant de voir que l’exécutable ne faisait que 46 KB et tournait dans l’espace d’adressage de 64 KB du PDP-11. Il semble que ni cette version ni l’awk du livre, quatre ans plus tard, n’avaient de fonctions définies par l’utilisateur, et il me semble que c’était aussi le cas du shell Bourne de V7. En revanche, bc en avait

    • awk sans fonctions définies par l’utilisateur est aussi connu sous le nom de old awk, ou oawk, nom créé a posteriori. Heirloom conserve encore une implémentation qui semble en descendre, aux côtés du plus familier nawk : https://heirloom.sourceforge.net/man/awk.1.html
      Un exécutable de 46 KB, c’était aussi un peu plus gros que Turbo Pascal 3.02 : https://prog21.dadgum.com/116.html même si, bien sûr, Turbo Pascal n’avait pas de moteur d’expressions régulières
    • awk, c’est plus que ça. Quand on voit le mot-clé function, for e in a, la syntaxe sans point-virgule, la gestion des types centrée sur les chaînes, ou encore delete x[e], il semble assez clair que JavaScript s’est appuyé sur awk, et Brendan Eich l’a lui-même dit : https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • J’ai lu le même livre et j’en suis arrivé exactement à la même conclusion. Puis j’ai lu The UNIX-Haters Handbook, après quoi j’ai eu le sentiment qu’aujourd’hui, des outils Unix comme awk ne sont malheureusement plus assez bons
    • Écrire 01983, 01979 comme ça, ce n’est pas une manière d’écrire les années, et à vrai dire c’est même étrange comme façon d’écrire des nombres
    • Le 0 devant l’année m’a pas mal perturbé. J’ai cru que c’était un format de date ésotérique
  • Je me souviens que, il y a longtemps, quelqu’un avait écrit dans une signature Usenet : « Perl est la margarine, awk est le beurre ». C’était peut-être l’inverse
    Perl a beaucoup de défauts, mais après avoir découvert Perl, j’ai beaucoup moins utilisé awk

  • J’ai un exemplaire de K&R dédicacé par le Dr Kernighan lors d’une conférence Unix en Australie dans les années 1980. C’est l’un des objets auxquels je tiens le plus
    Ce livre, ainsi que The Practice of Programming de Kernighan/Pike et le magazine Byte, constituaient mon « Stack Overflow » des années 1980

  • Je trouve intéressant qu’il parle des tableaux associatifs comme de quelque chose de « relativement nouveau ». Lisp en avait déjà depuis presque 20 ans

    • Avant Internet, même en étant compétent et très informé dans un domaine, on pouvait facilement ne jamais rencontrer ce qu’une autre communauté considérait comme élémentaire, ou voir ces idées se diffuser très lentement sur plusieurs décennies
      Même quand j’ai commencé à programmer dans les années 1990, une bonne partie du monde C voyait encore des structures de données associatives comme les tables de hachage comme quelque chose d’assez exotique, qu’on ne sortait que lorsqu’on n’avait vraiment pas le choix. On imagine que le monde de la programmation avance vite, mais en réalité ce n’est pas le cas, et c’était encore plus lent à l’époque. Il a souvent fallu plusieurs décennies pour que des fonctionnalités apparues dans certains langages des années 1960–70 soient largement adoptées. Lisp aussi avait alors des performances assez médiocres par rapport aux autres options, ce qui n’en faisait peut-être pas le meilleur ambassadeur pour promouvoir ses fonctionnalités
    • Dans le PDF gratuit de la première édition de The AWK Programming Language, il est indiqué que les tableaux associatifs ont été inspirés des tables SNOBOL4, sans être plus généraux pour autant
      awk est né sur des machines lentes avec peu de mémoire, et les propriétés de ses tableaux sont aussi le résultat de cet environnement. Le fait de limiter les indices aux chaînes de caractères et, malgré un peu de sucre syntaxique, de rester limité à une dimension en est un exemple. Une implémentation plus générale aurait probablement permis les tableaux multidimensionnels, ou au minimum des tableaux comme éléments de tableau. La version stable de SNOBOL4 date de 1967 : https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp intègre évidemment des tables de hachage. À en juger par le Pitmanual, MacLisp n’en avait apparemment pas, tandis que ZetaLisp/LML et InterLisp en avaient
      Donc, si l’on n’inclut pas dans les tableaux associatifs natifs de Lisp les alist ou les listes de propriétés, cela semble être presque contemporain de la naissance de awk, voire légèrement postérieur
    • Les alist de Lisp sont bien, dans un certain sens, des « tableaux associatifs », mais c’est davantage une structure construite à partir de listes qu’une fonctionnalité du langage, et ce n’est pas assez efficace pour les usages qu’en fait awk
      Dans n’importe quel langage, on peut bricoler en quelques minutes quelque chose qui ressemble à un tableau associatif avec une recherche linéaire, mais c’est totalement différent de ce qui est intégré comme fonctionnalité du langage dans SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua ou JavaScript. Ce que les premiers Lisp fournissaient pour structurer les données, c’était cons, car, cdr, et ce n’est pas la même chose. Même dans l’Unix d’avant awk, il existait déjà des programmes contenant des tableaux associatifs, comme les symboles de l’éditeur de liens, le compilateur C, l’assembleur, le noyau avec ses répertoires de système de fichiers, ou les variables du shell, mais ce n’était pas proposé comme fonctionnalité de langage. Le shell Bourne était ce qui s’en rapprochait le plus, puisqu’on pouvait l’imiter en concaténant des noms de variables, avec quelque chose comme eval myarray_$key=$val, et la gestion des variables du shell Bourne V7 était implémentée par recherche dans un arbre binaire
  • Le fil de développement qui mène des expressions régulières à lex, yacc, puis awk, est extrêmement marquant. On sent de manière convaincante la construction par couches successives sur des travaux antérieurs pour produire un résultat plus général

  • Je vais peut-être dire quelque chose qui va me valoir des critiques, mais j’ai l’impression qu’il y a sur GitHub énormément de programmeurs avec des dépôts mieux écrits que ceux de ces légendes du code. Le vivier de talents était bien plus réduit à l’époque

    • Je me demande qui, parmi les gens d’aujourd’hui, il considère comme remarquable. C’est toujours intéressant de suivre la carrière ou l’actualité de sang neuf
    • Je ne crois pas que quiconque ait jamais prétendu que Brian Kernighan était le meilleur programmeur de tous les temps
    • C’est peut-être naïf, mais je me le demande vraiment. Comment mesurerait-on le fait d’être meilleur ?