Zum Inhalt springen

Factor

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 10. März 2009 um 16:10 Uhr durch Walter Smr (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Factor ist eine freie Programmiersprache die seit 2003 von Slava Pestov entworfen und entwickelt wird. Sie übernimmt Konzepte aus Forth, Lisp und Smalltalk. Sie ist als praxisorientierter Nachfolger von Joy gedacht und eine Implementierung ist unter BSD-Lizenz erhältlich.

Words und Stack

Alle Funktionen lesen ihre Argumente vom Stack, schreiben ihre Ergebnisse auf den Stack und werden als words bezeichnet. Ein Programm ist eine Abfolge von Lexikalen für Objekte die auf den Stack abgelegt werden und words die auf den Stack angewendet werden.

! Kommentar
2 3 + .

Zuerst werden 2 und 3 auf den Stack abgelegt. + nimmt zwei Zahlen vom Stack und legt die Summe der beiden auf dem Stack ab. . nimmt das oberste Objekt vom Stack und gibt es aus. Kommentare beginnen mit ! und gehen bis zum Ende der Zeile.

: add2 2 + ;
5 add2

Neue words werden mit : definiert. add2 addiert 2 zur obersten Zahl auf dem Stack.

Words werden in vocabularies zusammengefasst. Mit USE: wird angegeben, in welchem vocabulary words gesucht werden sollen und mit IN: in welchem vocabulary alle folgend definierten words gespeichert werden.

Es können beliebige Objekte wie Zahle, Sequences (Arrays, Vectors, Strings, ...) usw. auf dem Stack abgelegt werden. Für alle Objektarten ist eine lexikalische Darstellung definiert.

SYMBOL: foo
"Hello" foo set
foo get

Namen für Variable werden mit SYMBOL: definiert, mit set gesetzt und mit get ausgelesen und auf den Stack abgelegt. Speicher für die Objekte wird automatisch alloziert und durch die Garbage Collection wieder freigegeben.

Funktionales Programmieren

Anonyme Funktionen werden in eckigen Klammern geschrieben und als quotations bezeichnen.

{ 1 2 3 } [ 3 + ] map
10 [ "Hello world" print ] times
4 [ 2 + ] [ 3 * ] bi
10 0 < [ "yes" print ] [ "no" print ] if

map nimmt ein Array und eine quotation vom Stack. Die quotation wird auf jedes Element des Arrays ausgeführt und die Ergebnisse wieder in einem Array auf dem Stack abgelegt. times nimmt eine Zahl n und eine quotation vom Stack. Die quotation wird dann n-mal hintereinander ausgeführt. bi nimmt eine Objekt und zwei quotations vom Stack. Beide quotations werden auf das Objekt angewendet und die beiden Ergebnisse auf dem Stack abgelegt. if nimmt eine Boolean und zwei quotations vom Stack. Ist die Boolean true wird die erste quotation ausgeführt, bei false die zweite quotation.

Objektorientierung

Bei der Objektorientierung übernimmt Factor Konzepte aus Common Lisp Object System. Klassen und Methoden werden unabhängig voneinander definiert.

TUPLE: rectangle width height ;
: <rectangle> rectangle boa ;

GENERIC: area
M: rectangle area [ width>> ] [ height>> ] bi * ;

10 20 <rectangle> area

Zur Datenkapselung wird eine Tuple-Klasse mit dem Namen rectangle und den beiden Slots width und height definiert. Das darauf folgend definierte construction-word <rectangle> liest zwei Object vom Stack und belegt die beiden Slots damit. Die für rectangle definierte Methode area nimmt ein rectangle-Objekt vom Stack und berechnet die Fläche. Liegt ein Objekt auf dem Stack können mit slot>> die Daten ausgelesen und mit >>slot die Daten in ein Tuple-Objekt geschrieben werden.

Libary

In Factor ist eine umfassende Bibliothek mit vordefinierten Funktionen enthalten. Für Erweiterungen existiert eine Schnittstelle zu C Bibliotheken.

Listener

Der Listener ist die interaktive Entwicklungsumgebung von Factor. Alles was man eingibt wird eingelesen, compiliert und gegebenenfalls gleich ausgeführt. Mit Control-h gelangt man zu einer umfassenden Hilfe und mit Control-w kann man jede Zeile im Single-Step-Verfahren schrittweise durchlaufen. Alle zur Zeit im Speicher befindlichen Definitionen und der compilierte Code werden mit save in einer Image-Datei gespeichert.

Implementierung

Die VM von Factor ist in C geschrieben. Der größte Teil von Factor, wie der Parser und der Compiler sind selbst in Factor geschrieben. Es existieren Implementierung für FreeBSD, Linux, Mac OS X und Windows sowie die Prozessoren x86, x86-64 und PowerPC. Am Anfang des Projektes gab es auch eine in Java geschriebene VM, die aus Gründen technischer Unterlegenheit (vor allem Geschwindigkeit) und des erhöhten Aufwandes zwei Versionen pflegen zu müssen, eingestellt wurde. Die Implementierung für ARM-Prozessoren ist zur Zeit nicht mehr auf dem aktuellen Stand.

Self-Hosting

Da Factor hauptsächlich selbst in Factor geschrieben ist, muss zuerst das Basissystem mit einem Boot-Image erstellt werden. Ein passendes Boot-Image findet man unter factorcode.org.

factor -i=boot.<cpu>.image

Das dabei erstellte factor.image ist vom System abhängig und enthält das bei jedem Start geladene Basissystem von Factor.