Git in Awk implementiert: Aho
(github.com/djanderson)- 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
gawk5.0 oder höher benötigt; für zlib-Kompression wird derzeitpigzverwendet, 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ütztesconfigundcat-file; Netzwerkfunktionen wiecloneundpushsollen 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
gawk5.0 oder höherpigzfü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 ./modpathund dem Ausführen vonaho initwird im Verzeichnis.ahoein 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/*.awkaus- 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 angelegtbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- Es wird ein Beispiel gezeigt, in dem das Git-Werkzeug mit
GIT_DIR=.aho git ls-files --stagedie Index-Einträge des.aho-Repositories liest
Implementierte Funktionen und verbleibende Arbeit
- Abgeschlossene Funktionen
initadd/rmstatuscommitconfignur lesbarcat-file
- Noch nicht abgeschlossene Funktionen
resetbranchswitchls-files
Netzwerkfunktionen ausgeschlossen
- Es ist nicht geplant, Netzwerkfunktionen hinzuzufügen
- Zwar lassen sich Netzwerkfunktionen mit GNU AWK implementieren, aber
cloneoderpushsollen in Aho nicht eingebaut werden - Beiträge sind willkommen, wenn sie helfen, das Wissen über AWK oder Git zu verbessern
1 Kommentare
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...
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.
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/
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=Cdavor 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 -rnwar 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.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.
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 mitsubstr()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
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 wiefunction 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/
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
Sequenzen wie
CTRL+Dkö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.
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
ainawkist. Vielleicht ist es ja beides?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.
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
https://github.com/soimort/translate-shell
Wenn dafür cppawk verwendet worden wäre, das es zur Entwicklungszeit noch nicht gab, hätte man
#includenutzen können. Es funktioniert gut mit relativen Pfaden bezogen auf die Datei und benötigt keinAWKPATH.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/