Faktor (programmeringsspråk)

Faktor
NewFactorLogo.png
Paradigm multi-paradigm : konkatenativ ( stackbaserad ), funktionell , objektorienterad
Utvecklare Slava Pestov
Dök först upp 2003
Stabil frisättning
0,98 / 31 juli 2018 ( 2018-07-31 )
Maskinskrivningsdisciplin stark , dynamisk
OS Windows , macOS , Linux
Licens BSD-licens
Hemsida factorcode.org
Influerad av
Joy , Forth , Lisp , Self

Factor är ett stackorienterat programmeringsspråk skapat av Slava Pestov. Faktor är dynamiskt typad och har automatisk minneshantering , såväl som kraftfulla metaprogrammeringsfunktioner. Språket har en enda implementering med en optimerande kompilator som är självvärd och en interaktiv utvecklingsmiljö . Factor-distributionen inkluderar ett stort standardbibliotek .

Historia

Slava Pestov skapade Factor 2003 som ett skriptspråk för ett videospel . Den initiala implementeringen, nu kallad JFactor, implementerades i Java och kördes på Java Virtual Machine . Även om det tidiga språket liknade modern Factor ytligt när det gäller syntax , är det moderna språket väldigt annorlunda i praktiska termer och den nuvarande implementeringen är mycket snabbare.

Språket har förändrats avsevärt över tid. Ursprungligen fokuserade Factor-program på att manipulera Java-objekt med Javas reflektionsmöjligheter . Från början har designfilosofin varit att modifiera språket för att passa program skrivna i det. När Factor-implementeringen och standardbiblioteken blev mer detaljerade blev behovet av vissa språkfunktioner tydligt och de lades till. JFactor hade inget objektsystem där programmeraren kunde definiera sina egna klasser , och tidiga versioner av native Factor var desamma; språket liknade Scheme på detta sätt. Idag är objektsystemet en central del av Factor. Andra viktiga språkfunktioner som tupelklasser , kombinator-inlining, makron , användardefinierade analysord och det moderna vokabulärsystemet lades bara till på ett bitvis sätt när deras användbarhet blev tydlig.

Det främmande funktionsgränssnittet fanns från mycket tidiga versioner till Factor, och ett analogt system fanns i JFactor. Detta valdes framför att skapa en plugin till C -delen av implementeringen för varje externt bibliotek som Factor ska kommunicera med, och har fördelen av att vara mer deklarativ , snabbare att kompilera och lättare att skriva.

Java-implementeringen bestod till en början bara av en tolk , men en kompilator till Java-bytekod lades senare till. Denna kompilator fungerade bara på vissa procedurer. Java-versionen av Factor ersattes av en version skriven i C och Factor. Till en början bestod denna bara av en tolk, men tolken ersattes av två kompilatorer, som användes i olika situationer. Med tiden har Factor-implementeringen vuxit betydligt snabbare.

Beskrivning

Factor är ett dynamiskt typat , funktionellt och objektorienterat programmeringsspråk . Koden är uppbyggd kring små procedurer, så kallade ord. I typisk kod är dessa 1–3 rader långa, och en procedur som är längre än 7 rader är mycket sällsynt. Något som idiomatiskt skulle uttryckas med en procedur i ett annat programmeringsspråk skulle skrivas som flera ord i Factor.

Varje ord tar ett fast antal argument och har ett fast antal returvärden. Argument till ord skickas på en datastack med omvänd polsk notation . Stacken används bara för att organisera anrop till ord, och inte som en datastruktur. Stacken i Factor används på ett liknande sätt som stacken i Forth ; för detta betraktas de båda som stackspråk . Till exempel nedan är ett kodavsnitt som skriver ut "hej världen" till den aktuella utströmmen:

"hej världen" tryck

print är ett ord i io- vokabulären som tar en sträng från stacken och inte returnerar något. Den skriver ut strängen till den aktuella utströmmen (som standard terminalen eller den grafiska lyssnaren).

Faktorialfunktionen _ kan implementeras i Factor på följande sätt:

                  :  faktoriell  (  n  --  n!  )  dup  1  >  [  [1,b]  produkt  ]  [  droppe  1  ]  om  ; 

All data behöver inte skickas runt bara med stacken. Lexiskt omfångade lokala variabler låter en lagra och komma åt temporära som används inom en procedur. Dynamiskt omfångade variabler används för att skicka saker mellan proceduranrop utan att använda stacken. Till exempel lagras de aktuella in- och utströmmarna i dynamiskt omfångade variabler.

Factor betonar flexibilitet och förmågan att utöka språket. Det finns ett system för makron, såväl som för godtycklig förlängning av faktorsyntax. Faktors syntax utökas ofta för att tillåta nya typer av orddefinitioner och nya typer av bokstaver för datastrukturer. Det används också i XML -biblioteket för att tillhandahålla bokstavlig syntax för att generera XML. Till exempel tar följande ord en sträng och producerar ett XML-dokumentobjekt som är ett HTML-dokument som betonar strängen:

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

Ordet dup duplicerar det översta objektet på stapeln. <-> från stacken.

Implementering och bibliotek

Faktor inkluderar ett stort standardbibliotek, helt skrivet på språket. Dessa inkluderar

  • En plattformsoberoende GUI-verktygssats, byggd ovanpå OpenGL och olika fönstersystem, som används för utvecklingsmiljön.
  • Bindningar till flera databasbibliotek, inklusive PostgreSQL och SQLite .
  • En HTTP- server och klient, med Furnace webbramverk.
  • Effektiva homogena arrayer av heltal, flöten och C-strukturer.
  • Ett bibliotek som implementerar reguljära uttryck, genererar maskinkod för att göra matchningen.

Ett främmande funktionsgränssnitt är inbyggt i Factor, vilket möjliggör kommunikation med C , Objective-C och Fortran- program. Det finns också stöd för att köra och kommunicera med shaders skrivna i GLSL .

Factor implementeras i Factor och C++ . Det var ursprungligen bootstrappat från en tidigare Java-implementering. Idag är tolken och den optimerande kompilatorn skrivna på språket. Vissa grundläggande delar av språket är implementerade i C++ som sopsamlaren och vissa primitiver.

Factor använder en bildbaserad modell, analogt med många Smalltalk- implementationer, där kompilerad kod och data lagras i en bild. För att kompilera ett program laddas programmet in i en bild och bilden sparas. Ett speciellt verktyg hjälper till att skapa en minimal bild för att köra ett visst program, paketera resultatet till något som kan distribueras som en fristående applikation.

Faktorkompilatorn implementerar många avancerade optimeringar och har använts som ett mål för forskning inom nya optimeringstekniker.

externa länkar