Concatenative programming language: Difference between revisions

Content deleted Content added
Implementations: fix another
m WP:REFerence WP:CITations: repeats consolidate-merge as WP:NAMEDREFS, cuts.
 
(92 intermediate revisions by 58 users not shown)
Line 1:
{{Short description|Type of programming language}}
{{Programming paradigms}}
 
A '''concatenative programming language''' is onea [[Point-free programming|point-free]] computer [[programming language]] in which all termsexpressions denote [[Function (mathematics)|functions]], and the [[juxtaposition]] of terms[[Expression (computer science)|expressions]] denotes [[function composition]].<ref name="dobbscodetalk">[{{cite magazine |last1=Diggins |first1=Christopher |date=2008-12-31 |url=http://dobbscodetalkdrdobbs.com/index.php?option=com_myblog&show=Whatblogs/architecture-isand-a-Concatenative-Language.html&Itemiddesign/228701299 |title=29 Christopher Diggins: What is a concatenative language |magazine=[[Dr. Dobb's Journal]] |access-date=2013-07-01}}</ref> TheConcatenative combinationprogramming of a compositionalreplaces [[semanticsfunction application]], withwhich ais [[Syntaxcommon ofin other [[programming languages|syntaxparadigm]]s, thatwith mirrors[[Function suchcomposition a(computer semanticsscience)|function makescomposition]] concatenativeas languagesthe highlydefault amenableway to algebraicbuild manipulation and formal analysis.<ref>[http://www.latrobe.edu.au/philosophy/phimvt/joy/j00rat.html[Function Rationale(computer for Joy, a functional languageprogramming)|subroutines]</ref>].
 
==Example==
Much of the original work on concatenative language theory was carried out by [[Manfred von Thun]].
For example, a nesting of operations in an applicative language like the following:
 
<syntaxhighlight lang="javascript">
==Properties==
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]] – a function is defined as a [[pipeline (software)|pipeline]], or a sequence of operations that take parameters from an implicit [[data structure]] on 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 (computer science)|semantics]] with a [[Syntax (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 |last1=Purdy |first1=Jon |date=12 February 2012 |url=http://evincarofautumn.blogspot.com/2012/02/why-concatenative-programming-matters.html |title=Why Concatenative Programming Matters |website=The Big Mud Puddle |access-date=12 August 2025}}</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 |last1=von Thun |first1=Manfred |year=2011 |url=http://www.latrobe.edu.au/philosophy/phimvt/joy/j08cnt.html |title=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>
* Concatenative languages are necessarily [[Point-free programming|point-free]] as allowing terms to denote [[Variable (programming)|variables]] would violate the rule that all terms denote functions.
* Any subexpression can be replaced with a name that represents the same subexpression. ThisIn isconcatenative referredprogramming topractice, inthis the concatenative communityis ascalled [[Code refactoring|factoring]], and is used extensively to simplify programs into smaller parts.
* 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>[http://www.latrobe.edu.au/philosophy/phimvt/joy/j08cnt.html Joy compared with other functional languages].</ref>
* The syntax and semantics of concatenative languages form the algebraic structure of a [[monoid]].<ref>[{{cite web |last1=von Thun |first1=Manfred |year=2009 |url=http://www.latrobe.edu.au/philosophy/phimvt/joy/j02maf.html von Thun, Manfred: |title=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>
* 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.
* 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 report |last1=Baker |first1=Henry |year=1993 |url=http://home.pipeline.com/~hbaker1/ForthStack.html |title=Linear Logic and Permutation Stacks: The Forth Shall Be First |publisher=Nimble Computer Corporation |via=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>
* The syntax and semantics of concatenative languages form the algebraic structure of a [[monoid]].<ref>[http://www.latrobe.edu.au/philosophy/phimvt/joy/j02maf.html von Thun, Manfred: Mathematical foundations of Joy]</ref>
* Concatenative languages can be well-suited to a "linear logic" implementation, meaning that no garbage is ever generated.<ref>[http://home.pipeline.com/~hbaker1/ForthStack.html Henry Baker: Linear Logic and Permutation Stacks — The Forth Shall Be First]</ref>
 
==Implementations==
The first concatenative programming language was [[Forth (programming language)|Forth]], although [[Joy (programming language)|Joy]] was the first language which was termed concatenative. Other concatenative languages are [[dc (computer program)|dc]], [[Factor (programming language)|Factor]], Onyx, [[PostScript]], [[RPL (programming language)|RPL]], Staapl,<ref name="Staapl">{{cite web |last1=Schouten |first1=Tom (zwizwa) |date=<!-- Undated --> |url=http://zwizwa.be/staapl/ |title=Staapl: Forth on Scheme for Embedded Controllers |website=Zwizwa LLC |access-date=12 August 2025}}</ref> and experimental and discontinued ones including:<!-- Alphabetic order--> Enchilada,<ref name="Enchilada">{{cite web |author1=rapido |author2=NewDave |author3=jacintheford |author4=goren |date=2 January 2024 |url=https://concatenative.org/wiki/view/Enchilada |title=Enchilada |website=Concatenative.org |access-date=12 August 2025}}</ref> Om,<ref name="Om">{{cite web |author1=sparist |date=<!-- Undated --> |url=https://www.om-language.com/ |title=The Om Programming Language |website=Om-language.com |access-date=12 August 2025}}</ref> XY.<ref name="XY">{{cite web |last1=Apter |first1=Stevan |date=2004 |url=http://www.nsl.com/k/xy/xy.htm |title=The Concatenative Language XY |website=no stinking loops |access-date=12 August 2025}}</ref>
 
Most existing concatenative languages are [[Stack-oriented programming|stack-based]];. thisThis is not a requirementrequired, and other models have been proposed.<ref name="XY"/><ref name="Enchilada"/><ref name="Om"/> Concatenative languages are currently used for [[embeddedEmbedded systemssystem|embedded]],<ref name="Staapl"/> [[Application software|desktop]], and [[Web development|web programming]], as [[Translator (computing)|target languagelanguages]]s, and for research purposes. Most concatenative languages are [[dynamically typed]], although Cat is [[statically typed]] and proposals for other typed languages have been made.{{Citation needed|date=July 2009}}
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 [[Cat (programming language)|Cat]], [[Enchilada (programming language)|Enchilada]], [[Factor (programming language)|Factor]], [[Onyx (programming language)|Onyx]], [[PostScript]], [[RPL (programming language)|RPL]], [[Stappl]], and [[XY (programming language)|XY]].
 
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 |last1=Purdy |first1=Jon |title=Kitten Programming Language |url=https://kittenlang.org/ |access-date=2025-03-31 |website=kittenlang.org}}</ref>.
Most existing concatenative languages are [[stack-based]]; this is not a requirement and other models have been proposed. Concatenative languages are currently used for [[embedded systems|embedded]], [[Application software|desktop]], and [[web programming]], as [[target language]]s, and for research purposes. Most concatenative languages are [[dynamically typed]], although Cat is [[statically typed]] and proposals for other typed languages have been made.{{Citation needed|date=July 2009}}
 
==See also==
* [[Function-level programming]]
* [[Homoiconicity]]
* [[Stack-oriented programming language]]
* [[Tacit programming]]
 
==References==
{{reflistReflist}}
 
==External links==
* [http://www.latrobeconcatenative.edu.auorg/philosophy/phimvt/joy Concatenative.htmlorg: ManfredWiki], von Thun's Joy andabout concatenative theory website]programming
* [http://www.concatenative.org concatenative.org: A wiki about concatenative languages]
 
{{DEFAULTSORT:Concatenative Programming Languageparadigms navbox}}
[[Category:Concatenative{{Types of programming languages]]}}
 
{{DEFAULTSORT:Concatenative Programming Language}}
[[pt:Linguagem de programação concatenativa]]
[[Category:Concatenative programming languages| ]]
[[ru:Конкатенативный язык программирования]]
<!-- Hidden categories below -->
[[Category:Articles with example JavaScript code]]