Factor (programmeertaal) - Factor (programming language)

Factor
NewFactorLogo.png
Paradigma multi-paradigma : functioneel , aaneengeschakeld , stapelgericht,
Ontwikkelaar Slava Pestov
Verscheen voor het eerst 2003
Stabiele vrijlating
0,98 / 31 juli 2018 ( 2018-07-31 )
Typediscipline sterk , dynamisch
OS Windows , macOS , Linux
Licentie BSD-licentie
Website factorcode.org
Beïnvloed door
Vreugde , Vooruit , Lisp , Zelf

Factor is een stack-georiënteerde programmeertaal gemaakt door Slava Pestov. Factor is dynamisch getypt en heeft automatisch geheugenbeheer , evenals krachtige metaprogrammeringsfuncties. De taal heeft een enkele implementatie met een zelf-gehoste optimaliserende compiler en een interactieve ontwikkelomgeving . De Factor-distributie omvat een grote standaardbibliotheek .

Geschiedenis

Slava Pestov creëerde Factor in 2003 als scripttaal voor een videogame . De initiële implementatie, nu JFactor genoemd, was geïmplementeerd in Java en draaide op de Java Virtual Machine . Hoewel de vroege taal qua syntaxis oppervlakkig op moderne Factor leek , is de moderne taal praktisch heel anders en is de huidige implementatie veel sneller.

De taal is in de loop van de tijd aanzienlijk veranderd. Oorspronkelijk waren Factor-programma's gericht op het manipuleren van Java-objecten met Java's reflectiemogelijkheden . Vanaf het begin is de ontwerpfilosofie geweest om de taal aan te passen aan de programma's die erin zijn geschreven. Naarmate de Factor-implementatie en standaardbibliotheken gedetailleerder werden, werd de behoefte aan bepaalde taalfuncties duidelijk en werden deze toegevoegd. JFactor niet over een object systeem waar je je eigen kon definiëren klassen en vroege versies van inheemse Factor waren hetzelfde; de taal was op deze manier vergelijkbaar met Scheme . Tegenwoordig is het objectsysteem een ​​centraal onderdeel van Factor. Andere belangrijke taalfuncties zoals tuple- klassen, combinator-inlining, macro's , door de gebruiker gedefinieerde parseerwoorden en het moderne vocabulairesysteem werden slechts fragmentarisch toegevoegd toen hun nut duidelijk werd.

De interface voor buitenlandse functies was aanwezig vanaf de zeer vroege versies van Factor, en een analoog systeem bestond in JFactor. Dit werd gekozen boven het maken van een plug-in voor het C- gedeelte van de implementatie voor elke externe bibliotheek waarmee Factor zou moeten communiceren, en heeft het voordeel dat het meer declaratief is , sneller te compileren en gemakkelijker te schrijven is.

De Java-implementatie bestond aanvankelijk uit slechts een interpreter , maar later werd een compiler naar Java-bytecode toegevoegd. Deze compiler werkte alleen op bepaalde procedures. De Java-versie van Factor werd vervangen door een versie geschreven in C en Factor. Aanvankelijk bestond deze uit slechts een interpreter, maar de interpreter werd vervangen door twee compilers, die in verschillende situaties werden gebruikt. In de loop van de tijd is de Factor-implementatie aanzienlijk sneller gegroeid.

Beschrijving

Factor is een dynamisch getypte , functionele en objectgeoriënteerde programmeertaal . Code is gestructureerd rond kleine procedures, woorden genoemd. In typische code zijn deze 1-3 regels lang en een procedure van meer dan 7 regels is zeer zeldzaam. Iets dat idiomatisch zou worden uitgedrukt met één procedure in een andere programmeertaal, zou als meerdere woorden in Factor worden geschreven.

Elk woord heeft een vast aantal argumenten en heeft een vast aantal retourwaarden. Argumenten bij woorden worden doorgegeven op een datastack , met behulp van omgekeerde Poolse notatie . De stapel wordt alleen gebruikt om aanroepen naar woorden te organiseren, en niet als een datastructuur. De stapel in Factor wordt op dezelfde manier gebruikt als de stapel in Forth ; hiervoor worden ze beide beschouwd als stapeltalen . Hieronder vindt u bijvoorbeeld een codefragment dat "hallo wereld" afdrukt naar de huidige uitvoerstroom:

"hello world" print

printis een woord in het iovocabulaire dat een string van de stapel neemt en niets teruggeeft. Het drukt de string af naar de huidige uitvoerstroom (standaard de terminal of de grafische luisteraar).

De faculteitsfunctie kan op de volgende manier in Factor worden geïmplementeerd:

: factorial ( n -- n! ) dup 1 > [ [1,b] product ] [ drop 1 ] if

Niet alle gegevens hoeven alleen met de stapel te worden doorgegeven. Met lokale variabelen met lexicaal bereik kunt u tijdelijke tijdelijke gegevens opslaan en openen die binnen een procedure worden gebruikt. Variabelen met een dynamisch bereik worden gebruikt om dingen tussen procedureaanroepen door te geven zonder de stapel te gebruiken. De huidige invoer- en uitvoerstromen worden bijvoorbeeld opgeslagen in variabelen met een dynamisch bereik.

Factor benadrukt flexibiliteit en het vermogen om de taal uit te breiden. Er is een systeem voor macro's, evenals voor willekeurige uitbreiding van Factor-syntaxis. De syntaxis van Factor wordt vaak uitgebreid om nieuwe typen woorddefinities en nieuwe typen letterlijke gegevens voor gegevensstructuren mogelijk te maken. Het wordt ook gebruikt in de XML- bibliotheek om letterlijke syntaxis te bieden voor het genereren van XML. Het volgende woord neemt bijvoorbeeld een tekenreeks en produceert een XML-documentobject dat een HTML-document is dat de tekenreeks benadrukt:

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

Het woord dupdupliceert het bovenste item op de stapel. De <->staat voor het invullen van dat deel van het XML-document met een item uit de stapel.

Implementatie en bibliotheken

Factor bevat een grote standaardbibliotheek, volledig in de taal geschreven. Waaronder

  • Een platformonafhankelijke GUI-toolkit, gebouwd bovenop OpenGL en verschillende venstersystemen, gebruikt voor de ontwikkelomgeving.
  • Bindingen naar verschillende databasebibliotheken, waaronder PostgreSQL en SQLite .
  • Een HTTP- server en client, met het Furnace-webframework.
  • Efficiënte homogene arrays van gehele getallen, floats en C-structs.
  • Een bibliotheek die reguliere expressies implementeert en machinecode genereert om de matching te doen.

In Factor is een interface voor buitenlandse functies ingebouwd, waardoor communicatie met C- , Objective-C- en Fortran- programma's mogelijk is. Er is ook ondersteuning voor het uitvoeren van en communiceren met shaders geschreven in GLSL .

Factor is geïmplementeerd in Factor en C++ . Het was oorspronkelijk bootstrap van een eerdere Java-implementatie. Tegenwoordig zijn de parser en de optimaliserende compiler in de taal geschreven. Bepaalde basisdelen van de taal zijn geïmplementeerd in C++, zoals de garbage collector en bepaalde primitieven.

Factor gebruikt een op afbeeldingen gebaseerd model, analoog aan veel Smalltalk- implementaties, waarbij gecompileerde code en gegevens in een afbeelding worden opgeslagen. Om een ​​programma te compileren, wordt het programma in een afbeelding geladen en wordt de afbeelding opgeslagen. Een speciale tool helpt bij het maken van een minimale afbeelding om een ​​bepaald programma uit te voeren, waarbij het resultaat wordt verpakt in iets dat als een zelfstandige toepassing kan worden ingezet.

De Factor-compiler implementeert veel geavanceerde optimalisaties en is gebruikt als een doelwit voor onderzoek naar nieuwe optimalisatietechnieken.

Referenties

Externe links