J (programming language)

J (programming language)

:"Not to be confused with the J++ or J# programming languages."

Infobox programming language
name = J

paradigm = array, functional, function-level, tacit
year = 1990
designer = Ken Iverson & Roger Hui
developer = JSoftware
latest release version = J601
latest release date =
typing = strong
implementations = J
dialects =
influenced_by = APL, FP, FL
influenced =
operating_system =
license =
website = http://www.jsoftware.com/

The J programming language, developed in the early 1990s by Ken Iverson and Roger Hui, is a synthesis of APL (also by Iverson) and the FP and FL function-level languages created by John Backus.

To avoid repeating the APL special character problem, J requires only the basic ASCII character set, resorting to the use of "digraphs" formed using the dot or colon characters to extend the meaning of the basic characters available. Additionally, to keep parsing and the language simple, and to extend the otherwise small number of suitable symbols in ASCII, J treats many characters which normally appear in pairs such as [] {} "" `` or <>, not as individual, stand alone tokens, but as digraphs, J treats them as multi-character tokens.

Being an array programming language, J is very terse and powerful, and is most suited to mathematical and statistical programming, especially when performing operations on matrices. J is a MIMD language.

Like the original FP/FL languages, J supports function-level programming (also known as "higher-order functional programming"), via its "tacit programming" features (note that function-level programming is not the same as functional programming).

Unlike most languages that support object-oriented programming, J's flexible hierarchical namespace scheme (where every name exists in a particular "locale") can be effectively used as a framework for both class-based "and" prototype-based object oriented programming.

J is not a von Neumann programming language, however, it is possible to use the von Neumann programming style.

Examples

J permits point-free style and function composition. Thus, its programs can be very terse, but are also prone to code obfuscation.

The hello world program in J is

'Hello, world!'

This implementation of hello world reflects the traditional use of J -- programs are entered into a J interpreter session, and the results of expressions are displayed. It's also possible to arrange for J scripts to be executed as standalone programs, but the mechanisms for associating a script with the interpreter are system dependent. Here's how this might look on a unix system:

#!/bin/jc echo 'Hello, world!' exit "

But many accomplished J programmers never resort to such mechanisms.

Historically, APL used / to indicate the fold, so +/1 2 3 was equivalent to 1+2+3. Meanwhile, division was represented with the classic mathematical division symbol, which was implemented by printing a minus sign and a colon on the same spot on a piece of paper. Because ASCII does not support overstrikes, and does not include a division symbol, J uses % to represent division -- this almost looks like that division symbol. (This illustrates something of the mnemonic character of J's tokens, and some of the quandaries imposed by the use of ASCII.)

Here's a J program to calculate the average of a list of numbers:

avg=: +/ % # avg 1 2 3 4 2.5

# counts the number of items in the array. +/ sums the items of the array. % divides the sum by the number of items. Note: avg is a train of verbs known as a fork. Specifically (V0 V1 V2) Ny is the same as (V0 Ny) V1 (V2 Ny) which shows some of the power of J. (Here V0, V1, V2 denote verbs and Ny denotes a noun.)

Some examples of using avg :

v=: ?. 20 $ 100 NB. a random vector v 46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 avg v 59.2 4 avg v NB. moving average on periods of size 4 58 60 56 51.25 52.5 54 67.75 64.25 69.5 57.75 38.75 40 43.5 59.75 70.25 80 72.5 m=: ?. 4 5 $ 50 NB. a random matrix m 46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12 avg"1 m NB. apply avg to each rank 1 subarray (each row) of m 17.2 22 21.2 26.4

Rank is a crucial concept in J. Its significance in J is similar to the significance of "select" in SQL and of "while" in C.

Here is an implementation of quicksort, from the J Dictionary:

sel=: adverb def 'u # [' quicksort=: verb define if. 1 >: #y do. y else. (quicksort y sel e=.y{~?#y end. )

The following is an implementation of quicksort demonstrating tacit programming. Tacit programming involves composing functions together and not referring explicitly to any variables. J's support for "forks" and "hooks" dictates rules on how arguments applied to this function will be applied to its component functions.

quicksort=: (($:@(<# [) , (=# [) , $:@(># [)) ({~ ?@#)) ^: (1<#)

The following expression exhibits pi with n digits and demonstrates the extended precision capabilities of J:

n=: 50 NB. set n as the number of digits required <.@o. 10x^n NB. extended precision 10 to the nth * pi 314159265358979323846264338327950288419716939937510

Also have a look at Cliff Reiter's implementation of Conway's game of life at http://ww2.lafayette.edu/~reiterc/j/vector/vlife_index.html

Data types and structures

J supports three simple types:

* Numeric
* Literal (Character)
* Boxed

Of these, numeric has the most variants.

One of J's numeric types is the bit. There are two bit values: 0, and 1. Additionally, bits can be formed into lists. For example, 1 0 1 0 1 1 0 0 is a list of eight bits. And, syntactically, the J parser treats that as a single word (space characters are recognized as a word forming character when they're between what would otherwise be numeric words). Lists of arbitrary length are supported.

Furthermore, J supports all the usual binary operations on these lists, such as and, or, exclusive or, rotate, shift, not, etc. For example,

1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. or 1 1 0 1 1 0 1 0 3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. rotate 1 0 0 1 1 1 1 1 1 0 1

Note that J also supports higher order arrays of bits -- they can be formed into two-dimensional, three-dimensional, etc. arrays. The above operations perform equally well on these arrays.

Other numeric types include integer (3, 42), floating point (3.14, 8.8e22), complex (0j1, 2.5j3e88), extended precision integer (12345678901234567890x), and (extended precision) rational fraction (1r2, 3r4). As with bits, these can be formed into lists or arbitrarily dimensioned arrays. As with bits, operations are performed on all numbers in an array.

Lists of bits can be converted to integer using the #. verb. Integers can be converted to lists of bits using the #: verb. (And, when parsing J, . and : are word forming characters. They're never tokens by themselves unless preceded by a space.)

J also supports the literal (character) type. Literals are enclosed in quotes, for example, 'a' or 'b'. Lists of literals are also supported using the usual convention of putting multiple characters in quotes, such as 'abcdefg'. Typically, individual literals are 8-bits wide (ascii), but J also supports other literals (unicode). Numeric and boolean operations are not supported on literals, but collection oriented operations (such as rotate) are supported.

Finally, there's the boxed data type. Typically, data is put in a box using the < operation (without any left argument -- if there's a left argument, this would be the 'less than' operation). This is analogous to C's & operation (without any left argument). However, where the result of C's & has reference semantics, the result of J's < has value semantics. In other words, < is a function and it produces a result. The result has 0 dimensions, regardless of the structure of the contained data. From the viewpoint of a J programmer, < 'puts the data into a box' and lets the programmer work with an array of boxes (it can be assembled with other boxes, and/or additional copies can be made of the box). Boxed data is displayed by J, somewhat after the fashion some SQL interpreters decorate table results from select statements.

<1 0 0 1 0 +---------+
1 0 0 1 0
+---------+

The only collection type offered by J is the arbitrarily dimensioned array. Most algorithms can be expressed very concisely using operations on these arrays.

J's arrays are homogenously typed, for example the list 1 2 3 is a list of integers despite the fact that 1 is a bit. For the most part, these sorts of type issues are transparent to the programmer. Only certain specialized operations reveal differences in type. For example, the list 1.0 0.0 1.0 0.0 would be treated exactly the same, by most operations, as the list 1 0 1 0.

J also supports sparse numeric arrays where non-zero values are stored with their indices. This is an efficient mechanism where relatively few values are non-zero.

J also [http://www.jsoftware.com/help/learning/25.htm supports objects and classes] , but these are an artifact of the way things are named, and are not data types in and of themselves. Instead, boxed literals are used to refer to objects (and classes). J data has value semantics, but objects and classes need reference semantics.

Another pseudo-type -- associated with name, rather than value -- is the memory mapped file.

Dictionary

J's documentation, unlike that of most other programming languages, is organized as a [http://jsoftware.com/help/dictionary/contents.htm dictionary] , with words in J identified as [http://jsoftware.com/help/dictionary/dicta.htm nouns] , [http://jsoftware.com/help/dictionary/dictb.htm verbs] , [http://jsoftware.com/help/dictionary/dictc.htm adverbs, conjunctions] , and so on. The [http://www.jsoftware.com/help/dictionary/partsofspeech.htm parts of speech] are indicated using markup. Note that verbs have two forms -- monads (arguments only on the right) and dyads (arguments on the left and on the right). For example, in '-1' the hyphen is a monad, and in '3-2' the hyphen is a dyad. The monad definition is mostly independent of the dyad definition, regardless of whether the verb is a primitive verb or a derived verb.

Control structures

J provides control structures [http://jsoftware.com/help/dictionary/ctrl.htm (details here)] similar to other procedural languages. The controls are:
* assert. T
* break.
* continue.

* for. T do. B end.
* for_xyz. T do. B end.

* goto_name.
* label_name.

* if. T do. B end.
* if. T do. B else. B1 end.
* if. T do. B
* elseif. T1 do. B1
* elseif. T2 do. B2
* end.

* return.

* select. T
* case. T0 do. B0
* fcase. T1 do. B1
* case. T2 do. B2
* end.

* throw.
* try. B catch. B1 catchd. B2 catcht. B3 end.

* while. T do. B end.
* whilst. T do. B end.

ee also

* APL programming language, predecessor to J
* A+ programming language, a dialect of APL
* K, another programming language influenced by APL.

External links

* [http://www.jsoftware.com JSoftware] - Creators of J (currently free for all uses)
* [http://www.jsoftware.com/jwiki/FrontPage J Wiki] - Showcase, documentation, articles, etc.
* [http://www.jsoftware.com/forums.htm J Forum Archives] - Discussion of the language
* [http://ww2.lafayette.edu/~reiterc Cliff Reiter] - Chaos, fractals and mathematical symmetries... in J
* [http://www.ewartshaw.co.uk/ Ewart Shaw] - Bayesian inference, medical statistics, and numerical methods, using J
* [http://www.cs.ualberta.ca/~smillie Keith Smillie] - Statistical applications of array programming languages, especially J
* [http://www.cs.trinity.edu/~jhowland John Howland] - Research on parallelization of array programming languages, especially J


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Look at other dictionaries:

  • Programming language — lists Alphabetical Categorical Chronological Generational A programming language is an artificial language designed to communicate instructions to a machine, particularly a computer. Programming languages can be used to create programs that… …   Wikipedia

  • Programming language theory — (commonly known as PLT) is a branch of computer science that deals with the design, implementation, analysis, characterization, and classification of programming languages and programming language features. It is a multi disciplinary field, both… …   Wikipedia

  • Programming Language Design and Implementation — (PLDI) is one of the ACM SIGPLAN s most important conferences. The precursor of PLDI was the Symposium on Compiler Optimization, held July 27–28, 1970 at the University of Illinois at Urbana Champaign and chaired by Robert S. Northcote. That… …   Wikipedia

  • Programming Language for Business — or PL/B is a business oriented programming language originally called DATABUS and designed by Datapoint in the early 1970s as an alternative to COBOL because its 8 bit computers could not fit COBOL into their limited memory, and because COBOL did …   Wikipedia

  • programming language — ➔ language * * * programming language UK US noun [C] ► COMPUTER LANGUAGE(Cf. ↑computer language) …   Financial and business terms

  • programming language — Language Lan guage, n. [OE. langage, F. langage, fr. L. lingua the tongue, hence speech, language; akin to E. tongue. See {Tongue}, cf. {Lingual}.] [1913 Webster] 1. Any means of conveying or communicating ideas; specifically, human speech; the… …   The Collaborative International Dictionary of English

  • Programming Language One — Programming Language One, oft als PL/I (auch PL/1, PL1 oder PLI) abgekürzt ist eine Programmiersprache, die in den 1960er Jahren von IBM entwickelt wurde. Die Bezeichnung PL/1 ist vor allem in Deutschland gebräuchlich. Ursprünglich wurde PL/I… …   Deutsch Wikipedia

  • Programming Language 1 — noun A computer programming language which combines the best qualities of commercial and scientific oriented languages (abbrev PL/1) • • • Main Entry: ↑programme …   Useful english dictionary

  • Programming Language —   [engl.], Programmiersprache …   Universal-Lexikon

  • Programming language specification — A programming language specification is an artifact that defines a programming language so that users and implementors can agree on what programs in that language mean.A programming language specification can take several forms, including the… …   Wikipedia

  • programming language — noun (computer science) a language designed for programming computers • Syn: ↑programing language • Topics: ↑computer science, ↑computing • Hypernyms: ↑artificial language …   Useful english dictionary

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”