J: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
m (Text replacement - "Category:Array languages" to "")
m (Influenced Jelly, Uiua, TinyAPL)
 
(3 intermediate revisions by the same user not shown)
Line 9: Line 9:
| released              = 1990
| released              = 1990
| developer              = [[Jsoftware]] ([[Ken Iverson]], [[Roger Hui]])
| developer              = [[Jsoftware]] ([[Ken Iverson]], [[Roger Hui]])
| latest release version = J9.5 / 2023-04-23
| latest release version = J9.5 / 2023-12-20
| influenced by          = [[SAX]], [[Rationalized APL]]
| influenced by          = [[SAX]], [[Rationalized APL]]
| influenced            = [[Dyalog APL]], [[NARS2000]], [[I]], [[BQN]]
| influenced            = [[Dyalog APL]], [[NARS2000]], [[Jelly]], [[I]], [[BQN]], [[Uiua]], [[TinyAPL]]
| implementation language= [[wikipedia:C (programming language)|C]]
| implementation language= [[wikipedia:C (programming language)|C]]
| source                = [https://github.com/jsoftware/jsource GitHub]
| source                = [https://github.com/jsoftware/jsource GitHub]
Line 38: Line 38:
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,<ref>[[Roger Hui]] and [[Morten Kromberg]]. [https://dl.acm.org/doi/abs/10.1145/3386319 ''APL since 1978'']. §10.2 What's in a Name?. ACM [[HOPL]] IV. 2020-06.</ref> 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 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,<ref>[[Roger Hui]] and [[Morten Kromberg]]. [https://dl.acm.org/doi/abs/10.1145/3386319 ''APL since 1978'']. §10.2 What's in a Name?. ACM [[HOPL]] IV. 2020-06.</ref> 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"/>
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"/> Hui, both Iversons, and new hire [[Chris Burke]] continued working on the J's implementation, and applications, in the following years.
 
The J source code was made open under the GPL in March 2011.<ref>[[Eric Iverson]]. [http://www.jsoftware.com/pipermail/programming/2011-March/022121.html "J Source GPL"]. 2011-03-02.</ref> However, this move did not immediately bring in outside developers; rather, as Ken Iverson had died in 2004, and Roger Hui started a new job at [[Dyalog Ltd.]] in 2011, this was a time of little development for J. Eric Iverson continued work on the development environment including new Qt- and browser-based IDEs. Since 2016,<ref>[[Eric Iverson]]. [http://www.jsoftware.com/pipermail/programming/2016-August/045630.html "j805-beta-11 release candidates"]. 2016-08-23.</ref> [[Henry Rich]] has lead development of the interpreter, making performance improvements as well as extending and adding primitives and other functionality.


== Versions ==
== 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".
J has used multiple 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". Since version 9.4, or "J9.4", they again remove the leading zero and use a third decimal to indicate revisions within a version (as in "9.4.2"; revision 0 indicates beta or pre-release revisions).


{|class=wikitable
{|class=wikitable
Line 139: Line 141:
| 8.01 || 2014-02    || Qt IDE
| 8.01 || 2014-02    || Qt IDE
|-
|-
| 8.02 || 2014-08-02 || Qt IDE improved
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J802 8.02] || 2014-08-02 || Qt IDE improved
|-
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J803 8.03] || 2014-12-09 || Native read/write of jpeg and png images
|-
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J804 8.04] || 2016-01-04 ||
|-
|-
| 8.03 || 2014-12-09 || Native read/write of jpeg and png images
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J805 8.05] || 2016-12-19 || Improved UTF-8 handling, memory allocator rewritten with more in-place argument usage
|-
|-
| 8.04 || 2016-01-04 ||
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J806 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.05 || 2016-12-19 || Improved UTF-8 handling, memory allocator rewritten with more in-place argument usage
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J807 8.07] || 2018-10-08 || Removed support for dot-style explicit arguments (e.g. <syntaxhighlight lang=j inline>y.</syntaxhighlight>)
|-
|-
| 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
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J901 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>
|-
|-
| 8.07 || 2018-10-08 || Removed support for dot-style explicit arguments (e.g. <syntaxhighlight lang=j inline>y.</syntaxhighlight>)
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J902 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.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>
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J903 9.03] || 2021-12-17 || Modifier trains and other combinations, foreigns to enable nameref caching, Kahan summation with <syntaxhighlight lang=j inline>+/!.0</syntaxhighlight><ref>[[Array Cast]] episode 18: [https://www.arraycast.com/episodes/episode18-henry-rich-presents-j903 Henry Rich presents J903]</ref>
|-
|-
| 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
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J9.4 9.4] || 2023-03-01 || Threading using <syntaxhighlight lang=j inline>T.</syntaxhighlight> and <syntaxhighlight lang=j inline>t.</syntaxhighlight>,<ref>[[Array Cast]] episode 48: [https://www.arraycast.com/episodes/episode48-henry-rich Henry Rich Reveals J with Threads J9.4]</ref> [[Key]]-like <syntaxhighlight lang=j inline>/..</syntaxhighlight>, reimplementation of exact integers and rationals with [[wikipedia:GNU Multiple Precision Arithmetic Library|GMP]]<ref>[[Array Cast]] episode 59: [https://www.arraycast.com/episodes/episode59-raul-miller Raul Miller - Precision]</ref>
|-
|-
| 9.03 || 2021-12-17 || Modifier trains and other combinations, foreigns to enable nameref caching, Kahan summation with <syntaxhighlight lang=j inline>+/!.0</syntaxhighlight>
| [https://code.jsoftware.com/wiki/System/ReleaseNotes/J9.5 9.5] || 2023-12-20 || Modular arithmetic (<syntaxhighlight lang=j inline>m.</syntaxhighlight>), changes and restrictions to [[Select]] (<syntaxhighlight lang=j inline>{</syntaxhighlight>) and [[Amend]] (<syntaxhighlight lang=j inline>}</syntaxhighlight>), limited [[structural Under]] support<ref>[[Array Cast]] episode 73: [https://www.arraycast.com/episodes/episode73-j95 Henry Rich and the Release of J9.5]</ref>
|}
|}



Latest revision as of 12:14, 29 August 2024

J is an array language loosely following the SHARP APL tradition which uses 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 scans and windowed reductions (yielding the prefix and infix operators). However, J concepts such as function trains 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 (.) or colons (:). It is also notable for its use of terms from English grammar to describe the language. For example, functions are called "verbs" while arrays are called "nouns".

History

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"[1] he gives the following as the most important goals for a new language:

  • 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 trains 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 C. Iverson shared the program with Roger Hui, who began working on J on August 27 and quickly produced a more complete prototype.[1][2][3] The name "J", chosen by Hui when saving the first source code file,[4] is meaningless: in An Implementation of J, Hui remarks "Why 'J'? It is easy to type."[5] J was first presented by Hui and Iverson, including a live demo, at a meeting of the Toronto APLSIG in February 1990.[6]

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.[6] Hui, both Iversons, and new hire Chris Burke continued working on the J's implementation, and applications, in the following years.

The J source code was made open under the GPL in March 2011.[7] However, this move did not immediately bring in outside developers; rather, as Ken Iverson had died in 2004, and Roger Hui started a new job at Dyalog Ltd. in 2011, this was a time of little development for J. Eric Iverson continued work on the development environment including new Qt- and browser-based IDEs. Since 2016,[8] Henry Rich has lead development of the interpreter, making performance improvements as well as extending and adding primitives and other functionality.

Versions

J has used multiple 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". Since version 9.4, or "J9.4", they again remove the leading zero and use a third decimal to indicate revisions within a version (as in "9.4.2"; revision 0 indicates beta or pre-release revisions).

Version Date Features
2.0 1990-08-09 (APL90)
2.7 1990-10-22 Rank with a function right operand, Under
2.8 1990-11-15
2.9 1991-02-15 Monadic +: (double), -: (halve), *: (square), dyadic ": (Format), constant functions 0: and 1:
3.0 1991-03-17 Changes to spellings, Reverse with Variant to specify fill
3.1 1991-05-17 Determinant (.)
3.2 1991-06-02 ,. for ravel items (like Table) and append lists, ; for Raze and Link, @. for agenda, non-close compositions
3.3 1991-06-25 Dyadic ,. changed to append items, more types of trains
3.4 1991-07-15 NB. for comments
4.0 1991-11-23 Monadic +. and *. for complex components and phase/magnitude with j. and r. to recombine, ^:_ for power limit
4.1 1992-02-02 ^!.p 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 f. to expand a tacit function containing names, constant functions 2: to 9:
5.1a 1992-08-11
6.0 1992-10-24 Error handling with ::, additional system functions
6.1 1992-11-26 Amend operator }
6.2 1992-12-20 Derivative operator D.
7.0 1993-11-14 Taylor series operators t. and T.
Release Date Features
2.01 1994-09-01 Control structures, many additional system functions
2.03 1994-09-21
2.04 1994-11-28
2.05 1995-02-26 Additional inverses, primitive array a: ("ace")
2.06 1995-05-30 More inverses, hypergeometric operator H., and prime functions p., p:, and q:
3.01 1996-01-16 Repeatable Roll/Deal ?., Depth L. and Depth operator L:, total array ordering
3.02 1996-06-24 Pick variant {::, extended precision types
3.03 1996-12-13 Multiple assignment using a string target
3.04 1997-05-19 More operators with gerund operands, for. and select. control structures
3.05 1997-09-27 Extended dyad q: (Factor) to take a negative left argument
4.01 1998-03-22 Find (E.) and Index of Last (i:)
4.02 1998-11-07 Symmetric range monad (i:), 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 assert. and throw., Symbols (s:) and Unicode (u:), multiple axes in Cut operator
5.01 2002-09-10 Non-close Under &.:, Bitwise Operations (b.), Polynomial Derivative (p..), Head ({.) and Tail ({:) allow empty arguments
5.02 2003-05-21
5.03 2004-03-19 Indices (I.), Sequential Machine (;:)
5.04 2005-03-18 J64 (64-bit version) introduced, boxed right argument for Power operator, scalar extension for left argument of Cut (;.)
6.01 2006-07-21 Noun left arguments in trains (N0 V1 V2), dots removed from explicit argument names (y. to y, etc.), Interval Index (I.)
6.02 2008-02-29 Index Of (i.) extended to allow unmatched cell shapes, Memoize adverb (M.)
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 (::), treating as constant functions, improved vector instruction usage
8.07 2018-10-08 Removed support for dot-style explicit arguments (e.g. y.)
9.01 2019-12-15 Iteration primitives F.., F.:, F., F:., F::, F:; Remove calculus operators d., D., D:, t., t:, T., .., .:; gerund"r
9.02 2020-12-13 "Direct definition" syntax for explicit functions, special semidual form u&.:(a:`v) added, minor incompatible changes
9.03 2021-12-17 Modifier trains and other combinations, foreigns to enable nameref caching, Kahan summation with +/!.0[9]
9.4 2023-03-01 Threading using T. and t.,[10] Key-like /.., reimplementation of exact integers and rationals with GMP[11]
9.5 2023-12-20 Modular arithmetic (m.), changes and restrictions to Select ({) and Amend (}), limited structural Under support[12]

References

  1. 1.0 1.1 Iverson, K.E. "A Personal View of APL". IBM Systems Journal, Volume 30, Number 4. 1991-12.
  2. Hui, Roger. "Incunabulum". From An Implementation of J, Appendix A: Incunabulum, 1992-01-27.
  3. McIntyre, Donald. "A Tribute to Roger Hui, presented at APL96". 1996.
  4. Roger Hui and Morten Kromberg. APL since 1978. §10.2 What's in a Name?. ACM HOPL IV. 2020-06.
  5. Hui, Roger. An Implementation of J (pdf), Preface. 1992-01-27.
  6. 6.0 6.1 Hui, Roger. "Remembering Ken Iverson". 2004-11.
  7. Eric Iverson. "J Source GPL". 2011-03-02.
  8. Eric Iverson. "j805-beta-11 release candidates". 2016-08-23.
  9. Array Cast episode 18: Henry Rich presents J903
  10. Array Cast episode 48: Henry Rich Reveals J with Threads J9.4
  11. Array Cast episode 59: Raul Miller - Precision
  12. Array Cast episode 73: Henry Rich and the Release of J9.5
APL dialects [edit]
Maintained APL+WinAPL2APL64APL\ivApletteAprilCo-dfnsDyalog APLDyalog APL Visiondzaima/APLGNU APLKapNARS2000PometoTinyAPL
Historical A Programming LanguageA+ (A) ∙ APL#APL2CAPL\360APL/700APL\1130APL\3000APL.68000APL*PLUSAPL.jlAPL.SVAPLXExtended Dyalog APLIverson notationIVSYS/7090NARSngn/aplopenAPLOperators and FunctionsPATRowanSAXSHARP APLRationalized APLVisualAPL (APLNext) ∙ VS APLYork APL
Derivatives AHPLBQNCoSyELIGleeIIvyJJellyK (Goal, Klong, Q) ∙ KamilaLispLang5LilNialRADUiua
Overviews Comparison of APL dialectsTimeline of array languagesTimeline of influential array languagesFamily tree of array languages