2 Punkte von GN⁺ 2024-02-12 | 1 Kommentare | Auf WhatsApp teilen
  • Aho ist eine in AWK implementierte Git-Version, ein Spielzeugprojekt zum Erkunden der internen Struktur von Git und neuer Funktionen von GNU AWK
  • Das Ziel ist nicht der Praxiseinsatz, sondern Unterhaltung und Lernen; es ist nicht als Ersatz für Git gedacht
  • Für die Ausführung werden gawk 5.0 oder höher benötigt; für zlib-Kompression wird derzeit pigz verwendet, ansonsten wird eine Umgebung mit GNU coreutils vorausgesetzt
  • Auf den meisten Linux-Systemen lauffähig, aber für BSD/Mac nicht besonders geeignet
  • Implementiert sind init, add/rm, status, commit, schreibgeschütztes config und cat-file; Netzwerkfunktionen wie clone und push sollen nicht hinzugefügt werden

Ziel und Umfang von Aho

  • Aho ist ein Projekt mit dem Ziel, „Git in AWK implementiert“ umzusetzen
  • Es ist ein Spielzeugprojekt, das zeigen soll, dass Modern AWK mehr kann als Einzeiler-Skripte
  • Der Fokus liegt darauf, die interne Struktur von Git und neue Funktionen von GNU AWK zu erkunden
  • Es ist eher ein Projekt für Unterhaltung und Lernen als für praktische Nutzung

Laufzeitumgebung

  • Erforderlich sind folgende Komponenten
    • gawk 5.0 oder höher
    • pigz für zlib-Kompression
    • GNU coreutils
  • Auf den meisten Linux-Systemen sollte es laufen, für BSD- oder Mac-Umgebungen ist es jedoch nicht geeignet

Grundlegender Nutzungsablauf

  • Nach dem Vorbereiten der Umgebung mit source ./modpath und dem Ausführen von aho init wird im Verzeichnis .aho ein leeres Git-Repository initialisiert
  • aho add -v . fügt Dateien hinzu und gibt dabei Einträge wie .gitignore, LICENSE, README.md, aho, aho.awk, include/*.awk aus
  • Wird danach eine neue Datei erstellt und erneut aho add -v . ausgeführt, wird auch diese Datei hinzugefügt
  • Unter .aho/ wird eine Git-ähnliche Struktur angelegt
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • Es wird ein Beispiel gezeigt, in dem das Git-Werkzeug mit GIT_DIR=.aho git ls-files --stage die Index-Einträge des .aho-Repositories liest

Implementierte Funktionen und verbleibende Arbeit

  • Abgeschlossene Funktionen
    • init
    • add/rm
    • status
    • commit
    • config nur lesbar
    • cat-file
  • Noch nicht abgeschlossene Funktionen
    • reset
    • branch
    • switch
    • ls-files

Netzwerkfunktionen ausgeschlossen

  • Es ist nicht geplant, Netzwerkfunktionen hinzuzufügen
  • Zwar lassen sich Netzwerkfunktionen mit GNU AWK implementieren, aber clone oder push sollen in Aho nicht eingebaut werden
  • Beiträge sind willkommen, wenn sie helfen, das Wissen über AWK oder Git zu verbessern

1 Kommentare

 
GN⁺ 2024-02-12
Meinungen auf Hacker News
  • Awk ist großartig. Auf Unix-artigen Systemen ist es fast überall vorhanden und eine vollwertige Programmiersprache, wird in der Praxis aber offenbar vor allem für Einzeiler genutzt, die aus gepipeter Standardausgabe Textstücke herausziehen.
    Awk kann jedoch auch als universelle Skriptsprache verwendet werden und ist für diesen Zweck in vielerlei Hinsicht besser als Bash. Ich frage mich, warum man in freier Wildbahn nicht häufiger Awk-Skripte sieht. Vielleicht liegt es daran, dass Perl versucht hat, die Stärken von Shell, Awk und sed in einer Sprache zu vereinen, und später viele Leute Perl negativ sahen und sich abwandten.
    [1] Zufälliger Auszug aus dem NetBSD-Quellcode: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...

    • Stimmt. Perl hat Awk ersetzt, aber in vielen Fällen war das kontraproduktiv. Denn es gab keine einfache und allgemein verstandene Art, Perl-Code so zu schreiben, dass er für andere Programmierer gut lesbar ist und bis hin zu mittelgroßen bis großen Programmen skaliert.
      Das heißt nicht, dass das niemand gut hinbekommen hätte, aber die Erfolgsquote in der Branche insgesamt war niedrig, wodurch Perl einen ziemlich schlechten Ruf bekam.
      Ich würde gern ein Revival von Awk sehen. Awk lässt sich weniger leicht stark ausbauen, sodass bei einem Projekt, das als kleines Awk-Skript beginnt, das Risiko geringer ist, dass der nächsten Person eine Awk-Codebasis mit Tausenden Zeilen übergeben wird. Stattdessen wird es relativ früh in einer skalierbareren und wartungsfreundlicheren Sprache neu geschrieben.
    • Egal, was andere denken: Ich habe festgestellt, dass mir Perl gefällt. Was ich neulich gebaut habe, ist ein programmierbarer Partitionseditor. Es ist ähnlich wie das Leeren von Partitionen mit sfdisk, aber ich wollte mehr tun als nur einfaches Löschen und MBR- und GPT-Partitionstabellen zu einem Hybrid kombinieren.
      Es hat Spaß gemacht, und ich werde Perl wieder verwenden. Da ich jetzt gesehen habe, wie cool Awk ist, nutze ich es vielleicht auch irgendwann.
      [1] https://github.com/csdvrx/hdisk/
    • Awk ist unglaublich nützlich. Diese Woche habe ich ein Skript geschrieben, das viele GB an Postgres-Logs parst, um die Frage zu beantworten: „Welche Nutzer haben in den Minuten direkt nach jeder vollen Stunde die meisten Queries abgesetzt?“
      Ein paar Funktionen, insgesamt gut 20 Zeilen Code und einige Pipes mit sort und uniq reichten aus, und es war ziemlich schnell. Besonders, wenn man LC_ALL=C davor setzt, wird es noch schneller.
      [0]: Falls jemand fragt, warum wir keine Observability haben, die gut genug ist, damit solche Arbeiten nicht nötig sind: Damit liegt ihr nicht falsch, aber manchmal muss man mit der Realität leben, die man vorfindet.
      [1]: Ich weiß, dass gawk beim Erstellen einer Liste auch eindeutig sortieren kann. Es war spät in der Incident-Response, ich war müde, und | sort | uniq -c | sort -rn war viel leichter im Kopf zu behalten.
      [1].a: Ich weiß auch, dass sort ein -u-Argument hat. Es liefert keine Counts, und das Entfernen von Duplikaten ist außerdem deutlich langsamer als bei der uniq-Implementierung.
    • Die Einschätzung, dass Perl schlecht sei, ist ein großer Treiber der Awk-Renaissance. Entwickler, die Perl nie von Anfang an gelernt haben, wollen etwas, das die Lücke zwischen Shell und Python füllt, und es gibt auch Entwickler wie mich, die Perl widerwillig aufgegeben haben.
      Weil Leute mit HN-Geschmack Perl als „uncool“ betrachteten, haben Perl und aller in Perl geschriebene Code nun gewissermaßen ein Ablaufdatum. Awk ist jedoch POSIX-standardisiert, daher können diese Leute es nicht beseitigen.
    • Ich mag AWK. Die stringzentrierte Typisierung ist so krass, dass selbst Javascript-Programmierer rot werden würden. 0, "" und tatsächlich gar nichts sind alle derselbe falsy Wert.
      Zahlen unterscheiden sich, wie in Lua, nicht von Strings, die Zahlen darstellen. Seltsamerweise stört mich das aber nicht. Wenn man Zahlen unbedingt als Zahlen und Strings unbedingt als Strings behalten muss, kann man einem Wert ein Kennzeichen wie # oder $ voranstellen und es später mit substr() wieder entfernen.
  • The AWK Programming Language, Second Edition ist im September 2023 erschienen.
    https://awk.dev
    Die erste Auflage erschien 1988 und ist hier zu finden: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
    Diskussion: https://news.ycombinator.com/item?id=13451454

    • Diese 35-jährige Lücke ist eine gute Geschichte, wenn ein Lektor fragt: „Und, wie läuft es mit der zweiten Auflage?“
    • Brian Kernighan ist auch dabei. Er ist das „K“ in K&R C und eine Figur aus vielen weiteren Unix-Legenden.
  • Wenn man Code wie diesen sieht: In function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) sind die Parameter nach dem großen Leerraum lokale Variablen. Man kann ihnen Werte übergeben, aber dafür sind sie nicht gedacht.
    Ich habe einen Patch geschrieben, der GNU Awk eine let-Anweisung zum Binden echter lexikalischer Variablen hinzufügt, sodass man etwas wie function read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } } schreiben kann.
    Leider wurde er vom Projekt abgelehnt, und man empfahl mir, einen GNU-Awk-Fork unter anderem Namen zu erstellen, was ich dann getan habe.
    https://www.kylheku.com/cgit/egawk/about/

    • Ich finde, diese Entscheidung hat auch ihre Berechtigung. gawk unterscheidet sich bereits in zu vielen Punkten von awk. Wenn man noch stärker abweichende Syntax hinzufügt, ist es besser, einfach einen Fork zu machen und ihm einen anderen Namen zu geben.
  • Wenn ich gefragt werde, warum die Linux-Kommandozeile die beste Entwicklungsumgebung ist, verweise ich oft auf eines der Tools: Awk. Schon mit grundlegendem Awk-Wissen kann man mit wenig sehr viel erledigen, und IDEs fühlen sich irgendwann eher träge an.
    Wenn du Awk lernen möchtest und dir vorlesungsartiges Lernen liegt: Ich habe vor ein paar Jahren einen Vortrag für das Linux Fest Northwest aufgezeichnet und auf YouTube gestellt: https://youtu.be/E5aQxIdjT0M

    • Gleichzeitig kam Unicode-Unterstützung sehr spät hinzu, vermutlich erst vor etwa zwei Jahren. Wie bei anderen Shell-Tools gibt es auch Edge Cases, wenn man Inhalte per Pipe an Awk übergibt.
      Sequenzen wie CTRL+D können die Eingabe beenden, und es gibt sicher noch Dutzende weitere Edge Cases, die ich nicht kenne und die einen im ungünstigsten Moment beißen werden.
      Awk ist ein beeindruckendes Tool, aber wenn man es auf ein Podest stellt, werden seine Schwächen verdeckt. Ernsthafte Arbeit ist möglicherweise besser in spezialisiertere und modernere Tools ausgelagert, die zur jeweiligen Aufgabe passen.
    • Wie ersetzt Awk eine IDE? Ich mag Awk und weiß auch, dass es mächtig ist, wenn man Zeit investiert, es zu lernen, aber ohne IDE wäre meine Produktivität deutlich geringer.
      Das meiste, was eine IDE leistet, ist nicht Textbearbeitung, sondern dabei zu helfen, Code zu verstehen und zu ändern. Ich will nicht sagen, dass das falsch ist; mich interessiert nur, aus welcher Perspektive diese Aussage gemeint ist.
  • Anfangs dachte ich, der Name komme vom japanischen Slangwort „aho“ (アホ) für „Dummkopf“, dann fiel mir ein, dass Alfred Aho das a in awk ist. Vielleicht ist es ja beides?

    • Ich vermute, es ist beides. „Git“ war ja auch schon ein Slangwort für „Trottel“, also ein witziger Name.
    • Zuletzt habe ich es in Reservation Dogs gehört: https://en.wiktionary.org/wiki/aho#Navajo
    • Ich denke, es ist beides. Ein wirklich cleveres Wortspiel.
  • Ein großartiges Projekt und eine gute Idee. Die Grundlagen zu verstehen gibt einem eine andere Perspektive auf andere Projekte und Probleme.
    Ich habe früher einmal ein webbasiertes Wiki in Awk gebaut. Der Grund war, dass ich einen Linksys-Router mit sehr wenig Speicher verwendete.
    Es war gut, um sowohl zu lernen, wie ein Wiki funktioniert, als auch, was man mit Awk tun kann. Da es keine Bibliotheken gab, auf die ich mich verlassen konnte, musste ich die Grundlagen selbst implementieren, und dadurch habe ich sie wirklich verstanden.

  • Es heißt: „Ich habe nicht vor, hier Netzwerkfunktionen hinzuzufügen. Möglich wäre es natürlich, aber es gibt kein clone oder push“ – dabei kann man auch aus einem Repository in einem anderen Verzeichnis auf demselben Computer git clone ausführen und auch pushen.

    • Stimmt. Aber wenn man Branches hat, verringert das bis zu einem gewissen Grad die Notwendigkeit, lokale Klone zu erstellen. In der Praxis verwende ich rsync, um lokale Git-Repositories zu kopieren. Die Frage ist, was am besten ist.
    • Das ist so offensichtlich, aber in 10 Jahren Git-Nutzung bin ich nie auf die Idee gekommen, es auszuprobieren.
  • Der Gedanke lässt mich nicht los, dass man mit GNU-Utilities und ein paar Programmen – und vielleicht gar nicht viel mehr – ein allmächtiges Datenbank- und Verarbeitungstool bauen könnte, das spezialisierte Tools bei Performance und Funktionalität übertrifft. Geht das nur mir so?

  • Könnte relevant sein
    sed-chess: https://news.ycombinator.com/item?id=37896854
    awk-raycaster: https://github.com/TheMozg/awk-raycaster

  • Wenn dafür cppawk verwendet worden wäre, das es zur Entwicklungszeit noch nicht gab, hätte man #include nutzen können. Es funktioniert gut mit relativen Pfaden bezogen auf die Datei und benötigt kein AWKPATH.
    Außerdem kann man das vorverarbeitete Programm als einzelne Datei „bauen“, sodass cppawk danach nicht mehr benötigt wird.
    https://www.kylheku.com/cgit/cppawk/about/