4,501
edits
Miraheze>Marshall No edit summary |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
(41 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{Infobox array language | {{Infobox array language | ||
| logo = [[File:Jblue.png]] | |||
| file ext = .ijs | | file ext = .ijs | ||
| array model = [[Flat array model|flat]] with [[Box|boxes]] | | array model = [[Flat array model|flat]] with [[Box|boxes]] | ||
| index origin = 0 | | index origin = 0 | ||
| function styles = explicit, [[tacit]] | | function styles = [[Anonymous function|explicit]], [[tacit]] | ||
| numeric types = 64-bit integer, complex float, [[extended integer]], [[rational]] | | numeric types = 64-bit integer, [[complex]] float, [[extended integer]], [[rational]] | ||
| unicode support = full; distinct byte and code point types | | unicode support = full; distinct byte and code point types | ||
| released = 1990 | | released = 1990 | ||
| developer = [[ | | developer = [[Jsoftware]] ([[Ken Iverson]], [[Roger Hui]]) | ||
| latest release version = | | latest release version = j903 / 2021-12-17 | ||
| influenced by = [[ | | influenced by = [[SAX]], [[Rationalized APL]] | ||
| influenced = [[Dyalog APL]], [[NARS2000]], [[I]] | | influenced = [[Dyalog APL]], [[NARS2000]], [[I]], [[BQN]] | ||
| implementation language= [[wikipedia:C (programming language)|C]] | | implementation language= [[wikipedia:C (programming language)|C]] | ||
| source = [https://github.com/jsoftware/jsource GitHub] | |||
| platforms = x86, x86_64 | | platforms = x86, x86_64 | ||
| operating systems = Windows, Linux, macOS | | operating systems = Windows, Linux, macOS | ||
| license = [[wikipedia:GNU General Public License|GPLv3]] | | license = [[wikipedia:GNU General Public License|GPLv3]] | ||
| website = [https://www.jsoftware.com/ www.jsoftware.com] | | website = [https://www.jsoftware.com/ www.jsoftware.com] | ||
| forum = [https://code.jsoftware.com/wiki/System/Forums multiple] | |||
| download = [https://code.jsoftware.com/wiki/System/Installation System/Installation] | | download = [https://code.jsoftware.com/wiki/System/Installation System/Installation] | ||
| documentation = [https://www.jsoftware.com/help/dictionary/contents.htm Dictionary], [https://code.jsoftware.com/wiki/NuVoc NuVoc] | | documentation = [https://www.jsoftware.com/help/dictionary/contents.htm Dictionary], [https://code.jsoftware.com/wiki/NuVoc NuVoc] | ||
| run online = [https:// | | run online = [https://joebo.github.io/j-emscripten/ Emscripten], [https://jsoftware.github.io/j-playground/bin/html/ J playground] | ||
}} | }} | ||
'''J''' is an array language loosely following the [[SHARP APL]] tradition which uses [[wikipedia:ASCII|ASCII]] characters for primitive functionality and builds in [[leading axis theory]] and [[tacit programming]] as foundational design principles. J discards backwards compatibility with older APLs in order to simplify and regularize its syntax, redesign primitives to work on leading axes, and disentangle [[reduction]] from [[scan]]s and [[windowed reduction]]s (yielding the [[Prefix operator|prefix]] and [[infix operator]]s). However, J concepts such as [[function train]]s and the [[Indices]] function have been adopted by later APLs such as [[NARS2000]], [[Dyalog APL]], and [[dzaima/APL]]. J breaks the APL convention of writing primitives with a single glyph: instead, they are spelled with a single ASCII character possibly followed by one or two periods (<syntaxhighlight lang=j inline>.</syntaxhighlight>) or colons (<syntaxhighlight lang=j inline>:</syntaxhighlight>). It is also notable for its use of terms from English grammar to describe the language. For example, [[function]]s are called "verbs" while arrays are called "nouns". | |||
== History == | |||
{{APL programming language}} | J was initially designed primarily by [[Ken Iverson]] and [[Roger Hui]], with input from [[Arthur Whitney]] and [[Eric Iverson]]. Ken had been considering a new language based on [[A Dictionary of APL]] but without the backwards compatibility constraints of APL and the custom character set (which was a major technical issue at the time). In "A Personal View of APL"<ref name="personal">[[Ken Iverson|Iverson, K.E.]] [https://www.jsoftware.com/papers/APLPersonalView.htm "A Personal View of APL"]. IBM Systems Journal, Volume 30, Number 4. 1991-12.</ref> he gives the following as the most important goals for a new language: | ||
{{quote| | |||
* Is available as “shareware”, and is inexpensive enough to be acquired by students as well as by schools | |||
* Can be printed on standard printers | |||
* Runs on a wide variety of computers | |||
* Provides the simplicity and the generality of the latest thinking in APL}} | |||
Iverson's phrase "the latest thinking in APL" refers to two major breakthroughs made that decade: the invention of the [[Rank operator]] by [[Arthur Whitney]] in 1982 and subsequent development of [[leading axis theory]], and the invention of [[function train]]s by Iverson and [[Eugene McDonnell]] in 1988. | |||
In the summer of 1989 Whitney visited Iverson, who discussed with Whitney his plans for a new array language. Whitney wrote a one-page prototype for the language in a single afternoon using [[wikipedia:C (programming language)|C]]. Iverson shared the program with [[Roger Hui]], who began working on J on August 27 and quickly produced a more complete prototype.<ref name="personal"/><ref>[[Roger Hui|Hui, Roger]]. [https://code.jsoftware.com/wiki/Essays/Incunabulum "Incunabulum"]. From ''An Implementation of J'', Appendix A: Incunabulum, 1992-01-27.</ref><ref name>McIntyre, Donald. [https://web.archive.org/web/20060410225556/http://elliscave.com/APL_J/rogerhui.htm "A Tribute to Roger Hui, presented at APL96"]. 1996.</ref> The name "J", chosen by Hui when saving the first source code file, is meaningless: in ''An Implementation of J'', Hui remarks "Why 'J'? It is easy to type."<ref>[[Roger Hui|Hui, Roger]]. [https://sblom.github.io/openj-core/ioj.htm ''An Implementation of J''] ([http://www.jsoftware.com/books/pdf/aioj.pdf pdf]), Preface. 1992-01-27.</ref> J was first presented by Hui and Iverson, including a live demo, at a meeting of the Toronto APLSIG in February 1990.<ref name="remembering">[[Roger Hui|Hui, Roger]]. [http://keiapl.org/rhui/remember.htm "Remembering Ken Iverson"]. 2004-11.</ref> | |||
In 1990 Hui and Iverson joined Iverson Software Inc. (now [[Jsoftware]]), which had been founded that year by [[Eric Iverson]] to sell a [[SHARP APL]] product. Eric converted his SHARP [[session]] to use with J as Hui continued on the core language's implementation. The J language, including Eric's session environment, was first released at [[APL90]] in Copenhagen August 1990.<ref name="remembering"/> | |||
== Versions == | |||
J has used two numbering systems. Releases prior to 1994 used a single decimal and the naming scheme "Version X.Y", while those after used two decimals and are called "Release X.YY", or "JXYY" as in "J807". | |||
{|class=wikitable | |||
! Version !! Date !! Features | |||
|- | |||
| 2.0 || 1990-08-09 || (APL90) | |||
|- | |||
| 2.7 || 1990-10-22 || [[Rank operator|Rank]] with a function right operand, [[Under]] | |||
|- | |||
| 2.8 || 1990-11-15 || | |||
|- | |||
| 2.9 || 1991-02-15 || Monadic <syntaxhighlight lang=j inline>+:</syntaxhighlight> (double), <syntaxhighlight lang=j inline>-:</syntaxhighlight> (halve), <syntaxhighlight lang=j inline>*:</syntaxhighlight> (square), dyadic <syntaxhighlight lang=j inline>":</syntaxhighlight> ([[Format]]), constant functions <syntaxhighlight lang=j inline>0:</syntaxhighlight> and <syntaxhighlight lang=j inline>1:</syntaxhighlight> | |||
|- | |||
| 3.0 || 1991-03-17 || Changes to spellings, [[Reverse]] with [[Variant]] to specify [[fill]] | |||
|- | |||
| 3.1 || 1991-05-17 || [[Determinant]] (<syntaxhighlight lang=j inline>.</syntaxhighlight>) | |||
|- | |||
| 3.2 || 1991-06-02 || <syntaxhighlight lang=j inline>,.</syntaxhighlight> for ravel items (like [[Table]]) and append lists, <syntaxhighlight lang=j inline>;</syntaxhighlight> for [[Raze]] and [[Link]], <syntaxhighlight lang=j inline>@.</syntaxhighlight> for agenda, non-[[close composition]]s | |||
|- | |||
| 3.3 || 1991-06-25 || Dyadic <syntaxhighlight lang=j inline>,.</syntaxhighlight> changed to append items, more types of trains | |||
|- | |||
| 3.4 || 1991-07-15 || <syntaxhighlight lang=j inline>NB.</syntaxhighlight> for comments | |||
|- | |||
| 4.0 || 1991-11-23 || Monadic <syntaxhighlight lang=j inline>+.</syntaxhighlight> and <syntaxhighlight lang=j inline>*.</syntaxhighlight> for complex components and phase/magnitude with <syntaxhighlight lang=j inline>j.</syntaxhighlight> and <syntaxhighlight lang=j inline>r.</syntaxhighlight> to recombine, <syntaxhighlight lang=j inline>^:_</syntaxhighlight> for power limit | |||
|- | |||
| 4.1 || 1992-02-02 || <syntaxhighlight lang=j inline>^!.p</syntaxhighlight> for rising/falling factorials | |||
|- | |||
| 4.2 || 1992-03-19 || | |||
|- | |||
| 5.0 || 1992-06-22 || [[Variant]] to specify [[comparison tolerance]] and [[fill]] for [[Take]] | |||
|- | |||
| 5.1 || 1992-07-28 || <syntaxhighlight lang=j inline>f.</syntaxhighlight> to expand a tacit function containing names, constant functions <syntaxhighlight lang=j inline>2:</syntaxhighlight> to <syntaxhighlight lang=j inline>9:</syntaxhighlight> | |||
|- | |||
| 5.1a || 1992-08-11 || | |||
|- | |||
| 6.0 || 1992-10-24 || Error handling with <syntaxhighlight lang=j inline>::</syntaxhighlight>, additional [[system function]]s | |||
|- | |||
| 6.1 || 1992-11-26 || [[Amend]] operator <syntaxhighlight lang=j inline>}</syntaxhighlight> | |||
|- | |||
| 6.2 || 1992-12-20 || Derivative operator <syntaxhighlight lang=j inline>D.</syntaxhighlight> | |||
|- | |||
| 7.0 || 1993-11-14 || [[wikipedia:Taylor series|Taylor series]] operators <syntaxhighlight lang=j inline>t.</syntaxhighlight> and <syntaxhighlight lang=j inline>T.</syntaxhighlight> | |||
|} | |||
{|class=wikitable | |||
! Release !! Date !! Features | |||
|- | |||
| 2.01 || 1994-09-01 || [[Control structure]]s, many additional [[system function]]s | |||
|- | |||
| 2.03 || 1994-09-21 || | |||
|- | |||
| 2.04 || 1994-11-28 || | |||
|- | |||
| 2.05 || 1995-02-26 || Additional [[inverse]]s, [[primitive array]] <syntaxhighlight lang=j inline>a:</syntaxhighlight> ("ace") | |||
|- | |||
| 2.06 || 1995-05-30 || More [[inverse]]s, hypergeometric operator <syntaxhighlight lang=j inline>H.</syntaxhighlight>, and prime functions <syntaxhighlight lang=j inline>p.</syntaxhighlight>, <syntaxhighlight lang=j inline>p:</syntaxhighlight>, and <syntaxhighlight lang=j inline>q:</syntaxhighlight> | |||
|- | |||
| 3.01 || 1996-01-16 || Repeatable [[Roll]]/[[Deal]] <syntaxhighlight lang=j inline>?.</syntaxhighlight>, [[Depth]] <syntaxhighlight lang=j inline>L.</syntaxhighlight> and [[Depth operator]] <syntaxhighlight lang=j inline>L:</syntaxhighlight>, [[total array ordering]] | |||
|- | |||
| 3.02 || 1996-06-24 || [[Pick]] variant <syntaxhighlight lang=j inline>{::</syntaxhighlight>, [[extended precision]] types | |||
|- | |||
| 3.03 || 1996-12-13 || [[Multiple assignment]] using a string target | |||
|- | |||
| 3.04 || 1997-05-19 || More operators with gerund operands, <syntaxhighlight lang=j inline>for.</syntaxhighlight> and <syntaxhighlight lang=j inline>select.</syntaxhighlight> [[control structure]]s | |||
|- | |||
| 3.05 || 1997-09-27 || Extended dyad <syntaxhighlight lang=j inline>q:</syntaxhighlight> ([[Factor]]) to take a negative left argument | |||
|- | |||
| 4.01 || 1998-03-22 || [[Find]] (<syntaxhighlight lang=j inline>E.</syntaxhighlight>) and [[Index of Last]] (<syntaxhighlight lang=j inline>i:</syntaxhighlight>) | |||
|- | |||
| 4.02 || 1998-11-07 || Symmetric range monad (<syntaxhighlight lang=j inline>i:</syntaxhighlight>), infinite left arguments to [[Take]] | |||
|- | |||
| 4.03 || 1999-04-21 || | |||
|- | |||
| 4.04 || 2000-01-02 || [[Sparse array]] support | |||
|- | |||
| 4.05 || 2000-09-05 || [[Comparison tolerance]] for [[Key]] | |||
|- | |||
| 4.06 || 2001-05-09 || <syntaxhighlight lang=j inline>assert.</syntaxhighlight> and <syntaxhighlight lang=j inline>throw.</syntaxhighlight>, Symbols (<syntaxhighlight lang=j inline>s:</syntaxhighlight>) and Unicode (<syntaxhighlight lang=j inline>u:</syntaxhighlight>), multiple axes in [[Cut]] operator | |||
|- | |||
| 5.01 || 2002-09-10 || Non-[[Close composition|close]] [[Under]] <syntaxhighlight lang=j inline>&.:</syntaxhighlight>, Bitwise Operations (<syntaxhighlight lang=j inline>b.</syntaxhighlight>), Polynomial Derivative (<syntaxhighlight lang=j inline>p..</syntaxhighlight>), Head (<syntaxhighlight lang=j inline>{.</syntaxhighlight>) and Tail (<syntaxhighlight lang=j inline>{:</syntaxhighlight>) allow [[empty]] arguments | |||
|- | |||
| 5.02 || 2003-05-21 || | |||
|- | |||
| 5.03 || 2004-03-19 || [[Indices]] (<syntaxhighlight lang=j inline>I.</syntaxhighlight>), Sequential Machine (<syntaxhighlight lang=j inline>;:</syntaxhighlight>) | |||
|- | |||
| 5.04 || 2005-03-18 || J64 (64-bit version) introduced, boxed right argument for [[Power operator]], [[scalar extension]] for left argument of [[Cut]] (<syntaxhighlight lang=j inline>;.</syntaxhighlight>) | |||
|- | |||
| 6.01 || 2006-07-21 || Noun left arguments in trains (<syntaxhighlight lang=j inline>N0 V1 V2</syntaxhighlight>), dots removed from explicit argument names (<syntaxhighlight lang=j inline>y.</syntaxhighlight> to <syntaxhighlight lang=j inline>y</syntaxhighlight>, etc.), [[Interval Index]] (<syntaxhighlight lang=j inline>I.</syntaxhighlight>) | |||
|- | |||
| 6.02 || 2008-02-29 || [[Index Of]] (<syntaxhighlight lang=j inline>i.</syntaxhighlight>) extended to allow unmatched cell shapes, Memoize adverb (<syntaxhighlight lang=j inline>M.</syntaxhighlight>) | |||
|- | |||
| 7.01 || 2010-08-05 || GTK IDE | |||
|- | |||
| 7.02 || || | |||
|- | |||
| 8.01 || 2014-02 || Qt IDE | |||
|- | |||
| 8.02 || 2014-08-02 || Qt IDE improved | |||
|- | |||
| 8.03 || 2014-12-09 || Native read/write of jpeg and png images | |||
|- | |||
| 8.04 || 2016-01-04 || | |||
|- | |||
| 8.05 || 2016-12-19 || Improved UTF-8 handling, memory allocator rewritten with more in-place argument usage | |||
|- | |||
| 8.06 || 2017-11-12 || Allow array right operands to [[Atop]] and Adverse (<syntaxhighlight lang=j inline>::</syntaxhighlight>), treating as constant functions, improved [[Vector instructions|vector instruction]] usage | |||
|- | |||
| 8.07 || 2018-10-08 || Removed support for dot-style explicit arguments (e.g. <syntaxhighlight lang=j inline>y.</syntaxhighlight>) | |||
|- | |||
| 9.01 || 2019-12-15 || Iteration primitives <syntaxhighlight lang=j inline>F..</syntaxhighlight>, <syntaxhighlight lang=j inline>F.:</syntaxhighlight>, <syntaxhighlight lang=j inline>F.</syntaxhighlight>, <syntaxhighlight lang=j inline>F:.</syntaxhighlight>, <syntaxhighlight lang=j inline>F::</syntaxhighlight>, <syntaxhighlight lang=j inline>F:</syntaxhighlight>; Remove calculus operators <syntaxhighlight lang=j inline>d.</syntaxhighlight>, <syntaxhighlight lang=j inline>D.</syntaxhighlight>, <syntaxhighlight lang=j inline>D:</syntaxhighlight>, <syntaxhighlight lang=j inline>t.</syntaxhighlight>, <syntaxhighlight lang=j inline>t:</syntaxhighlight>, <syntaxhighlight lang=j inline>T.</syntaxhighlight>, <syntaxhighlight lang=j inline>..</syntaxhighlight>, <syntaxhighlight lang=j inline>.:</syntaxhighlight>; <syntaxhighlight lang=j inline>gerund"r</syntaxhighlight> | |||
|- | |||
| 9.02 || 2020-12-13 || "Direct definition" syntax for explicit functions, special semidual form <syntaxhighlight lang=j inline>u&.:(a:`v)</syntaxhighlight> added, minor incompatible changes | |||
|- | |||
| 9.03 || 2021-12-17 || Modifier trains and other combinations, foreigns to enable nameref caching, Kahan summation with <syntaxhighlight lang=j inline>+/!.0</syntaxhighlight> | |||
|} | |||
== References == | |||
<references /> | |||
{{APL dialects}}[[Category:Array languages]][[Category:Flat array languages]][[Category:Leading axis languages]][[Category:Languages with tacit programming]][[Category:ASCII languages]] |