Introduktion til Factor

Tags:    programmering


Her vil jeg give en introduktion til programmerinssproget Factor.

Factor har en lille kerne i C, men ellers er alt Factor skrevet i Factor. Factor er ca. 5 år gammel men har allerede et stort bibliotek og er pænt hurtig. Factor er stakbaseret, men i modsætning til mange andre stakbaserede sprog (f.eks. Forth) er Factor høj-niveau. Den er en Garbage Collector, optimiserende compiler, og en ikke optimiserende compiler når man skriver sin kode i listeneren som vil blive nævnt senere. Den har en nem binding til C (FFI); med en linie kan man lave en binding til en C funktion. Den har et objekt-orienteret system, omend lidt anderledes end det man er vant til hvis man kommer fra C++, Java eller lign.. Den støtter de mest populære platforme som Windows, Linux og Mac. Man kan 'deploye' sin applikationer så de kan køre uden Factor installeret. Kort sagt man kan bruge Factor til de samme projekter som man kan med andre sprog som C#, Java osv..

For at gøre det nemmere at følge med i den følgende introduktion anbefales det at du henter Factor her http://www.factorcode.org/. Hvis du bruger en 32bit platform så hent den ud for x86 (lige pt. er der ingen 64bit til windows så hent 32bit). Jeg bruger x86 Windows versionen (som fylder 20,3MB) men det burde ikke give nogen problemer med at følge denne introduktion. Factor kræver ingen installation, blot udpakning af den fil du henter. Udpak den et sted hvor du ved du kan finde den igen. Inde i mappen du udpakker ligger der en ekserkverbar fil kaldet factor.exe (på windows), start den. Det der gerne skulle komme frem nu er listeneren. Her kan man interaktivt teste sin kode og køre den. Man kan se information om objekter på stakken ved at klikke på dem og en inspector vindue kommer frem. Ved at trykke på F1 kan man få browseren frem, hvor man kan se dokumentation samt søge i den.

Factor er stakbaseret. Dette betyder at værdier ligger i en stak. Det kan sammenlignes med en liste (array, vector osv.) hvor man kun kan tage fra toppen. Der er dog måde at manipulere data der er dybere i stakken. Dette er den primære måde at føre data rundt i ens program på. Man kan godt binde data til variabler som man er vant fra andre sprog, int tal = 20;. Men dette betragtes ikke som god stil, og når man er blevet vant til Factor vil jeg vove at sige det ligefrem komplikerer ens kode og derfor om muligt (hvilket det er 99% af tiden) bør undgås. På stakken kan man udføre operationer. Dette gøres typisk med words som minder meget om funktioner. Et word tager nogle værdier fra stakken og gør noget med dem. Factor bruger postfix notation. Fra andre sprog er du typisk vant til infix notation når du bruger de simple aritmetiske operatorer. Infix er når du skriver 5 + 4. Factor er som nævnt postfix (post betyder efter), og her skriver du 5 4 +. Nogle sprog har prefix hvor du skriver + 5 4. Lads os se lidt på hvordan man arbejder med stakken. Det der står efter (scratchpad) er det der skal skrives i listeneren, og der kan være flere steder der skal skrives noget i de eksempler jeg giver. Tryk enter når linien slutter.:

Fold kodeboks ind/udKode 


Som det kan ses behøver man ikke skrive en ting ad gangen. Faktisk kunne vi skrive alt dette i en linie hvis vi ville. drop er et af de words der kaldes shuffle words. Shuffle betyder at blande, så det er words som blander. De ændrer på rækkefølgen og højden af stakken. Højden er hvor mange objekter der er på stakken. Før vi skrev drop var der et objekt på stakken. Før vi skrev minus var der 2 (1 og 1). Rækkefølgen af stakken kan som nævnt også ændres. Hvis vi har følgende stak:

Fold kodeboks ind/udKode 


Så er 3 det øverste element. 2, er det andenøverste element og 1 er det tredje og sidste element. Hvis vi skrev + nu ville den tage de to øverste 2 og 3 og lægge dem sammen til 5 og putte 5 øverst på stakken og der ville stå 1 5. Men i stedet ville jeg vise nogle shuffle words. Her er nogen af dem, og hvad deres mnemonic står for, af dem jeg kan gætte mig frem til:

dup - duplicate - kopier - ( x -- x x )
2dup - duplicate - kopier 2 - ( x y -- x y x y )
drop - smid - ( x -- )
2drop - smid 2 - ( x y -- )
nip - ( x y -- y )
2nip - ( x y z -- z )
over - ( x y -- x y x )
tuck - "gem ind bag" - ( x y -- y x y )
swap - byt - ( x y -- y x )

Det virker måske som mange men faktisk er det kun lige under halvdelen. Og efter lidt brug sidder de på rygraden. Lads os se hvordan man kan bruge dem, jeg vil antage du har 1 2 3 på stakken:

Fold kodeboks ind/udKode 


clear er et word som fjerner alt på stakken ligegyldigt hvor meget der er. Som nævnt kan det godt virke forvirrende i starten, men tro mig, efter et stykke tid vil disse shuffle words sidde på rygraden.



Indlæg senest redigeret d. 08.07.2009 14:13 af Bruger #14645
Hvis jeg skal være helt ærlig, så synes jeg godt nok det virker MEGET uoverskueligt. Jeg har kun lige hurtigt skimmet det hele, og jeg synes ikke det så lige til som mange andre sprog.

Det er et sprog jeg nok ikke kommer til arbejde med fordi det virker så kompliceret.



For mig ser det ud til at du har kopieret et kompendie eller lignende, som har nogle forudsætninger. Du refererer til nogle elementer som jeg ikke har læst om tidligere i dit indlæg fx.: "Skriv følgende i listeneren." som læser ved jeg ikke hvad en listener er, da du ikke har introduceret den tidligere - som sagt det virker som noget der er revet ud af en kontekst.

Hvis du har mod på det, så tag og lav den lidt bedre og opret en artikel om det her på udvikleren.



For mig ser det ud til at du har kopieret et kompendie eller lignende, som har nogle forudsætninger.


Nej jeg har ikke kopieret fra nogen steder. Men kan godt se nu at 2 timer nok ikke er nok.

Men jeg synes også det er svært at lave en nem tilgang til Factor. Det er et sprog hvor man rammer muren et par gange før det glider.

Yderligere, syntes jeg også det bliver kompliceret af at man typisk bruger funktionel programmering, hvorimod de fleste er vant til imperativ. Stakken er heller ikke noget man er vant til hvis man kommer fra C eller Java eller.. Man bruger sjældent bindinger til variabler selvom det er muligt. Så hvis jeg samtidig skal forklare "teorien" bag funktionel og stakbaseret programming så bliver det en temmelig lang introduktion.

Men er enig det er nok ikke god nok kvalitet som det er nu. Hvis jeg får noget tid her snart vil jeg prøve at forbedre det.



Indlæg senest redigeret d. 08.07.2009 11:25 af Bruger #14645
Jeg har nu fjernet det hele og ændret det med noget nyskrevet. Vil gerne høre om det er bedre end det andet og om det er nemmere at følge med og om det er den retning det skal gå.



Indlæg senest redigeret d. 08.07.2009 13:53 af Bruger #14645
t