Limbo (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Limbo
Erscheinungsjahr: 1995
Entwickler: Sean Dorward, Phil Winterbottom, Rob Pike
Beeinflusst von: C, Pascal, CSP, Alef, Newsqueak
Beeinflusste: Stackless Python, Go, Rust
Betriebssystem: Inferno
Vitanuova.com

Limbo ist eine höhere Programmiersprache, die im Betriebssystem Inferno zur Programmierung von Anwendungsprogrammen verwendet wird. Am Design der Sprache beteiligten sich bekannte Entwickler aus der Unix-Welt wie z. B. Rob Pike und Dennis Ritchie, der schon die erfolgreiche Programmiersprache C entwickelte.

Limbo wird in Bytecode übersetzt, der auf jeder Maschine, unabhängig vom Prozessortyp, ausgeführt werden kann. Limbo-Programme sind Module, die andere Limbo-Module in Limbo laden und deren Funktionalität verwenden können. Module werden vom Betriebssystem Inferno bei Bedarf geladen und später wieder entfernt.

Limbo ist eine streng typisierte Sprache, die auf den ersten Blick der Programmiersprache C ähnelt. Die Schöpfer von Limbo behaupten, dass sie die Möglichkeiten von Java und C++ bietet, jedoch wesentlich einfacher zu erlernen und zu beherrschen sei. Sie unterstützt wenige, genau definierte Datentypen, zum Beispiel vorzeichenlose 8-Bit Zeichen und 32 Bit Integer mit Vorzeichen. Sie unterstützt Parallelbearbeitung. Daneben existieren Kommunikationskanäle als Datentypen.

Limbo und das Betriebssystem Inferno

[Bearbeiten | Quelltext bearbeiten]

Das Betriebssystem Inferno verwendet Dateinamen für nahezu alles: Prozessinformationen, Netzwerkverbindungen, Pipes usw. Dateinamen sind Verweise auf mit dem Protokoll Styx erreichbare Dateien, Ressourcen und Geräte. Es spielt keine Rolle, ob diese lokal oder nur über das Netzwerk erreichbar sind. Limbo verwendet diese Dateinamen für die Kommunikation mit der Außenwelt. Dabei kann ein Limbo-Modul eine Datenstruktur erzeugen, die über Styx kommuniziert. Die Methoden und Funktionen eines Moduls werden von diesem in Styx umgesetzt. Dies braucht ein Programmierer jedoch nicht zu wissen. Er muss nur die abstrakten Methoden eines Moduls kennen, ohne genau zu wissen, wie diese auf das niedrigere Styx-Protokoll umgesetzt werden.

Referenzzähler und automatische Speicherbereinigung

[Bearbeiten | Quelltext bearbeiten]

Zeiger werden durch Referenzen ersetzt, die die referenzierten Strukturen dynamisch allozieren und deallozieren. Dazu werden sowohl Referenzzähler, als auch eine automatische Speicherbereinigung (garbage collection) eingesetzt. Durch die Referenzzähler ist garantiert, dass nach Aufgeben der letzten Referenz die Datenstruktur auch freigegeben wird. Dies ist wichtig, wenn die Struktur andere Ressourcen wie offene Dateien enthält, die spätestens beim Freigeben geschlossen werden.

Verwendet man ausschließlich die automatische Speicherbereinigung, so kann die Freigabe verzögert, gegebenenfalls auch gar nicht vor Programmende durchgeführt werden. Der Zeitpunkt der Freigabe ist nicht vorhersagbar. Referenzzähler dagegen geben zyklische Datenstrukturen wie Ringlisten, Bäume mit Rückwärtsreferenzen usw. nicht zuverlässig frei. Es können Strukturen übrig bleiben, die niemals freigegeben werden, weil sie sich gegenseitig referenzieren, auf die aber auch nicht mehr zugegriffen werden kann.

Limbo verwendet eine einfache Methode, zyklische Datenstrukturen normalerweise auszuschließen: Wenn in der Definition eine Referenz auf eine Datenstruktur auftaucht, bevor die eigentliche Struktur bekannt ist, darf die Struktur nur insgesamt, jedoch keine Teile daraus dereferenziert werden. Damit können keine zyklischen Datenstrukturen erzeugt werden. Referenzzähler sorgen dann dafür, dass die Struktur beim letzten Auftreten der Referenz und damit zu einem genau vorhersagbaren Zeitpunkt freigegeben wird.

Das Schlüsselwort cyclic hebt die Restriktion auf und erlaubt die Definition aller Datenstrukturen. Zur Freigaben von diesen Strukturen wird eine automatische Speicherbereinigung verwendet.

implement Command;

include "sys.m";
    sys: Sys;

include "draw.m";

include "sh.m";

init(nil: ref Draw->Context, nil: list of string)
{
    sys = load Sys Sys->PATH;
    sys->print("Hallo Welt!\n");
}
  • Alef ist ein direkter Vorgänger von Limbo und wurde in der Forschungs- und Entwicklungsabteilung von Bell Labs entworfen.