Einleitung
Hallo zusammen! Ich hoffe, euch geht es allen gut.
Bei Exercism war im August viel los. Wir haben Premium und Insiders zusammengelegt, automatisiertes Feedback direkt in den Editor eingebaut, Track-Trophäen eingeführt und außerdem jede Menge kleine Verbesserungen an der Website vorgenommen! Wenn du noch nicht nachgeschaut hast, welche Trophäen du in deinen Tracks bekommst, dann mach das unbedingt. Wir haben allen, die eine oder mehrere Trophäen haben, eine E-Mail geschickt, also halte auch danach Ausschau. Im August hatten wir außerdem jede Menge Spaß bei #12in23 und haben Sprachen erkundet, mit denen man normalerweise Apps erstellt.
Diesen Monat ist Slimline September, in dem wir Sprachen erkunden, die sehr knapp und prägnant in ihrer Syntax sind. Konkret schauen wir uns 8th (ein Nachkomme von Forth), AWK, Bash, jq, Perl und Raku an (früher bekannt als Perl 6).
Die Badges
Um das Slimline-September-Badge zu bekommen, musst du im September fünf beliebige Übungen in einer dieser Sprachen abschließen.
Außerdem gibt es das ganzjährige 12in23-Badge. Um das zu bekommen, musst du fünf unserer vorgestellten Übungen in der Sprache lösen.
- Gigasecond: mit Datumsangaben arbeiten
- Atbash Cipher: mit Strings arbeiten
- Darts: mit Zahlen und Bedingungen arbeiten
- Luhn: mit Strings, Bedingungen und Zahlen arbeiten
- Series: mit Strings und Sequenzen arbeiten
Diese Übungen und die aus den vorherigen Monaten findest du alle auf der #12in23-Seite.
Überblicke
Tauchen wir ein und schauen wir uns jede Sprache in einem Überblick an.
8th
- Wurde von Ron Aaron entwickelt.
- Der Name ist ein Wortspiel mit der Sprache Forth, die die wichtigste Inspiration dafür ist. Es gibt aber viele Unterschiede zu Forth:
- Stark typisiert
- Plattformübergreifend
- Verbesserte Sicherheit (kein direkter Speicherzugriff und kein eingebauter Assembler)
- Bietet sowohl eine kostenlose als auch eine kommerzielle Version, wobei letztere mehr Funktionen bietet.
- Closed Source, aber der Quellcode kann eingesehen werden, sobald eine Enterprise-Lizenz gekauft wurde
AWK
- AWK wurde in den 1970er-Jahren in den Bell Labs von Alfred Aho, Peter Weinberger und Brian Kernighan entwickelt. Der Name ist ein Akronym aus den Nachnamen seiner Autoren.
- Es ist eine domänenspezifische Sprache, die für Textverarbeitung entwickelt wurde, aber auch für andere Zwecke genutzt werden kann
- AWK ist ein Unix-Filter, wie sed und grep, der für den Einsatz in einer Pipeline gedacht ist
- Die Single UNIX Specification und die Linux Standard Base schreiben beide vor, dass es in jeder Implementierung enthalten sein muss, weshalb es auf den meisten *nix-Rechnern verfügbar ist
- Verschiedene Implementierungen der Sprache AWK:
- awk (oder oawk für original AWK): die ursprüngliche Implementierung
- GNU AWK (gawk), 1988 veröffentlicht, hat die Sprache deutlich überarbeitet und erweitert
- BWK AWK (auch bekannt als nawk), Ende der 90er veröffentlicht
- mawk: schnelle, bytecode-interpretierte Implementierung
- Auf vielen *nix-Systemen ist der Befehl
awkein Symlink auf entwedergawkodernawk
Bash
- Bash ist eine Unix-Shell, die von Brian Fox entwickelt und 1989 veröffentlicht wurde.
- Sie wurde als freier Ersatz für die Bourne-Shell entwickelt und ist zur Standard-Login-Shell für die meisten Linux-Distributionen geworden. Sie ist eine Obermenge der Befehlssyntax der Bourne-Shell, was den Umstieg erleichtert
- Sie erweitert die Bourne-Shell in vielerlei Hinsicht: Klammererweiterung, Vervollständigung auf der Kommandozeile, Signalverarbeitung und mehr
jq
- Entwickelt von Stephen Dolan und 2012 veröffentlicht
- Entwickelt, um JSON-Dokumente einfach abzufragen, umzuwandeln und zu bearbeiten („sed für JSON“)
- Das Tool
jq(das die Sprache implementiert) wurde ursprünglich in Haskell implementiert, später aber nach C portiert. Es gibt auch Portierungen auf Basis von Go und Rust
Perl
- Perl wurde von Larry Wall in den späten 1980er-Jahren entwickelt und 1987 erstmals veröffentlicht.
- Sie wurde als universelle Skriptsprache entwickelt, um die Verarbeitung von Berichten zu erleichtern
- Sehr einflussreich, insbesondere durch die Unterstützung regulärer Ausdrücke (darauf kommen wir später noch zurück)
Raku
- Entworfen von Larry Wall (dem Schöpfer von Perl) und 2015 veröffentlicht
- Ursprünglich als Perl 6 bekannt, sollte sie die Sprache aufräumen und einige als wenig nützlich oder verwirrend empfundene Funktionen entfernen (ein schönes Zitat: „In Perl 6 haben wir entschieden, dass es besser ist, die Sprache zu reparieren als den Nutzer.“, Larry Wall). Perl 6 war am Ende nicht quellkompatibel mit Perl 5, daher wurde sie in Raku umbenannt
- Die Designphilosophie dreht sich darum, Programmieren angenehm und produktiv zu machen, und bietet gleichzeitig eine breite Palette an Werkzeugen für ganz unterschiedliche Programmierherausforderungen (universell einsetzbar)
- Da Raku eine Spezifikation ist, kann es mehrere Implementierungen geben (und das gibt es auch). Die einzige aktiv weiterentwickelte Implementierung ist derzeit Rakudo, aber es gibt ältere Implementierungen wie Pugs (in Haskell geschrieben), v6-KindaPerl6 und Niecza (für die CLR)
Wo werden diese Sprachen eingesetzt?
8th
- Leider konnten wir nicht herausfinden, wo sie eingesetzt wird
AWK
- Wird für Datenextraktion und -berichterstattung sowie allgemein für Skripting verwendet
Bash
- Hauptsächlich für Systemadministration verwendet, aber auch für Kommandozeilen-Werkzeuge oder Wrapper um andere Tools. Wir haben sie ausgiebig genutzt, um in großem Umfang mit Exercism-Repos zu arbeiten
jq
- Wird verwendet, um JSON-Dokumente abzufragen, umzuwandeln und zu bearbeiten, oft in Form von Shell-Skripten.
Perl
- Wird für Datenmanipulation, Dateiverarbeitung, Webprogrammierung und Systemadministrationsaufgaben verwendet. In den frühen Tagen des Webs wurde sie wegen ihrer Fähigkeiten zur String-Manipulation und ihres umfangreichen Modul-Ökosystems beliebt.
Raku
- Wird für Textverarbeitung, Systemadministration und mehr verwendet
Was macht diese Sprachen aus Programmierperspektive interessant?
Die meisten dieser Sprachen sind dynamisch typisiert und interpretiert, was gut zu ihrem Skript-Charakter passt. Es gibt allerdings Ausnahmen, besonders bei den unterstützten Paradigmen.
8th
- Stark typisiert
- Multiparadigmatisch: prozedural, aber interessanterweise Stack-basiert (Stack-basiertes Ausführungsmodell), reflektiv (die Fähigkeit, die eigene Struktur und das eigene Verhalten zu untersuchen und zu verändern) und konkatenativ (alle Ausdrücke sind Funktionen, und die Aneinanderreihung von Funktionen bedeutet Funktionskomposition)
- Wird zu nativem Code kompiliert, kann aber auch in einer REPL interpretiert werden
AWK
- Dynamisch typisiert und oft interpretiert (hängt von der verwendeten Implementierung ab)
- Das Hauptparadigma ist datengetrieben: Du beschreibst ein Programm als Anweisungen, die die abzugleichenden Daten und die erforderliche Verarbeitung beschreiben, statt explizit eine Abfolge von Schritten festzulegen. AWK unterstützt aber auch prozedurale Programmierung
Bash
- Dynamische und interpretierte Sprache
- Unterstützt imperative und prozedurale Programmierung
jq
- Dynamische und interpretierte Sprache
- Rein funktionale Sprache (alle Werte sind unveränderlich), mit Schwerpunkt auf „Pipelines“. Fühlt sich sehr nach Unix an
Perl
- Dynamisch typisiert und interpretiert
- Multiparadigmatisch, mit Unterstützung für funktionale, objektorientierte und imperative Programmierung
Raku
- Dynamisch typisiert, unterstützt aber graduelle Typisierung, bei der statische Typisierung dort hinzugefügt werden kann, wo sie gebraucht wird (Perl ist dynamisch)
- Multiparadigmatische Sprache: imperativ, prozedural, objektorientiert und funktional
Was macht sie zu großartigen Sprachen?
8th
- Sehr wenig Syntax macht die Sprache leichter zu lernen und zu verstehen. Verwendet JSON, um Daten zu beschreiben (wie Objekte und Arrays). Unterstützt außerdem andere Container wie Stacks, Queues und Heaps
- Keine reservierten Schlüsselwörter. Unterprogramme heißen „Wörter“, und neue Wörter lassen sich leicht definieren. Alle Wörter können zur Laufzeit neu definiert werden, ob eingebaut oder selbst definiert
- Plattformübergreifend. Für jede unterstützte Plattform lässt sich leicht eine ausführbare Datei erzeugen
- Sicher. Eingebaute Sicherheitsfunktionen verhindern eine Vielzahl von Fehlern (kein direkter Speicherzugriff, die Laufzeitumgebung bindet keine dynamischen Bibliotheken ein)
AWK
- Einfache Syntax mit einer sehr einheitlichen Struktur von AWK-Code, was das Lernen und Lesen von AWK-Code leicht macht. Die Datenstrukturen sind ebenfalls einfach und flexibel
- Sehr ausdrucksstark: Du kannst mit sehr wenig Code eine Menge erreichen. Perfekt für Einzeiler
- Auf den meisten *nix-Rechnern installiert, sodass du deine AWK-Kenntnisse an vielen Stellen einsetzen kannst (neben /bin/sh die einzige Skriptsprache im Standard-Unix)
- Funktioniert sehr gut in Pipelines und Shell-Skripten, wo AWK die Ausgabe anderer Tools verarbeitet oder umgekehrt
Bash
- Läuft auf den meisten Plattformen. Sie ist auf fast allen *nix-Rechnern installiert, einschließlich macOS. Mit dem Windows Subsystem for Linux (WSL) ist bash inzwischen auch auf Windows-Systemen verfügbar.
- Sie lässt sich als RE(P)L nutzen, in der du einzelne Befehle ausführst oder Code aus Dateien liest und ausführst (bekannt als Shell-Skripte). Wenn du schon einmal ein Linux-Terminal benutzt hast, hast du wahrscheinlich bash-Code geschrieben, denn das Terminal ist meist eine bash-RE(P)L
- Bash und Shell-Skripte werden häufig für Systemadministration, DevOps und Computermanagement verwendet.
- Äußerst vielseitig und flexibel
- Leistungsstarke String-Manipulation, einschließlich sehr unkomplizierter String-Interpolation
jq
- Einfache, kurze Syntax für die Arbeit mit JSON, was das Lernen leicht macht
- Erlaubt eigene Funktionsdefinitionen für komplexere Operationen.
- Unterstützt die Optimierung von Endrekursion, was ideal für die rekursive Verarbeitung von Daten ist
- Das jq-Tool wird als einzelne Binärdatei verteilt, die nur etwa 30 KB groß ist
- Das Tool
yqumhülltjq, damit du mit derselben Syntax XML-, TOML- und YAML-Dateien bearbeiten kannst (im Hintergrund wandelt es diese Datentypen in JSON um) - Sowohl die C- als auch die Go-Implementierung lassen sich in andere Anwendungen einbetten
Perl
- Läuft auf den meisten Plattformen. Ideal für plattformübergreifende Skripte
- Flexibilität ist ein Eckpfeiler von Perls Designphilosophie. Das berühmte Motto lautet: „Es gibt mehr als einen Weg, es zu tun“ (TMTOWTDI). Je nach Aufgabe können unterschiedliche Ansätze verwendet werden
- Eine starke Community und ein Erbe einflussreicher Projekte. Viele Skripte, Tools und Anwendungen wurden mit Perl entwickelt. Man nannte sie einmal „das Klebeband, das das Internet zusammenhält“
- Reichhaltiges Ökosystem an Modulen und Bibliotheken, verfügbar über das Comprehensive Perl Archive Network (CPAN)
Raku
- Groß, komplex und mächtig, aber auch so entworfen, dass du nicht alles auf einmal lernen musst. Der Einstieg ist leicht, und du kannst später in die mächtigeren Funktionen eintauchen
- Mächtiges und erweiterbares Typsystem mit gradueller Typisierung. Das bedeutet, du kannst festlegen, wie streng die Typüberprüfung sein soll, und so zwischen dynamischer und statischer Typisierung abwägen
- Unterstützt Multiple Dispatch, wodurch du Polymorphie ohne Vererbung nutzen kannst
- Unicode ist in Raku ein vollwertiger Bürger. Es bietet native Unterstützung für den Umgang mit verschiedenen Zeichenkodierungen
- Bietet fortgeschrittene Funktionen für Nebenläufigkeit und Parallelität. Enthält eingebaute Unterstützung für asynchrone Programmierung, reaktive Programmierung und parallele Ausführung
Was sind ihre herausragenden Merkmale?
8th
- Erfordert eine andere Denkweise. Seine einzigartige Mischung aus Paradigmen unterscheidet sich stark von anderen Sprachen und fordert dich heraus, neue Herangehensweisen zu finden
- Stack-basierte Syntax und die umgekehrte polnische Notation (UPN) ergeben ein sehr einfaches Denkmodell für die Programmausführung. Werte werden auf den Stack gelegt, und die meisten Wörter sind über ihre Wirkung auf den Stack definiert
AWK
- Das datengetriebene Paradigma ist sehr mächtig. Es erfordert eine andere Denkweise, weil Programme als Menge von Bedingungs-/Aktionspaaren definiert werden und Text in Datensätze (typischerweise eine Zeile pro Datensatz) aufgeteilt wird, und jeder Datensatz in Felder (z. B. CSV-Felder oder ein Wort pro Feld). Wenn du dich daran gewöhnt hast, wirst du die Eleganz und Ausdrucksstärke dieses Ansatzes schätzen und überall Einsatzmöglichkeiten dafür entdecken
- Perfekt für die Arbeit mit Text. Ob du Text analysierst, umwandelst oder auswertest, AWK hat alles, was du brauchst. Aufgaben wie das Ausgeben der Shell für jeden Nutzer auf dem System oder das Summieren einer CSV-Spalte: Du wirst staunen, wie wenig Code du brauchst
Bash
- Perfekt für Automatisierung. Shell-Skripte eignen sich hervorragend, um wiederkehrende Aufgaben zu automatisieren.
- Bash-Skripte nutzen Pipelines und lassen dich andere Programme mühelos zusammenkleben. Es ist ein Kinderspiel, ein Skript zu schreiben, das die Ausgabe eines Befehls an einen anderen weiterleitet, oder ein Skript fehlschlagen zu lassen, sobald einer der ausgeführten Befehle fehlschlägt.
- Mächtig. Die Leichtigkeit, mit der sich andere Tools nutzen lassen, macht bash zu einem unglaublich mächtigen Werkzeug
jq
- Ideal, um JSON-Daten einfach und sauber zu extrahieren und zu bearbeiten (davon gibt es heutzutage reichlich). Ist zum De-facto-Tool für die Umwandlung von JSON-Daten geworden. Du kannst mit jq sogar JSON-Daten erzeugen
- Unterstützt Streaming von Daten, sodass du mit „unendlichen“ Daten ohne Speicherprobleme arbeiten kannst
- Der Schwerpunkt auf Pipelines ist für alle leicht zu verstehen, die mit Streams vertraut sind, etwa aus Unix-Tools. Außerdem lässt sich jq-Code dadurch ziemlich leicht nachvollziehen
Perl
- Berühmt für seine Knappheit und Ausdrucksstärke. Du brauchst sehr wenig Code, um viel zu erreichen
- Besonders gut für die Arbeit mit Text geeignet, vor allem wegen der mächtigen Unterstützung regulärer Ausdrücke. Besonders Perl 5 führte viele neue Funktionen ein (wie Rückwärtsreferenzen, benannte Capturing-Gruppen und faule Quantoren). Philip Hazel baute PCRE (Perl Compatible Regular Expressions), eine C-Bibliothek, die eine zu Perl 5 kompatible Engine für reguläre Ausdrücke implementiert. Selbst Sprachen, die nicht auf PCRE aufbauen, gestalten ihre Unterstützung regulärer Ausdrücke oft PCRE-kompatibel (und verwenden damit die Syntax von Perl 5)
Raku
- Unterstützt automatisches Threading von Junctions, was die Arbeit mit Parallelität deutlich erleichtert
- Unterstützt faule Auswertung, sodass du mit unendlichen Listen und Sequenzen arbeiten kannst, ohne auf Speicherprobleme zu stoßen. Das ist besonders nützlich bei großen Datenmengen oder bei Algorithmen, die unendliche Datenströme beinhalten
- Ideal für Textverarbeitung, mit einer einfacheren, lesbareren und mächtigeren Regex-Syntax
- Eingebaute Unterstützung für das Definieren eigener domänenspezifischer Sprachen (DSLs) mit Grammatiken. So kannst du Parser für bestimmte Datenformate oder Sprachen erstellen, was die Arbeit mit komplexen Textdaten erleichtert
Welche solltest du ausprobieren?
- Wenn du hauptsächlich ein Unix-System nutzt oder im DevOps-Bereich arbeitest, ist Bash eine unschätzbar wertvolle Sprache zum Lernen. Auch AWK, Perl oder Raku zu lernen kann sehr lohnend sein, wobei die ersten beiden auf vielen Systemen bereits vorinstalliert sind
- Wenn du mit JSON (oder XML/YAML/TOML) arbeitest, ist jq die naheliegende Wahl
- Wenn du Text verarbeiten willst, sind AWK, Perl und Raku die naheliegenden Kandidaten.
- Wenn du mal etwas anderes ausprobieren möchtest, ist 8th eine großartige Option