-
Kurzes Interview mit Dr. Brian Kernighan, dem Erfinder von AWK
-
Vorstellung von Dr. Brian Kernighan
- Dr. Brian Kernighan ist ein kanadischer Informatiker, der bei Bell Labs zur Entwicklung von UNIX beigetragen hat
- Zusammen mit Dennis Richie verfasste er das Standardwerk zur Programmiersprache C, "The C Programming Language"
- Seit dem Jahr 2000 bildet er an der Princeton University die nächste Generation von Programmierern aus
- Er ist bekannt als die Person, die das erste "Hello World!"-Programm schrieb
-
Die neue Idee von AWK
- Die zentrale Idee von AWK sind assoziative Arrays (associative arrays)
- Damals war das ein neues Konzept, heute wird es in den meisten Sprachen entweder als Bibliotheksfunktion (hashmaps in Java oder C++) oder direkt in der Sprache selbst (dictionaries in Perl und Python) verwendet
- Assoziative Arrays sind eine sehr mächtige Struktur und können zur Simulation verschiedenster Datenstrukturen verwendet werden
- Das Pattern-Action-Paradigma war damals ebenfalls noch nicht weit verbreitet, ist aber eine effektive Methode, bestimmte Berechnungen zu strukturieren
-
Referenzen beim Entwurf der Programmiersprache
- Dr. Kernighan: "Keine"
- In den 1970er Jahren gab es viele neue spezialisierte Sprachen, und es gab kaum frühere Arbeiten, auf die man sich beziehen konnte
- Yacc war ein wichtiges Werkzeug, mit dem sich Grammatiken leicht erstellen und experimentell erproben ließen
- Lex erfüllte auf lexikalischer Ebene dieselbe Rolle und ersetzte viel mühsamen Code durch Regelsätze
- Lex und Yacc sind Beispiele für Pattern-Action-Sprachen und bildeten gemeinsam einen positiven Kreislauf
-
Ratschläge für junge Menschen mit Interesse am Entwurf von Programmiersprachen
- Er rät dazu, eine kleine spezialisierte Sprache zu entwerfen und zu implementieren
- Das ist sehr unterhaltsam und nützlich und deutlich einfacher, als eine Alternativsprache zu Rust oder C++ zu entwickeln
- Er empfiehlt, nach Aufgaben zu suchen, die sich automatisieren lassen, und dafür einen einfachen Compiler und eine Runtime zu bauen
- Ein Artikel, den Jon Bentley vor langer Zeit schrieb, ist weiterhin relevant
-
Bildquelle
- Wikimedia Commons
-
Zusammenfassung von GN⁺
- Dr. Brian Kernighan ist eine wichtige Persönlichkeit, die zur Entwicklung von UNIX und der Programmiersprache C beigetragen hat, und der Erfinder der Sprache AWK, die assoziative Arrays und das Pattern-Action-Paradigma eingeführt hat
- Assoziative Arrays sind eine mächtige Datenstruktur, die heute in den meisten Programmiersprachen verwendet wird
- Für junge Programmierer ist es hilfreich, kleine spezialisierte Sprachen selbst zu entwerfen und zu implementieren
- Yacc und Lex sind Werkzeuge, die Grammatik- und Lexikanalyse erleichtern, und gute Beispiele für Pattern-Action-Sprachen
1 Kommentare
Meinungen auf Hacker News
Wenig bekannte vermischte Fakten zu Brian Kernighan: Er kam zwar 2000 zum CS-Department von Princeton, hatte aber wohl schon um 1993, als er noch bei Bell Labs Research war, mindestens einen Kurs in Princeton unterrichtet.
Ein Student brachte häufig ein 386sx-Notebook mit, auf dem ein Linux vor Version 1.0 lief; wenn Brian sich nicht an Details des Verhaltens von awk erinnerte, führte dieser Student awk-Befehle aus und zeigte ihm die „Referenzimplementierung“. Insofern kam Brian vergleichsweise früh mit Linux in Berührung.
Es gibt auch einen Text von ihm aus dem Herbst 1994, in dem er das gebührenfreie Telefonverzeichnis von AT&T ins Internet stellte: https://www.cs.princeton.edu/~bwk/800.html
Falls es interessiert: Das eineinhalbstündige Interview von Lex Fridman mit BK ist ziemlich gut: https://www.youtube.com/watch?v=O9upVbGSBFo
Manchmal fühlt es sich wie ein enormes Privileg an, in dieser Zeit zu leben. Es ist ein bisschen so, als könnte ein Mathematiker Euler interviewen oder ein Physiker Newton.
Im Buch Masterminds of Programming gibt es ein umfassenderes Interview, in dem auch Aho und Weinberger vorkommen. Sehr zu empfehlen.
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
Diese Woche lese ich The Unix Programming Environment von 1983, also ungefähr 35 Jahre zu spät. In dem Buch sticht awk wirklich heraus und wirkt wie das, was heutigen populären Sprachen wie JavaScript, Lua, Python, Perl oder Tcl am nächsten kommt.
Was awk „assoziative Arrays“ nennt, nennt JavaScript einfach „Objekte“. Der awk-Quellcode aus Unix Version 7 von 1979 umfasst laut https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk nur 2680 Zeilen, und die ausführbare Datei war 46 KB groß und lief im 64-KB-Adressraum der PDP-11 – erstaunlich. Diese Version und das awk, das vier Jahre später im Buch beschrieben wurde, hatten offenbar noch keine benutzerdefinierten Funktionen, und bei der V7 Bourne shell war es wohl ähnlich. In bc gab es sie aber.
Die 46 KB große ausführbare Datei war auch etwas größer als Turbo Pascal 3.02: https://prog21.dadgum.com/116.html Wobei Turbo Pascal natürlich keine Regex-Engine hatte.
function,for e in a, Syntax ohne Semikolons, string-zentrierte Typbehandlung unddelete x[e]betrachtet, ist ziemlich klar, dass awk eine Grundlage von JavaScript war; Brendan Eich hat das auch so gesagt: https://brendaneich.com/2010/07/a-brief-history-of-javascript/01983oder01979sind weder eine Art, Jahreszahlen zu schreiben, noch eigentlich eine sinnvolle Art, Zahlen zu schreiben.Ich erinnere mich, dass vor langer Zeit jemand in seiner Usenet-
.sigschrieb: „Perl ist Margarine, awk ist Butter“. Vielleicht war die Reihenfolge auch umgekehrt.Perl hat zwar viele Schwächen, aber nachdem ich Perl entdeckt hatte, habe ich awk deutlich seltener benutzt.
Ich habe ein von Dr. Kernighan signiertes K&R-Buch von einer australischen Unix-Konferenz in den 80ern. Es gehört zu meinen wertvollsten Besitztümern.
Dieses Buch, Kernighan/Pikes The Practice of Programming und Dinge wie das Byte Magazine waren mein „Stack Overflow“ der 1980er.
Interessant, dass er assoziative Arrays als etwas „relativ Neues“ darstellt. In Lisp gab es sie schließlich schon fast 20 Jahre früher.
Selbst als ich in den 1990ern mit dem Programmieren anfing, betrachteten große Teile der C-Welt assoziative Datenstrukturen wie Hash-Tabellen noch als etwas ziemlich Exotisches, das man nur hervorholte, wenn es wirklich nicht anders ging. Man denkt, die Programmierwelt bewege sich schnell, aber tatsächlich tut sie das nicht; damals war sie besonders langsam. Oft dauerte es Jahrzehnte, bis ein Feature, das in irgendeiner Sprache der 1960er oder 1970er auftauchte, breite Akzeptanz fand. Auch Lisp hatte damals im Vergleich zu anderen Optionen eine ziemlich schlechte Performance und war daher vielleicht kein gutes Aushängeschild für seine Features.
awk entstand auf langsamen Maschinen mit wenig Speicher, und auch die Eigenschaften seiner Arrays waren ein Ergebnis dieser Umgebung. Beispiele dafür sind, dass Indizes auf Strings beschränkt sind und sie trotz syntaktischem Zucker auf eine Dimension begrenzt bleiben. Eine allgemeinere Implementierung hätte wohl mehrdimensionale Arrays zugelassen oder zumindest Arrays als Array-Elemente erlaubt. Die stabile Version von SNOBOL4 stammt von 1967: https://en.wikipedia.org/wiki/SNOBOL
Wenn man also bei Lisps eingebauten assoziativen Arrays alists oder Property Lists nicht mitzählt, scheinen sie ungefähr aus derselben Zeit wie awk zu stammen oder sogar etwas später.
In jeder Sprache kann man sich in wenigen Minuten mit linearer Suche etwas bauen, das einem assoziativen Array ähnelt, aber das ist etwas völlig anderes als etwas, das wie in SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua oder JavaScript als Sprach-Feature eingebaut ist. Was frühes Lisp zur Datenstrukturierung bereitstellte, waren
cons,carundcdr, und das ist nicht dasselbe. Auch innerhalb von Unix vor awk gab es Programme, die assoziative Arrays enthielten – etwa Linker-Symbole, C-Compiler, Assembler, den Kernel in Form von Dateisystem-Verzeichnissen oder Shell-Variablen –, aber sie wurden nicht als Feature einer Programmiersprache angeboten. Am nächsten kam die Bourne shell: Dort konnte man durch Aneinanderhängen von Variablennamen mit etwas wieeval myarray_$key=$valso etwas nachahmen, und die Verarbeitung von Shell-Variablen in der V7 Bourne shell war als Suche in einem Binärbaum implementiert.Der Entwicklungsfluss von regulären Ausdrücken über lex, yacc und awk ist ausgesprochen beeindruckend. Es wird überzeugend sichtbar, wie man auf früherer Arbeit aufbaut und daraus allgemeinere Ergebnisse schafft.
Das wird wahrscheinlich schlecht ankommen, aber ich vermute, dass es auf GitHub sehr viele Programmierer mit besser geschriebenen Repositories gibt als diese Coding-Legenden. Damals war der Talentpool viel kleiner.