**Factor** on magasinipõhine programmeerimiskeel. Factor on dünaamilise tüüpimise, automaatse mäluhalduse ja võimsate metaprogammeerimisvahenditega. Sellest keelest on olemas implementatsioon, mis sisaldab optimeerivat kompilaatorit, interpretaatorit ja IDE-d. Factoril on suur standardteek.

Ajalugu
-------

Slava Pestov lõi Factori aastal 2003 skriptimiskeelena arvutimängude jaoks. Algne implementatsioon, mida nüüd teatakse nimega JFactor, oli kirjutatud Javas ja töötas Java virtuaalmasinas. Kuigi see algne versioon sarnanes praeguse Factoriga süntaksi poolest, on praegune Factor suuresti teistsuguste põhimõtetega ning ka oluliselt kiirem.

Algselt keskendusid Factori programmid Java objektide manipuleerimisele Java refleksioonivahenditega. Üks läbivaid ideid on olnud kohandada keelt temas kirjutavatele programmidele. Ei JFactoris ega esimestes masinkoodiks kompileerivates kompilaatorites polnud objektisüsteemi, kus programmeerija saaks oma klasse defineerida; tänapäeval on objektisüsteem Factori keskne osa. Muud olulised võimalused nagu ennikuklassid, makrod ja kasutaja-defineeritud parsimissõnad lisati tükkhaaval, vastavalt sellele, kui palju ja mil viisil nende järele vajadust oli. Juba varastest aegadest peale on Factoril olnud liides C (programmeerimiskeel) keelde.

JFactor koosnes algul ainult interpretaatorist, hiljem lisati kompilaator Java baitkoodi. See kompilaator töötas ainult osadel protseduuridel. Javas kirjutatud JFactor asendati C-s ja Factoris kirjutatud Factori implementatsiooniga. Aja jooksul on Factori implementatsioon oluliselt kiiremaks muutunud.

Programmeerimisparadigma
------------------------

Factor on dünaamilise tüüpimisega, funktsionaalne ja objektorienteeritud programmeerimiskeel. Kood on struktureeritud väikeste protseduuride ümber, neid nimetatakse sõnadeks. Tavaliselt on nad 1–3 rida pikad, ja rohkem kui 7-realine sõna on väga haruldane. Mis oleks muus keeles üks protseduur, on Factoris tavaliselt mitu.

Iga sõna võtab konstantse arvu argumente ja tagastab konstantse arvu väärtusi. Argumente saadetakse sõnadesse magasini abil, kasutades tagurpidi prefikskuju. Seda magasini kasutatakse ainult sõnade väljakutsumiste korraldamiseks, mitte andmestruktuurina. Factori magasini kasutatakse sarnaselt Forthi omaga – neid mõlemaid nimetatakse magasinipõhisteks programmeerimiskeelteks. Näiteks selline näeb välja koodijupp, mis prindib väljundvoogu "hello world":

```
 "hello world" print

```

`print` on sõna `io` sõnastikus; ta võtab ühe stringi magasini pealt ega tagasta midagi. Ta prindib sõna käesolevasse väljundvoogu (milleks on vaikimisi kas terminal või graafiline kuular).

Mitte kõiki andmeid ei pea edastama magasiniga. Staatilise skoopimisega saab protseduurisiseselt ajutisi muutujaid väärtustada ja lugeda. Dünaamilise skoopimisega saab muutujaid magasini kasutamata protseduuride väljakutsumistele saata, näiteks töötavad nii sisend- ja väljundvoog.

Factoris on rõhk paindlikkusel ja keele laiendamise võimalustel. On olemas süsteem makrode ja suvaliste keelesüntaksimuutuste jaoks. Neid laiendusi kasutatakse sagedasti, et lubada uut tüüpi sõnadefinitsioone ja literaale andmestruktuuride jaoks. Neid kasutatakse ka näiteks XML-teegi jaoks. Näiteks järgmine sõna võtab argumendiks stringi ja loob XML-dokumendiobjekti:

```
 : make-html ( string – xml )
 dup
 <XML
 <html>
 <head><title><-></title></head>
 <body><h1><-></h1></body>
 </html>
 XML> ;

```

Sõna `dup` kloonib magasini pealmist elementi, `<->` tähendab siin dokumendi selle osa täitmine magasini pealmise elemendiga.

Viited
------

1. ↑  Diggins, Christopher (2008), "Simple Type Inference for Higher-Order Stack-Oriented Languages", *Arhiivikoopia* (PDF), originaali (PDF) arhiivikoopia seisuga 16. november 2013, vaadatud 14. aprillil 2010`{{citation}}`: CS1 hooldus: arhiivikoopia kasutusel pealkirjana (link)
2. ↑  Herzberg, Dominikus; Reichert, Tim (2009), "Concatenative Programming: An Overlooked Paradigm in Functional Programming", *Arhiivikoopia* (PDF), originaali (PDF) arhiivikoopia seisuga 27. veebruar 2012, vaadatud 14. aprillil 2010`{{citation}}`: CS1 hooldus: arhiivikoopia kasutusel pealkirjana (link)
3. ↑
4. ↑

Välislingid
-----------

* Factor website
* Google Research Technology Talks, Factor:An Extensible Interactive Language