ⓘ Factor (programming language)

Factor (programming language)

ⓘ Factor (programming language)

Factor is a stack-oriented programming language created by Slava Pestov. Factor is dynamically typed and has automatic memory management, as well as powerful metaprogramming features. The language has a single implementation featuring a self-hosted optimizing compiler and an interactive development environment. The Factor distribution includes a large standard library.


1. History

Slava Pestov created Factor in 2003 as a scripting language for a video game. The initial implementation, now referred to as JFactor, was implemented in Java and ran on the Java Virtual Machine. Though the early language resembled modern Factor superficially in terms of syntax, the modern language is very different in practical terms and the current implementation is much faster.

The language has changed significantly over time. Originally, Factor programs centered on manipulating Java objects with Javas reflection capabilities. From the beginning, the design philosophy has been to modify the language to suit programs written in it. As the Factor implementation and standard libraries grew more detailed, the need for certain language features became clear, and they were added. JFactor did not have an object system where you could define your own classes, and early versions of native Factor were the same; the language was similar to Scheme in this way. Today, the object system is a central part of Factor. Other important language features such as tuple classes, combinator inlining, macros, user-defined parsing words and the modern vocabulary system were only added in a piecemeal fashion as their utility became clear.

The foreign function interface was present from very early versions to Factor, and an analogous system existed in JFactor. This was chosen over creating a plugin to the C part of the implementation for each external library that Factor should communicate with, and has the benefit of being more declarative, faster to compile and easier to write.

The Java implementation initially consisted of just an interpreter, but a compiler to Java bytecode was later added. This compiler only worked on certain procedures. The Java version of Factor was replaced by a version written in C and Factor. Initially, this consisted of just an interpreter, but the interpreter was replaced by two compilers, used in different situations. Over time, the Factor implementation has grown significantly faster.


2. Description

Factor is a dynamically typed, functional and object-oriented programming language. Code is structured around small procedures, called words. In typical code, these are 1–3 lines long, and a procedure more than 7 lines long is very rare. Something that would idiomatically be expressed with one procedure in another programming language would be written as several words in Factor.

Each word takes a fixed number of arguments and has a fixed number of return values. Arguments to words are passed on a data stack, using reverse Polish notation. The stack is used just to organize calls to words, and not as a datastructure. The stack in Factor is used in a similar way to the stack in Forth; for this, they are both considered stack languages. For example, below is a snippet of code that prints out "hello world" to the current output stream:

"hello world" print

print is a word in the io vocabulary that takes a string from the stack and returns nothing. It prints the string to the current output stream by default, the terminal or the graphical listener.

Not all data has to be passed around only with the stack. Lexically scoped local variables let you store and access temporaries used within a procedure. Dynamically scoped variables are used to pass things between procedure calls without using the stack. For example, the current input and output streams are stored in dynamically scoped variables.

Factor emphasizes flexibility and the ability to extend the language. There is a system for macros, as well as for arbitrary extension of Factor syntax. Factors syntax is often extended to allow for new types of word definitions and new types of literals for data structures. It is also used in the XML library to provide literal syntax for generating XML. For example, the following word takes a string and produces an XML document object which is an HTML document emphasizing the string:

The word dup duplicates the top item on the stack. The stands for filling in that part of the XML document with an item from the stack.


3. Implementation and libraries

Factor includes a large standard library, written entirely in the language. These include

  • An HTTP server and client, with the Furnace web framework.
  • Efficient homogeneous arrays of integers, floats and C structs.
  • A cross-platform GUI toolkit, built on top of OpenGL and various windowing systems, used for the development environment.
  • A library implementing regular expressions, generating machine code to do the matching.
  • Bindings to several database libraries, including PostgreSQL and SQLite.

A foreign function interface is built into Factor, allowing for communication with C, Objective-C and Fortran programs. There is also support for executing and communicating with shaders written in GLSL.

Factor is implemented in Factor and C++. It was originally bootstrapped from an earlier Java implementation. Today, the parser and the optimizing compiler are written in the language. Certain basic parts of the language are implemented in C++ such as the garbage collector and certain primitives.

Factor uses an image-based model, analogous to many Smalltalk implementations, where compiled code and data are stored in an image. To compile a program, the program is loaded into an image and the image is saved. A special tool assists in the process of creating a minimal image to run a particular program, packaging the result into something that can be deployed as a standalone application.

The Factor compiler implements many advanced optimizations and has been used as a target for research in new optimization techniques.

  • DNA sequences Factor programming language a concatenative stack - oriented programming language Factor Unix a utility for factoring an integer into
  • A programming language is a formal language which comprises a set of instructions that produce various kinds of output. Programming languages are used
  • D, also known as Dlang, is a multi - paradigm system programming language created by Walter Bright at Digital Mars and released in 2001. Andrei Alexandrescu
  • A concatenative programming language is a point - free computer programming language in which all expressions denote functions, and the juxtaposition of
  • Self is an object - oriented programming language based on the concept of prototypes. Self began as a dialect of Smalltalk, being dynamically typed and using
  • notable programming languages grouped by type. There is no overarching classification scheme for programming languages Thus, in many cases, a language is
  • face of uncertainty. Programming languages used for probabilistic programming are referred to as Probabilistic programming languages PPLs Probabilistic
  • computer science, functional programming is a programming paradigm - a style of building the structure and elements of computer programs - that treats computation
  • is a programming language developed in the late 1970s at the Xerox Palo Alto Research Center in Palo Alto, California, United States. The language name
  • portal XL eXtensible Language is the first and so far the only computer programming language designed to support concept programming XL features