The J programming language, developed in the early 1990s by Kenneth E. Iverson and Roger Hui,[5][6] is an array programming language based primarily on APL (also by Iverson).
To avoid repeating the APL special-character problem, J uses only the basic ASCII character set, resorting to the use of the dot and colon as inflections[7] to form short words similar to digraphs.
Most such primary (or primitive) J words serve as mathematical symbols, with the dot or colon extending the meaning of the basic characters available.
Unlike most languages that support object-oriented programming, J's flexible hierarchical namespace scheme (where every name exists in a specific locale) can be effectively used as a framework for both class-based and prototype-based object-oriented programming.
Since March 2011, J is free and open-source software under the GNU General Public License version 3 (GPLv3).
Here's how this might look on a Unix system: (Note that current j implementations install either jconsole or (because jconsole is used by java), ijconsole and likely install this to /usr/bin or some other directory (perhaps the Application directory on OSX).
(This illustrates something of the mnemonic character of J's tokens, and some of the quandaries imposed by the use of ASCII.)
Defining a J function named avg to calculate the average of a list of numbers yields: This is a test execution of the function: Above, avg is defined using a train of three verbs (+/, %, and #) termed a fork.
J has a rich set of predefined verbs, all of which work on multiple data types automatically: for example, the verb i. searches within arrays of any size to find matches: User programs can be named and used wherever primitives are allowed.
That is, +/ is a verb, defined as 'apply + between the items of your argument' Thus, the sentence produces the effect of J has roughly two dozen of these modifiers.
Further, J supports all the usual binary operations on these lists, such as and, or, exclusive or, rotate, shift, not, etc.
Lists of literals are also supported using the usual convention of putting multiple characters in quotes, such as 'abcdefg'.
J also supports sparse numeric arrays where non-zero values are stored with their indices.
J also supports objects and classes,[14] but these are an artifact of the way things are named, and are not data types.
It also has a unique visual debugger, called Dissect, that gives a 2-D interactive display of the execution of a single J sentence.
Because a single sentence of J performs as much computation as an entire subroutine in lower-level languages, the visual display is quite helpful.
J's documentation includes a dictionary, with words in J identified as nouns, verbs, modifiers, and so on.
Primary words are listed in the vocabulary, in which their respective parts of speech are indicated using markup.