Dfinity 26.08.2020, 10:00 Uhr

Motoko: Programmiersprache für den "Internet-Computer"

Der Internet-Computer lässt sich mit Wasm programmieren. Mit Motoko wurde eine spezielle Programmiersprache entwickelt, die das Programmiermodell des Internet-Computers direkt unterstützt und es erlaubt auch die ungewöhnlicheren Funktionen dieser Plattform zu nutzen.
(Quelle: sdk.dfinity.org)
Dfinity baut den Internet-Computer auf: eine dezentrale Cloud-Computing-Plattform, die als nahtloses Software-Universum konzipiert wird, in dem Entwickler Anwendungen und Dienste direkt im Internet bereitstellen können.
Der Internet-Computer ist eine dezentralisierte Cloud-Computing-Plattform, die sichere Software und eine neue Art von offenen Internet-Diensten beherbergen soll. Er verwendet ein starkes kryptographisches Konsensprotokoll, um Berechnungen über ein Peer-to-Peer-Netzwerk von (potenziell nicht vertrauenswürdigen) Rechenknoten sicher zu replizieren, möglicherweise überlagert mit vielen virtuellen Teilnetzen (mehr dazu).
Um diese Vision zu verwirklichen, hat sich Dfinity für WebAssembly als Lingua franca der Ausführungsumgebung der Plattform entschieden, so dass Entwickler sie in jeder Sprache programmieren können, die sich zu WebAssembly kompilieren lässt.
Das ist jedenfalls die Theorie. In der Praxis ist die Portierung einer bestehenden Programmiersprache auf Wasm nicht ganz trivial, weil dazu die Implementierung eines neuen Compiler-Backends erforderlich ist und außerdem die Portierung des Laufzeitsystems der Sprache und der Bibliotheksprimitive. Und es gibt immer noch ein paar Funktionen, insbesondere solche, die für Hochsprachen relevant sind, die derzeit nicht ohne weiteres in Wasm implementiert werden können – zum Beispiel: Threads, Coroutines, Exceptions und Tail Calls.

Motoko

Aus diesem und etlichen weiteren Gründen hat sich Dfinity entschlossen, eine weitere Sprache zu schaffen, Motoko. Ziel war eine Sprache, die sicher und einfach zu benutzen ist und die Konzepte der Plattform nahtlos offenbart, sowie eine, die für die meisten Programmierer ausreichend freundlich und zugänglich aussieht.
In Motoko ist zum Beispiel jedes Konstrukt ein Ausdruck, es hat closures, es hat variant types und statisch geprüfte Musterabgleiche, es hat Garbage Collection, und ein flexibles Typensystem, das die Abwesenheit bestimmter Fehler wie Abstürze, undefiniertes Verhalten, Fehlinterpretation von Daten oder einfach das Fehlen eines Falles in einem Schalter garantieren soll.
Gleichzeitig hat Dfinity versucht auf einer Fülle von praktischen und theoretischen Erfahrungen aufzubauen. So können Zahlen standardmäßig nicht überlaufen, Locals sind standardmäßig unveränderlich (immutable), die gleichzeitige Ausführung ist standardmäßig atomar, Null kann standardmäßig nicht auftreten, Felder sind standardmäßig privat und so weiter. Außerdem gibt es keine Vererbung, nur Subtyping.
Zentrales Element von Motoko ist die direkte Unterstützung für Actors, sowohl in der Syntax als auch im Type System. Das Actor-Modell ist ein über 40 Jahre altes Konzept, das es kaum in die Mainstream-Sprachen geschafft hat. Ein Actor ist wie ein Objekt (und sieht in der Motoko sogar wie eines aus), da es den privaten Status kapselt, zusammen mit einer Reihe von Methoden zur Verarbeitung von Nachrichten, die an ihn gesendet werden können. Aber alle gesendeten Nachrichten sind asynchron. Folglich haben Actor-Methoden im Gegensatz zu herkömmlichen Methoden keine Ergebnisse. Außerdem werden alle Nachrichten sequentiell von einem Akteur empfangen, das heißt er verfügt über eine implizite Nachrichtenwarteschlange, und die Methoden werden atomar ausgeführt, selbst wenn Nachrichten gleichzeitig gesendet werden.
Actors sind ein gutes Modell für die nebenläufige Programmierung, weil sie automatisch Race Conditions (dank Atomarität und gekapseltem Zustand) und Deadlocks (weil die Ausführung nie blockiert) verhindern und somit viele Gleichzeitigkeitsfehler ausschließen. Actors sind auch ein geeignetes Modell für die verteilte Programmierung, da die Asynchronität mit der Latenz beim Senden einer Nachricht an einen potenziell entfernten Empfänger zu tun hat. Und schließlich eignen sich Actors bestens für den Internet-Computer von Dfinity, wo Anwendungen in Form von so genannten Kanistern (canisters) bereitgestellt werden. Ein Motoko-Akteur kompiliert zu einem Wasm-Modul, in dem die Methoden zu exportierten Wasm-Funktionen mit speziellen, von der Plattform definierten Parameterkonventionen werden.
Kurz gesagt, eine Anwendung in Motoko ist ein Akteur (oder mehrere), der wiederum ein großes asynchrones Objekt ist, das in ein Wasm-Modul kompiliert wird. Mit Wasms Begriff des Speichers kann ein solcher Akteur sofort bis zu 4 GByte des internen Zustands verwalten, obwohl dies durch die Verknüpfung mehrerer Wasm-Module, die jeweils über eigenen Speicher verfügen, noch erweitert werden kann.

Futures

Um das asynchrone Programmieren bequemer zu machen und es in sequentiellem "direkten Stil" ausdrücken zu können, übernimmt Motoko eine weitere, über 40 Jahre alte Idee aus den Annalen der Programmiersprachenforschung, die allerdings glücklicherweise in letzter Zeit etwas populärer geworden ist: Futures (in einigen Gemeinschaften auch promises genannt). In Motoko materialisieren sie sich in Form von "async values", Werte vom Typ 'async', die durch Ausdrücke erzeugt werden, denen das Schlüsselwort 'async' vorangestellt ist.
Damit ist es Akteursmethoden erlaubt, schließlich doch Ergebnisse zu haben, solange es sich um Futures handelt. Futures können abgewartet werden, um ihren Wert zu erhalten, aber nur innerhalb eines anderen asynchrone Ausdrucks. Mehr zum Internet-Computer und zu Motoko erfahren Sie bei dfinity und in diesem Blogbeitrag von dfinity-Mitarbeiter Andreas Rossberg. Infos zum Motoko-SDK gibt's hier und die GitHub-Seite zu Motoko hier.


Das könnte Sie auch interessieren