Faktor (Programmiersprache) – Wikipedia

Faktor ist eine stapelorientierte Programmiersprache, die von Slava Pestov erstellt wurde. Factor ist dynamisch typisiert und verfügt über eine automatische Speicherverwaltung sowie leistungsstarke Metaprogrammierungsfunktionen. Die Sprache verfügt über eine einzige Implementierung mit einem selbst gehosteten Optimierungscompiler und einer interaktiven Entwicklungsumgebung. Die Faktorverteilung enthält eine große Standardbibliothek.

Geschichte[edit]

Slava Pestov schuf Factor 2003 als Skriptsprache für ein Videospiel.[1] Die anfängliche Implementierung, die jetzt als JFactor bezeichnet wird, wurde in Java implementiert und auf der Java Virtual Machine ausgeführt. Obwohl die frühe Sprache in Bezug auf die Syntax oberflächlich dem modernen Faktor ähnelte, unterscheidet sich die moderne Sprache in praktischer Hinsicht stark und die aktuelle Implementierung ist viel schneller.

Die Sprache hat sich im Laufe der Zeit erheblich verändert. Ursprünglich konzentrierten sich Faktorprogramme auf die Bearbeitung von Java-Objekten mit den Reflexionsfunktionen von Java. Von Anfang an bestand die Designphilosophie darin, die Sprache an die darin geschriebenen Programme anzupassen. Als die Faktorimplementierung und die Standardbibliotheken detaillierter wurden, wurde die Notwendigkeit bestimmter Sprachfunktionen klar und sie wurden hinzugefügt. JFactor hatte kein Objektsystem, in dem Sie Ihre eigenen Klassen definieren konnten, und frühe Versionen von nativem Faktor waren dieselben. Die Sprache war auf diese Weise dem Schema ähnlich. Heute ist das Objektsystem ein zentraler Bestandteil von Factor. Andere wichtige Sprachfunktionen wie Tupelklassen, Kombinator-Inlining, Makros, benutzerdefinierte Parsing-Wörter und das moderne Vokabelsystem wurden nur stückweise hinzugefügt, als ihre Nützlichkeit klar wurde.

Die Fremdfunktionsschnittstelle war seit sehr frühen Versionen von Factor vorhanden, und in JFactor gab es ein analoges System. Dies wurde gewählt, anstatt ein Plugin für den C-Teil der Implementierung für jede externe Bibliothek zu erstellen, mit der Factor kommunizieren soll, und hat den Vorteil, dass es deklarativer, schneller zu kompilieren und einfacher zu schreiben ist.

Die Java-Implementierung bestand ursprünglich nur aus einem Interpreter, später wurde jedoch ein Compiler für Java-Bytecode hinzugefügt. Dieser Compiler hat nur an bestimmten Prozeduren gearbeitet. Die Java-Version von Factor wurde durch eine in C und Factor geschriebene Version ersetzt. Anfangs bestand dies nur aus einem Interpreter, aber der Interpreter wurde durch zwei Compiler ersetzt, die in verschiedenen Situationen verwendet wurden. Im Laufe der Zeit ist die Faktorimplementierung erheblich schneller gewachsen.[2]

Beschreibung[edit]

Factor ist eine dynamisch typisierte, funktionale und objektorientierte Programmiersprache. Code besteht aus kleinen Prozeduren, die als Wörter bezeichnet werden. Im typischen Code sind diese 1 bis 3 Zeilen lang, und eine Prozedur mit mehr als 7 Zeilen ist sehr selten. Etwas, das idiomatisch mit einer Prozedur in einer anderen Programmiersprache ausgedrückt würde, würde als mehrere Wörter in Factor geschrieben.[3]

Jedes Wort hat eine feste Anzahl von Argumenten und eine feste Anzahl von Rückgabewerten. Argumente zu Wörtern werden in umgekehrter polnischer Notation auf einem Datenstapel übergeben. Der Stapel wird nur zum Organisieren von Wortaufrufen und nicht als Datenstruktur verwendet. Der Stapel in Faktor wird auf ähnliche Weise wie der Stapel in Forth verwendet. Aus diesem Grund werden beide als Stapelsprachen betrachtet. Im Folgenden finden Sie beispielsweise einen Codeausschnitt, der “Hallo Welt” in den aktuellen Ausgabestream druckt:

"hello world" print

print ist ein Wort in der io Vokabular, das eine Zeichenfolge aus dem Stapel nimmt und nichts zurückgibt. Es druckt die Zeichenfolge in den aktuellen Ausgabestream (standardmäßig das Terminal oder den grafischen Listener).[3]

Nicht alle Daten müssen nur mit dem Stack weitergegeben werden. Mit lokalen Variablen mit lexikalischem Gültigkeitsbereich können Sie in einer Prozedur verwendete Provisorien speichern und darauf zugreifen. Variablen mit dynamischem Gültigkeitsbereich werden verwendet, um Dinge zwischen Prozeduraufrufen zu übergeben, ohne den Stapel zu verwenden. Beispielsweise werden die aktuellen Eingabe- und Ausgabestreams in Variablen mit dynamischem Gültigkeitsbereich gespeichert.[3]

Faktor betont Flexibilität und die Fähigkeit, die Sprache zu erweitern.[3] Es gibt ein System für Makros sowie für die willkürliche Erweiterung der Faktorsyntax. Die Syntax des Faktors wird häufig erweitert, um neue Arten von Wortdefinitionen und neue Arten von Literalen für Datenstrukturen zu ermöglichen. Es wird auch in der XML-Bibliothek verwendet, um eine Literal-Syntax zum Generieren von XML bereitzustellen. Das folgende Wort nimmt beispielsweise eine Zeichenfolge und erzeugt ein XML-Dokumentobjekt, bei dem es sich um ein HTML-Dokument handelt, das die Zeichenfolge hervorhebt:

 : make-html ( string -- xml )
    dup