Einleitung
Hallo zusammen! Ich hoffe, dir geht es gut.
Das Jahr vergeht wie im Flug, und schon sind wir bei Mindshifting May, wahrscheinlich der Monat, auf den ich mich am meisten freue, vor allem, weil Prolog dabei ist!
Ich hoffe, Analytical April hat dir gefallen. Unglaublich viele haben mitgemacht, und ich glaube, es war einer der erfolgreichsten Monate bisher. Außerdem habe ich mich im April mit Simon Peyton Jones unterhalten, als verspätetes Interview zum Functional February. Das war wirklich toll, und ich empfehle dir auf jeden Fall, es dir noch einmal anzusehen, und sei es nur wegen des wunderschönen Satzes: „Wenn der Kalkstein der imperativen Programmierung verwittert ist, wird darunter der Granit der funktionalen Programmierung zum Vorschein kommen.“
Wie auch immer, weiter geht's mit Mindshifting May! Wie immer geben Erik und ich dir einen kurzen Überblick darüber, worum es in den Monaten geht und welche verschiedenen Sprachen wir erkunden werden.
Diesen Monat haben wir sage und schreibe sechs Sprachen: Ballerina, Pharo, Prolog, Red, Tcl (Tickle) und Unison. Jede dieser Sprachen unterscheidet sich deutlich von den eher „Mainstream“-Sprachen, also empfehlen wir dir, mehr als eine auszuprobieren, um ein Gefühl dafür zu bekommen, worin sie sich unterscheiden. Prolog empfehle ich auf jeden Fall, denn es ist eine der Sprachen, in denen ich in meinem Leben am liebsten programmiert habe. Erik ist außerdem sehr begeistert von Unison, also ist das auch eine gute Wahl zum Ausprobieren.
Die Badges
Um das Mindshifting May Badge zu bekommen, musst du im Mai 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. Wenn du dir das nach Mai ansiehst, kannst du diesen Teil jederzeit im Laufe des Jahres erledigen, du hast also nichts verpasst. Die Auswahl dieser Übungen war schwierig, weil die Sprachen alle so unterschiedlich sind. Deshalb haben wir uns für allgemeinere Übungen entschieden, die Spaß machen und bei denen es spannend ist, verschiedene Lösungsansätze zu erkunden.
- Akronym: einen Ausdruck in sein Akronym umwandeln
- Isogramm: prüfen, ob ein Ausdruck sich wiederholende Buchstaben enthält
- Römische Zahlen: eine Dezimalzahl in römische Zahlen umwandeln
- Regentropfen: eine Zahl in Regentropfenklänge umwandeln
- Weltraumzeitalter: berechnen, wie alt jemand auf den Planeten unseres Sonnensystems wäre
Diese Übungen und die der vorherigen Monate findest du alle auf der #12in23-Seite.
Überblicke
Tauchen wir ein und erkunden die Sprachen mit einem Überblick über jede einzelne.
Prolog:
- Eine andere Art zu denken. Ein Programm wird als eine Menge von Relationen definiert. Du „fragst“ dann die Relationsdatenbank ab, um mithilfe von Unifikation (Musterabgleich) Antworten zu finden. Perfekt für regelbasierte Systeme
- Wenig Syntax, nur einen Datentyp (Terme) und ein sprachliches Strukturelement (Klauseln). Klauseln bestehen vollständig aus Termen und können Fakten oder Regeln definieren.
- Sehr deklarativ. Du machst dir weniger Gedanken darüber, wie etwas berechnet wird, sondern mehr darüber, was berechnet werden soll. In vielen Fällen bedeutet das weniger Code
- Darauf ausgelegt, große Suchräume gut abzufragen. Verschiedene Suchstrategien (Tiefensuche, Breitensuche), unterstützt automatisches Beschneiden
Unison
- In Unison-Code gibt es keine Versionskonflikte! Eine Unison-Funktion kennt die Hashes ihrer Abhängigkeiten und kann so die richtige Version des Codes finden, die sie braucht.
- Unison unterstützt das Live-Durchsuchen von Code in der lokalen Entwicklungs-UI und in gehosteten Repositories, sodass du immer durchklicken und dir den Quellcode der Bibliotheken ansehen kannst, von denen du abhängst.
- Abilities sind eine Möglichkeit, „Effekte“ (z. B. IO) auf rein funktionale Weise zu verwalten
Pharo
- Sehr wenig Syntax, die gesamte Syntax passt auf eine Postkarte (nur 6 reservierte Wörter!). Die Nachrichtensyntax ahmt natürliche Sprachen nach, mit einem Subjekt, einem Verb und Ergänzungen (between: 1 and: 2 +). Auch die Semantik ist einfach (z. B. denkbar einfache Vorrangregeln). Das macht es leichter zu lernen und zu lesen
- Die Produktivität ist großartig, sobald man die anfängliche Lernkurve hinter sich hat. Dafür gibt es mehrere Gründe, darunter die einfache Semantik und die geringe Syntax, aber auch einige von Pharos herausragenden Merkmalen, die später erwähnt werden
- Läuft auf den meisten Plattformen (Windows, macOS, Linux + ARM-Unterstützung) auf einer schnellen virtuellen Maschine (OpenSmalltalk)
- Nicht nur eine Smalltalk-Implementierung, sondern wird noch aktiv weiterentwickelt (die neueste Smalltalk-Version ist Smalltalk-80 von 1980)
- Freundliche Community
Tcl (ausgesprochen „tickle“)
- Sehr wenig Syntax, nur 12 Regeln, und sie passt auf ein Blatt Papier. Auch die Semantik ist relativ geradlinig. Das macht Programme leicht zu lesen und zu lernen
- Einfache Nebenläufigkeit über Coroutinen, wodurch asynchroner Code wie synchroner Code geschrieben werden kann
- Eingebaute Ereignisschleife für Netzwerkprogrammierung und asynchrones Datei-I/O
- Ausgereift, aber entwickelt sich weiter
Ballerina
- Erstklassige Unterstützung für typsichere, deklarative Verarbeitung von JSON, XML und tabellarischen Daten mit sprachintegrierten Abfragen
- Flexible Typen, wobei strukturelle Typisierung (Duck-Typing) vorherrscht. Geschlossene Typen sind eine Möglichkeit, Subtypisierung umzusetzen, während offene Typen elegant mit zu vielen gesendeten Daten umgehen. Eingebaute Datenbindung und Validierung bei der Verwendung in HTTP-Ressourcen
- Eingebaute Unterstützung für gängige Integrationsmuster und Konnektoren, darunter verteilte Transaktionen, Kompensation und Circuit Breaker
- Jedes Ballerina-Programm lässt sich automatisch von jedem Open-Telemetry-Tool beobachten, was dir vollständige Kontrolle und Einsicht in Verhalten und Leistung des Codes gibt.
- Großartige Nebenläufigkeit über Strands, das sind leichtgewichtige Threads. Nicht blockierende IO-Aufrufe sind einfach. Der Compiler kann helfen, sendende und empfangende Aufrufe zwischen Workern zu prüfen und so Deadlocks zu vermeiden. Unveränderlichkeit ist auch für die Netzwerkprogrammierung großartig
- Explizite Fehlerbehandlung über Union-Typen und den syntaktischen Zucker
check, der dabei hilft
Red
- Leichtgewichtig. Die gesamte Toolchain ist ein Download von etwa 1,5 MB, eine einzige ausführbare Datei.
- Portabel. Einfache Cross-Kompilierung. Erzeugt kleine Binärdateien ohne Abhängigkeiten. Geringer Speicherbedarf.
- Red ist seine eigene Metasprache und sein eigenes Datenformat (wie Lisp). Programme können Code umwandeln und lesen.
- Reaktiv: Objekte können verknüpft werden, um Größe und Komplexität des Programms zu verringern (denk an Excel-Tabellen)
Wo werden diese Sprachen eingesetzt?
Prolog:
- Künstliche Intelligenz (IBMs Watson)
- (Natürliche) Sprachverarbeitung
- Verteiltes Datenbanksystem für Wissensbasen (TerminusDB)
- Sogar verwendet, um die Typreregeln der Java Virtual Machine zu spezifizieren
Unison
- Wird zum Schreiben verteilter Systeme verwendet
- Allgemeine Webdienste
- Batch-Computing-Jobs
Pharo
- Wird für interaktive Werkzeuge verwendet
- Wird in sehr unterschiedlichen Bereichen eingesetzt: Online-Handelsplattform und cloudbasiertes Tool für Investmentmanagement
- Prototyping von Benutzeroberflächen und Interaktion in der Verteidigungsindustrie
- Webbasierte Anwendung für Eventplanung
- Tool für Moldable Development zum Erkunden von APIs, Daten und Systemen
Tcl
- Wird als Glue-Code oder eingebettet verwendet
- Wird in den GUIs von CISCO-Routern verwendet
- Verschiedene Fertigungssysteme
- Die NASA hat es viele Male verwendet
- Weitere große Unternehmen sind Pixar, Boeing, Intel, NBC und viele mehr.
- Tk, das Windowing-Toolkit, wurde von anderen „Scripting“-Sprachen wie Perl/Python/Ruby übernommen.
- Expect, ein Tool zur Automatisierung interaktiver Kommandozeilen-Anwendungen
Ballerina
- Einsatz für Cloud-Native-Anwendungen
- Wird von MOSIP verwendet, einer Plattform für grundlegende Identität, die Regierungen und anderen Organisationen hilft, digitale und grundlegende Identitätssysteme kosteneffizient umzusetzen.
Was macht diese Sprachen aus Programmierperspektive interessant?
Prolog:
- Logikprogrammiersprache (eine der ersten), die ihr eigenes Paradigma darstellt (wie OOP und funktionale Programmierung)
- Dynamisch typisiert
Unison
- Rein funktionale Sprache
- Statisch typisiert
Pharo
- Objektorientierte Sprache, aber im Smalltalk-Sinn. Anders als „normale“ objektorientierte Sprachen: keine Konstruktoren, keine Typdeklarationen, keine Interfaces, keine primitiven Typen.
- Dynamisch typisiert
Tcl
- Multiparadigmatisch: objektorientierte, imperative und funktionale Stile werden unterstützt
- Dynamisch typisiert
Ballerina
- Multiparadigmatisch: objektorientiert, funktional und deklarativ
- Statisch typisiert
Red
- Multiparadigmatisch: imperativ, funktional, objektorientiert, symbolisch, reaktiv
- Statisch typisiert
Was sind ihre herausragenden Merkmale?
Prolog:
- Flexibel. Viele eingebaute Prädikate funktionieren in mehrere Richtungen. Man kann Daten mit derselben Syntax abfragen und erzeugen. Manche Probleme, die in anderen Sprachen schwierig sind, werden trivial
- DCG ist wie ein eingebauter Parser-Kombinator, der sich hervorragend zum Parsen, Erzeugen, Vervollständigen und Prüfen von Sequenzen eignet
- CLP ist eine effiziente Möglichkeit, ein Programm anhand von Constraints zu definieren
Unison
- Code ist kein Text, sondern (unveränderliche) Daten. Code wird in einer Datenbank gespeichert und über den Unison Codebase Manager abgerufen und aktualisiert. Textdateien sind nur eine Möglichkeit, Code in die Datenbank zu bekommen. Unveränderliche Daten bedeuten außerdem, dass Testergebnisse zwischengespeichert werden können und dass die Typprüfung nur einmal erfolgen muss
- Definitionen werden über ihren Hash referenziert, nicht über ihren Namen. Das nennt man „content-addressed“ Code. Der Syntaxbaum einer Definition bestimmt ihren Hash. Keine Versionskonflikte, Umbenennungen sind trivial.
- Unison-Dokumentationen sind eine erstklassige Entität in der Sprache und immer mit den Funktionen synchron, die sie beschreiben. Du kannst Live-Beispiele darin einbetten und sicherstellen, dass dein Beispielcode kompiliert.
- Ideal für Cloud-Computing: Es gibt keine Builds, Funktionen können spontan verteilt werden, und man verbringt weniger Zeit damit, Encoder und Decoder für die Kommunikation zwischen Unison-Diensten zu schreiben.
Pharo
- Geradliniges Ausführungsmodell: Alles ist ein Objekt, und die Ausführung erfolgt ausschließlich über Nachrichten (die ebenfalls Objekte sind). Sogar Kontrollfluss geschieht über Nachrichten. Das Modell ist einfach, aber sehr mächtig. Ganz anders als andere objektorientierte Sprachen.
- Dein Code liegt in einem Pharo-Image, nicht in Textdateien. Ein Pharo-Image enthält den gesamten Zustand deiner Anwendung und kann in einer Pharo-Virtual-Machine ausgeführt werden. Wenn du deine Arbeit speicherst, speichert Pharo den gesamten Zustand der Umgebung als Image-Datei. Diese Datei enthält alle Objekte, ihre Beziehungen und den Ausführungskontext. Die Image-Dateien lassen sich mit anderen teilen und auf verschiedenen Rechnern oder Plattformen laden. So können Entwickler einfach an einem Projekt zusammenarbeiten oder in Pharo erstellte Anwendungen verteilen
- Live und immersiv, sofortiges Feedback zur Laufzeit über die Pharo-spezifische IDE. Führe dein Programm aus und ändere es im laufenden Betrieb, sogar während es läuft! Leistungsstarker Debugger, der das Neustarten von Methoden und das Beheben von Bugs im laufenden Betrieb unterstützt
Tcl
- Geradliniges Typsystem: Alles ist ein String. „Alles ist ein String“ war früher die Art, wie Tcl implementiert wurde. Heute gibt es unter der Haube ein robustes Typsystem, bei dem die Tcl-Entität (egal ob String, Gleitkommazahl, Liste oder Wörterbuch) sowohl eine typspezifische Darstellung als auch eine String-Darstellung hat. Das verbessert die Leistung von Tcl-Code erheblich, da keine Hin- und Her-Konvertierung von Strings mehr nötig ist.
- „Alles läuft als Kommandos“. Es gibt keine eingebauten Kommandos. Tcl bringt eine „Standardbibliothek“ von Kommandos mit, darunter if und while usw. Es ist sehr einfach, neue Kontrollfluss-Kommandos hinzuzufügen: zum Beispiel eine until-Schleife. Auch das Überschreiben von Tcl-Kommandos ist einfach.
- Aufgrund der Kompaktheit, der einfachen Semantik und der Umsetzung als C-Bibliothek leicht einzubetten
Ballerina
- Cloud-Native. Eingebaute Konvertierungen von JSON in benutzerdefinierte Typen. Superleichte Syntax zum Erstellen von (Micro-)Services. Eingebaute nebenläufige Ausführung von Services. Unterstützt HTTP (1 und 2), GraphQL und gRPC von Haus aus
- Automatisch generierte Artefakte, um deinen Code in verschiedenen Clouds auszurollen. Diese Artefakte können Dockerfiles, Docker-Images, Kubernetes-YAML-Dateien oder Serverless-Funktionen sein.
- Eingebaute Visualisierung von Code als Sequenzdiagramme. Ideal, um den Ablauf des Codes zu visualisieren. Kann sogar HTTP-Aufrufe visualisieren
Red
- Ideal zum Erstellen und Parsen domänenspezifischer Sprachen und „Dialekte“ (Rebol-Terminologie). Mehrere eingebaute Dialekte:
- Red/System: eine Systemprogrammiersprache auf C-Niveau, die zu nativem Code kompiliert wird
- Parse: ein leistungsstarker PEG-Parser
- VID: ein einfacher Dialekt zur Erstellung von GUI-Layouts
- Draw: ein Dialekt für 2D-Vektorzeichnungen
- Rich-text: ein Dialekt zur Beschreibung von Rich Text
- Einfache GUIs. Vollständig plattformübergreifend und nativ. Unterstützt Zwei-Wege-Bindung, Live-Aktualisierung, Events und bietet Zugriff auf die Funktionen des Betriebssystems
Welche sollte man im Mai ausprobieren?
Sie sind alle auf ihre eigene Weise interessante Sprachen, also lässt sich für jede von ihnen argumentieren.
- Wenn du dich für Cloud-Computing interessierst, sind Ballerina und Unison tolle Optionen. Auch Tcl hat großartige Nebenläufigkeits-Funktionen
- Wenn du mit objektorientierter Programmierung vertraut bist, aber eine andere Sicht darauf kennenlernen möchtest, probier Pharo aus
- Wenn du erleben möchtest, wie es ist, in einer Sprache zu programmieren, die nicht auf Textdateien basiert, probier entweder Pharo mit seiner einzigartigen und leistungsstarken IDE aus oder Unison mit dem Unison Codebase Manager.
- Wenn du Minimalismus magst, haben Tcl, Prolog, Pharo und Red alle recht wenig Syntax und eine relativ einfache Semantik
- Wenn du eine interessante Mischung von Paradigmen sehen möchtest, unterstützen Ballerina, Tcl und Red alle unterschiedliche Paradigmen
- Wenn du eher ungewöhnliche Paradigmen ausprobieren möchtest, probier Prolog für logische Programmierung, Red für reaktive Programmierung und Ballerina für deklarative Programmierung
- Wenn du funktionale Programmierung magst, schau dir Unison an, insbesondere seine Abilities.
- Wenn du dich für Metaprogrammierung interessierst, haben Tcl, Prolog, Pharo und Red alle großartige Unterstützung
Wenn du natürlich die Zeit hast, würde ich dir empfehlen, ein paar davon auszuprobieren! Sie sind alle ziemlich einzigartig. Löse dieselbe Übung in ein paar der vorgestellten Sprachen und schau, wie unterschiedlich die Umsetzung ist.