Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Concatenative programming language
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{short description|Type of programming language}} <!-- {{bare URLs|date=June 2013}} --> A '''concatenative programming language''' is a [[Point-free programming|point-free]] computer [[programming language]] in which all expressions denote [[Function (mathematics)|functions]], and the [[juxtaposition]] of [[Expression (computer science)|expressions]] denotes [[function composition]].<ref name="dobbscodetalk">{{cite web|url=http://drdobbs.com/blogs/architecture-and-design/228701299 |title=Christopher Diggins: What is a concatenative language |publisher=Drdobbs.com |date=2008-12-31 |access-date=2013-07-01}}</ref> Concatenative programming replaces [[function application]], which is common in other programming styles, with [[function composition (computer science)|function composition]] as the default way to build [[subroutine]]s. ==Example== For example, a nesting of operations in an applicative language like the following: <syntaxhighlight lang="javascript"> baz(bar(foo(x))) </syntaxhighlight> ...is written in a concatenative language as a sequence of functions:<ref>{{cite web | url=http://concatenative.org/wiki/view/Concatenative%20language/Name%20code%20not%20values | title=Name code not values | publisher=Concatenative.org | access-date=13 September 2013}}</ref> x foo bar baz Functions and procedures written in concatenative style are not [[Value-level programming|value level]], i.e. they typically do not represent the data structures they operate on with explicit names or [[identifier#In computer science|identifiers]]. Instead they are [[Function-level programming|function level]]{{Spaced en dash}}a function is defined as a [[pipeline (software)|pipeline]], or a sequence of operations that take parameters from an implicit [[data structure]] upon which all functions operate, and return the function results to that shared structure so that it will be used by the next operator.<ref>{{cite web | url=http://concatenative.org/wiki/view/Concatenative%20language | title=Concatenative language | publisher=Concatenative.org | access-date=13 September 2013}}</ref> The combination of compositional [[Semantics of programming languages|semantics]] with a [[Syntax of programming languages|syntax]] that mirrors such a semantic makes concatenative languages highly amenable to algebraic manipulation of programs;<ref>{{cite web|url=http://www.latrobe.edu.au/philosophy/phimvt/joy/j00rat.html|archive-url=https://web.archive.org/web/20110115151536/http://www.latrobe.edu.au/philosophy/phimvt/joy/j00rat.html|archive-date=2011-01-15|title=Rationale for Joy, a functional language}}</ref> although it may be difficult to write mathematical expressions directly in them.<ref name="whymatters"/> Concatenative languages can be implemented efficiently with a [[stack machine]], and are commonly present implicitly in [[virtual machine]]s in the form of their [[instruction set]]s.<ref name="whymatters">{{cite web | url=http://evincarofautumn.blogspot.com.es/2012/02/why-concatenative-programming-matters.html | title=Why Concatenative Programming Matters | access-date=13 September 2013}}</ref> ==Properties== The properties of concatenative languages are the result of their compositional syntax and semantics: * The reduction of any expression is the simplification of one function to another function; it is never necessary to deal with the application of functions to objects.<ref>{{cite web|url=http://www.latrobe.edu.au/phimvt/joy/j08cnt.html |title=von Thun, Manfred: Joy compared with other functional languages |archive-url=https://web.archive.org/web/20111006225512/http://www.latrobe.edu.au/phimvt/joy/j08cnt.html |archive-date=2011-10-06}}</ref> * Any subexpression can be replaced with a name that represents the same subexpression. This is referred to in the concatenative community as [[Code refactoring|factoring]] and is used extensively to simplify programs into smaller parts. * The syntax and semantics of concatenative languages form the algebraic structure of a [[monoid]].<ref>{{cite web|url=http://www.latrobe.edu.au/philosophy/phimvt/joy/j02maf.html |title=von Thun, Manfred: Mathematical foundations of Joy |archive-url=https://web.archive.org/web/20100731060810/http://www.latrobe.edu.au/philosophy/phimvt/joy/j02maf.html |archive-date=2010-07-31}}</ref> * Concatenative languages can be made well-suited to an implementation inspired by [[linear logic]] where no [[Garbage (computer science)|garbage]] is ever generated.<ref>{{cite web |url=http://home.pipeline.com/~hbaker1/ForthStack.html |title=Henry Baker: Linear Logic and Permutation Stacks β The Forth Shall Be First |publisher=Home.pipeline.com |access-date=2013-07-01 |archive-url=https://web.archive.org/web/20140724091729/http://home.pipeline.com/~hbaker1/ForthStack.html |archive-date=2014-07-24 |url-status=dead }}</ref> ==Implementations== The first concatenative programming language was [[Forth (programming language)|Forth]], although [[Joy (programming language)|Joy]] was the first language to call itself concatenative. Other concatenative languages are [[Dc_(computer_program)|dc]], [[Factor (programming language)|Factor]], Onyx, [[PostScript]], and [[RPL (programming language)|RPL]]. Most existing concatenative languages are [[stack-based]]; this is not a requirement and other models have been proposed.<ref>{{cite web|url=http://www.nsl.com/k/xy/xy.htm |title=The Concatenative Language XY |publisher=Nsl.com |access-date=2013-07-01}}</ref><ref>{{cite web|url=http://www.enchiladacode.nl/ |title=The Enchilada Programming Language |publisher=Enchiladacode.nl |access-date=2013-07-01}}</ref><ref>{{cite web|url=http://www.om-language.org/ |title=The Om Programming Language |publisher=Om-language.org |access-date=2013-07-01}}</ref> Concatenative languages are currently used for [[embedded systems|embedded]], [[Application software|desktop]], and [[web programming]], as [[Target language (computing)|target languages]], and for research purposes. Most concatenative languages are [[dynamically typed]]. Exceptions include the [[statically typed]] Cat language<ref>{{cite web|url=http://www.cat-language.com/manual.html |title=Cat Specification |publisher=Cat-language.com |access-date=2013-07-01 |archive-url=https://web.archive.org/web/20150205081218/http://cat-language.com/manual.html |archive-date=2015-02-05}}</ref> and its successor, Kitten<ref>{{Cite web |title=Kitten Programming Language |url=https://kittenlang.org/ |access-date=2025-03-31 |website=kittenlang.org}}</ref>. ==See also== * [[Function-level programming]] * [[Homoiconicity]] * [[Stack-oriented programming language]] * [[Tacit programming]] ==References== {{Reflist}} ==External links== * [http://www.concatenative.org concatenative.org: A wiki about concatenative languages] * [http://zwizwa.be/staapl Staapl: Forth on Scheme for Embedded Controllers] * [http://www.enchiladacode.nl The Enchilada Programming Language] * [http://www.nsl.com/k/xy/xy.htm The Concatenative Language XY] * [http://om-language.org The Om Programming Language] {{Programming paradigms navbox}} {{Types of programming languages}} {{DEFAULTSORT:Concatenative Programming Language}} [[Category:Concatenative programming languages| ]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Cite web
(
edit
)
Template:Programming paradigms navbox
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)
Template:Spaced en dash
(
edit
)
Template:Types of programming languages
(
edit
)