Content deleted Content added
m →External links: clean up; http→https for YouTube using AWB |
m Bot: http → https |
||
(39 intermediate revisions by 29 users not shown) | |||
Line 1:
{{Short description|Stack-oriented programming language}}
{{Primary sources|date=July 2019}}
{{Infobox programming language
|name = Factor
|logo = [[File:NewFactorLogo.png|200px]]
|paradigm = [[multi-paradigm programming language|multi-paradigm]]: [[
|year = 2003
|developer = Slava Pestov
|latest_release_version = 0.
|latest_release_date = {{
|typing = [[strong typing|strong]], [[dynamic typing|dynamic]]
|influenced_by = [[Joy (programming language)|Joy]], [[Forth (programming language)|Forth]], [[Lisp (programming language)|Lisp]], [[Self (programming language)|Self]]
|influenced =
▲|operating_system = [[Microsoft Windows|Windows]], [[macOS]], [[Linux]], others
|license = [[BSD license]]
|website = [http://factorcode.org/ factorcode.org]
}}
'''Factor''' is a [[stack-oriented
==History==
Slava Pestov created Factor in 2003 as a [[scripting language]] for a [[video game]].<ref>{{
The language has changed significantly over time. Originally, Factor programs centered on manipulating Java objects with Java's [[reflection (computer science)|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
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 (programming language)|C]] part of the implementation for each external [[library (computing)|library]] that Factor should communicate with, and has the benefit of being more [[declarative programming|declarative]], faster to compile and easier to write.
The Java implementation initially consisted of just an [[interpreter (computing)|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.<ref>{{
==Description==
Factor is a [[dynamically typed]], [[functional programming|functional]] and [[object-oriented programming|object-oriented]] [[programming language]]. Code is structured around small procedures, called words. In typical code, these are
Each word takes a fixed number of arguments and has a fixed number of return values. Arguments to words are passed on a [[stack (data structure)|data stack]], using [[reverse Polish notation]]. The stack is used just to organize calls to words, and not as a
"hello world" print
<code>print</code> is a word in the <code>io</code> 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).<ref name = "dls" />
The [[factorial|factorial function]] <math>n!</math> can be implemented in Factor in the following way:
Not all data has to be passed around only with the stack. [[Lexical scoping|Lexically scoped]] local variables let you store and access [[temporary variable|temporaries]] used within a procedure. [[Dynamic scoping|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.<ref name="dls" />▼
<syntaxhighlight lang="factor">
: factorial ( n -- n! ) dup 1 > [ [1..b] product ] [ drop 1 ] if ;
</syntaxhighlight>
▲Not all data has to be passed around only with the stack. [[Lexical scoping|Lexically scoped]] local variables let
Factor emphasizes flexibility and the ability to extend the language.<ref name = "dls" /> There is a system for macros, as well as for arbitrary extension of Factor syntax. Factor's syntax is often extended to allow for new types of word definitions and new types of [[literal (computer science)|literal]]s 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:
<
: make-html ( string -- xml )
dup
Line 58 ⟶ 52:
</html>
XML> ;
</syntaxhighlight>
The word <code>dup</code> duplicates the top item on the stack. The <code><-></code> stands for filling in that part of the XML document with an item from the stack.
==Implementation and libraries==
Factor includes a large standard library, written entirely in the language. These include
* A cross-platform GUI toolkit, built on top of [[OpenGL]] and various windowing systems, used for the development environment.<ref>{{
* Bindings to several database libraries, including [[PostgreSQL]] and [[SQLite]].<ref>{{
* An [[HTTP]] server and client, with the Furnace web framework.<ref>{{
* Efficient homogeneous arrays of integers, floats and C structs.<ref>{{
* A library implementing regular expressions, generating machine code to do the matching.<ref>{{
A [[foreign function interface]] is built into Factor, allowing for communication with [[C (programming language)|C]], [[Objective-C]] and [[Fortran]] programs. There is also support for executing and communicating with shaders written in [[GLSL]].<ref name="dls"/><ref>{{
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 [[system image|image]]-based model, analogous to many [[Smalltalk]] implementations, where compiled code and data are stored in an image.<ref>{{
The Factor compiler implements many advanced optimizations and has been used as a target for research in new optimization techniques.<ref name="dls"/><ref>{{
==References==
{{
==External links==
*{{Official website|http://factorcode.org}}
*{{cite video |people=Slava Pestov |date=October 27, 2008 |title=Factor: An Extensible Interactive Language |url=https://www.youtube.com/watch?v=f_0QlhYlS8g |archive-url=https://ghostarchive.org/varchive/youtube/20211222/f_0QlhYlS8g |archive-date=2021-12-22 |url-status=live|format=flv |medium=Tech talk |publisher=[[Google]]}}{{cbignore}}
*{{cite video |people=Zed Shaw |date=2008 |title=The ACL is Dead|url=http://vimeo.com/2723800 |format=flv |medium=CUSEC 2008 |publisher=
{{DEFAULTSORT:Factor (Programming Language)}}
[[Category:Programming languages]]
[[Category:Concatenative programming languages]]
[[Category:Function-level languages]]
Line 91 ⟶ 86:
[[Category:Programming languages created in 2003]]
[[Category:Extensible syntax programming languages]]
[[Category:2003 software]]
[[Category:High-level programming languages]]
[[Category:Software using the BSD license]]
|