Factor is a
stack-oriented programming language
Stack-oriented programming, is a programming paradigm which relies on a stack machine model for passing Parameter (computer programming), parameters. Stack-oriented languages operate on one or more Stack (data structure), stacks, each of which ...
created by Slava Pestov. Factor is
dynamically typed
In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a type to every "term" (a word, phrase, or other set of symbols). Usually the terms are various constructs of a computer progra ...
and has
automatic memory management
In computer science, garbage collection (GC) is a form of automatic memory management. The ''garbage collector'' attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called ''garbage''. G ...
, as well as powerful metaprogramming features. The language has a single implementation featuring a self-hosted
optimizing compiler
In computing, an optimizing compiler is a compiler that tries to minimize or maximize some attributes of an executable computer program. Common requirements are to minimize a program's execution time, memory footprint, storage size, and power cons ...
and an
interactive development environment
An integrated development environment (IDE) is a software application that provides comprehensive facilities to computer programmers for software development. An IDE normally consists of at least a source code editor, build automation tools a ...
. The Factor distribution includes a large
standard library
In computer programming, a standard library is the library made available across implementations of a programming language. These libraries are conventionally described in programming language specifications; however, contents of a language's as ...
.
History
Slava Pestov created Factor in 2003 as a
scripting language
A scripting language or script language is a programming language that is used to manipulate, customize, and automate the facilities of an existing system. Scripting languages are usually interpreted at runtime rather than compiled.
A scripting ...
for a
video game
Video games, also known as computer games, are electronic games that involves interaction with a user interface or input device such as a joystick, controller, keyboard, or motion sensing device to generate visual feedback. This fee ...
. The initial implementation, now referred to as JFactor, was implemented in
Java
Java (; id, Jawa, ; jv, ꦗꦮ; su, ) is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea to the north. With a population of 151.6 million people, Java is the world's List ...
and ran on the
Java Virtual Machine
A Java virtual machine (JVM) is a virtual machine that enables a computer to run Java programs as well as programs written in other languages that are also compiled to Java bytecode. The JVM is detailed by a specification that formally describes ...
. Though the early language resembled modern Factor superficially in terms of
syntax
In linguistics, syntax () is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure ( constituency) ...
, 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 Java's
reflection Reflection or reflexion may refer to:
Science and technology
* Reflection (physics), a common wave phenomenon
** Specular reflection, reflection from a smooth surface
*** Mirror image, a reflection in a mirror or in water
** Signal reflection, in ...
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
Object-oriented programming (OOP) is a programming paradigm based on the concept of " objects", which can contain data and code. The data is in the form of fields (often known as attributes or ''properties''), and the code is in the form of p ...
where the programmer could define their own
class
Class or The Class may refer to:
Common uses not otherwise categorized
* Class (biology), a taxonomic rank
* Class (knowledge representation), a collection of individuals or objects
* Class (philosophy), an analytical concept used differentl ...
es, and early versions of native Factor were the same; the language was similar to
Scheme A scheme is a systematic plan for the implementation of a certain idea.
Scheme or schemer may refer to:
Arts and entertainment
* ''The Scheme'' (TV series), a BBC Scotland documentary series
* The Scheme (band), an English pop band
* ''The Schem ...
in this way. Today, the object system is a central part of Factor. Other important language features such as
tuple
In mathematics, a tuple is a finite ordered list (sequence) of elements. An -tuple is a sequence (or ordered list) of elements, where is a non-negative integer. There is only one 0-tuple, referred to as ''the empty tuple''. An -tuple is defi ...
classes, combinator inlining,
macros, user-defined
parsing
Parsing, syntax analysis, or syntactic analysis is the process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar. The term ''parsing'' comes from Lati ...
words and the modern vocabulary system were only added in a piecemeal fashion as their utility became clear.
The
foreign function interface
A foreign function interface (FFI) is a mechanism by which a program written in one programming language can call routines or make use of services written in another.
Naming
The term comes from the specification for Common Lisp, which explicit ...
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
A library is a collection of materials, books or media that are accessible for use and not just for display purposes. A library provides physical (hard copies) or digital access (soft copies) materials, and may be a physical location or a vir ...
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
In computing, Java bytecode is the bytecode-structured instruction set of the Java virtual machine (JVM), a virtual machine that enables a computer to run programs written in the Java programming language and several other programming languages, ...
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.
Description
Factor is a
dynamically typed
In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a type to every "term" (a word, phrase, or other set of symbols). Usually the terms are various constructs of a computer progra ...
,
functional
Functional may refer to:
* Movements in architecture:
** Functionalism (architecture)
** Form follows function
* Functional group, combination of atoms within molecules
* Medical conditions without currently visible organic basis:
** Functional sy ...
and
object-oriented
Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code. The data is in the form of fields (often known as attributes or ''properties''), and the code is in the form of pro ...
programming language
A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language.
The description of a programming ...
. 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
Reverse Polish notation (RPN), also known as reverse Łukasiewicz notation, Polish postfix notation or simply postfix notation, is a mathematical notation in which operators ''follow'' their operands, in contrast to Polish notation (PN), in whi ...
. 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
Forth or FORTH may refer to:
Arts and entertainment
* ''forth'' magazine, an Internet magazine
* ''Forth'' (album), by The Verve, 2008
* ''Forth'', a 2011 album by Proto-Kaw
* Radio Forth, a group of independent local radio stations in Scotla ...
; 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).
The
factorial function can be implemented in Factor in the following way:
: factorial ( n -- n! ) dup 1 > [1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,bproduct_[_drop_1_.html"_;"title=",b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_">,b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_if_;
Not_all_data_has_to_be_passed_around_only_with_the_stack._
[1,bproduct_[_drop_1_.html"_;"title=",b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_">,b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_if_;
Not_all_data_has_to_be_passed_around_only_with_the_stack._Lexical_scoping">Lexically_scoped
_
In_computer_programming,_the_scope_of_a_name_binding_(an_association_of_a_name_to_an_entity,_such_as_a_variable)_is_the_part_of_a_program_where_the_name_binding_is_valid;_that_is,_where_the_name_can_be_used_to_refer_to_the_entity._In_other_parts_o_...
_local_variables_let_one_store_and_access_ [1,bproduct_[_drop_1_.html"_;"title=",b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_">,b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_if_;
Not_all_data_has_to_be_passed_around_only_with_the_stack._Lexical_scoping">Lexically_scoped
_
In_computer_programming,_the_scope_of_a_name_binding_(an_association_of_a_name_to_an_entity,_such_as_a_variable)_is_the_part_of_a_program_where_the_name_binding_is_valid;_that_is,_where_the_name_can_be_used_to_refer_to_the_entity._In_other_parts_o_...
_local_variables_let_one_store_and_access_temporary_variable">temporaries_used_within_a_procedure._
product_[_drop_1_.html"_;"title=",b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_">,b.html"_;"title="[1,b">[1,bproduct_.html"_;"title="[1,b.html"_;"title="[1,b">[1,bproduct_">[1,b.html"_;"title="[1,b">[1,bproduct_[_drop_1_if_;
Not_all_data_has_to_be_passed_around_only_with_the_stack._Lexical_scoping">Lexically_scoped