The Jprogramming 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. Also, many characters which in other languages often must be paired (such as [] {} "" `` or <>) are treated by J as stand-alone words or, when inflected, as single-character roots of multi-character words.
J is a very terse array programming language, and is most suited to mathematical and statistical programming, especially when performing operations on matrices. It has also been used in extreme programming[8] and network performance analysis.[9]
Like John Backus's languages FP and FL, J supports function-level programming via its tacit programming features.
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).[10][11][12] One may also purchase source under a negotiated license.[13]
J permits point-free style and function composition. Thus, its programs can be very terse and are considered difficult to read by some programmers.
The "Hello, World!" program in J is:
'Hello, World!'この「ハローワールド」の実装は、J言語の伝統的な使い方を反映しています。つまり、プログラムはJインタープリタセッションに入力され、式の実行結果が表示されます。Jスクリプトをスタンドアロンプログラムとして実行することも可能です。Unixシステムでは、以下のように表示されます。
#!/bin/jc echo 'Hello, world!' exit ''(現在のjの実装では、jconsolejconsoleがjavaで使用されるため、jconsoleまたはjconsoleのいずれかがインストールされ、ijconsoleおそらく/usr/binまたは他のディレクトリ(macOSの場合はアプリケーションディレクトリなど)にインストールされます。したがって、ユーザーが解決しなければならないシステム依存関係が存在します。)
歴史的に、APL は折り畳み/を表すために使われていたので、 はと同等でした。一方、割り算は数学の割り算記号( ) で表されていました。+/1 2 31+2+3÷
ASCIIには除算記号が直接含まれていないため、Jは 視覚的な近似値または記憶補助として、除算を表すために%を使用します。(これは、Jのトークンの記憶補助的な性質と、ASCIIの使用によって生じるいくつかの難題を示しています。)
avg数値リストの平均を計算するJ関数を定義すると、次のようになります。
avg=:+/%# +/ 配列の要素を合計します。 # 配列内の要素数をカウントします。 % 合計を項目の数で割ります。これは関数のテスト実行です。
avg12342.5上記において、avgはフォーク+/と呼ばれる3つの動詞( 、、%および#)の連鎖を用いて定義されています。具体的には、はと同じであり、これはJの持つ力の一端を示しています。(ここで、V0、V1、およびV2は動詞を表し、Nyは名詞を表します。)(V0 V1 V2) Ny(V0(Ny)) V1 (V2(Ny))
使用例avg:
v=:?.20$100注:ランダムベクトルv46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 59.2avgv
4avg\v注:期間サイズ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.5m=:?.45$50注:ランダム行列m46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12
avg"1m注:mの各ランク1サブ配列(各行)に平均を適用します。17.2 22 21.2 26.4ランクはJにおいて重要な概念である。
J辞書からクイックソートを実装すると、次のようになります。
sel =:副詞def 'u # ['クイックソート=:動詞の定義if。1 >: #そうします。他にね。(クイックソートy < s e ) 、( y = s e ) 、クイックソートy > s e e =。y {~?# y終了。)以下は、暗黙的プログラミングを示すクイックソートの実装例です。暗黙的プログラミングとは、関数を組み合わせて、明示的に変数を参照しないプログラミング手法です。J言語のフォークとフックのサポートにより、この関数に渡される引数が、その構成要素となる関数にどのように適用されるかのルールが定められます。
クイックソート=: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )J言語におけるソートは通常、組み込みの(基本)動詞/:(ソートアップ)と\:(ソートダウン)を使用して行われます。上記のようなクイックソートなどのユーザー定義ソートは、通常、例示のみを目的としています。
次の例は、自己参照動詞を使用して$:フィボナッチ数を再帰的に計算する方法を示しています。
1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )この再帰は、動詞を名前で参照することによっても実行できますが、もちろんこれは動詞に名前が付けられている場合に限ります。
フィボナッチ=: 1 :` (フィボナッチ@-& 2 +フィボナッチ@<: ) @。( >& 2 )次の式はn桁の円周率を表しており、Jの拡張精度機能を示しています。
n=:50注:必要な桁数を n に設定してください。 注:拡張精度 10 の n 番目の * π 314159265358979323846264338327950288419716939937510<.@o.10x^n
データを入力として受け取り、データを出力として生成するプログラムまたはルーチンは、動詞と呼ばれます。Jには、複数のデータ型に対して自動的に動作する豊富な定義済み動詞セットがあります。たとえば、動詞i.は、任意のサイズの配列内を検索して一致するものを見つけます。
314159i.31NB. find the index of the first occurrence of 3, and of 101314159i:31NB. find the index of the last occurrence of 3, and of 103User programs can be named and used wherever primitives are allowed.
The power of J comes largely from its modifiers: symbols that take nouns and verbs as operands and apply the operands in a specified way. For example, the modifier / takes one operand, a verb to its left, and produces a verb that applies that verb between each item of its argument. That is, +/ is a verb, defined as 'apply + between the items of your argument' Thus, the sentence
+/12345produces the effect of
1+2+3+4+5+/1234515J has roughly two dozen of these modifiers. All of them can apply to any verb, even a user-written verb, and users may write their own modifiers. While modifiers are powerful individually, allowing
some of the modifiers control the order in which components are executed, allowing modifiers to be combined in any order to produce the unlimited variety of operations needed for practical programming.
J supports three simple types:
Of these, numeric has the most variants.
One of J's numeric types is the bit. There are two bit values: 0, and 1. Also, bits can be formed into lists. For example, 1 0 1 0 1 1 0 0 is a list of eight bits. Syntactically, the J parser treats that as one word. (The space character is recognized as a word-forming character between what would otherwise be numeric words.) Lists of arbitrary length are supported.
Further, 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. or1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. rotate1 0 0 1 1 1 1 1 1 0 1
Jは、より高次のビット配列もサポートしています。これらは、2次元、3次元などの配列に構成できます。上記の演算は、これらの配列に対しても同様に優れたパフォーマンスを発揮します。
その他の数値型には、整数(例:3、42)、浮動小数点数(3.14、8.8e22)、複素数(0j1、2.5j3e88)、拡張精度整数(12345678901234567890x)、および(拡張精度)有理数(1r2、3r4)などがあります。ビットと同様に、これらもリストまたは任意の次元の配列にまとめることができます。ビットと同様に、配列内のすべての数値に対して演算が実行されます。
ビットのリストは、動詞を使用して整数に変換できます#.。整数は、動詞を使用してビットのリストに変換できます#:。(J を解析する場合、.ピリオドとコロンは単語形成文字です。空白文字:が前に付かない限り、単独でトークンになることはありません。)
J はリテラル (文字) 型もサポートしています。リテラルは引用符で囲みます。たとえば、'a'や のように'b'なります。リテラルのリストも、複数の文字を引用符で囲むという一般的な慣例に従ってサポートされています。たとえば、 のようになります。'abcdefg'通常、個々のリテラルは 8 ビット幅 (ASCII) ですが、J は他のリテラル ( Unicode ) もサポートしています。リテラルに対して数値演算やブール演算はサポートされていませんが、コレクション指向の操作 (回転など) はサポートされています。
最後に、ボックス型データ型があります。通常、データは演算<(左引数なし。左引数がある場合は、小なり演算)を使用してボックスに格納されます。これは、 Cの演算(左引数なし)に類似しています&。ただし、C の結果が&参照セマンティクスを持つのに対し、J の結果は<値セマンティクスを持ちます。言い換えれば、<は関数であり、結果を生成します。結果は、格納されているデータの構造に関係なく、0 次元です。J プログラマの観点から見ると、<はデータをボックスに格納し、ボックスの配列を操作できるようにします(他のボックスと組み合わせたり、ボックスのコピーをさらに作成したりできます)。
<1 0 0 1 0 +---------+ |1 0 0 1 0| +---------+Jライブラリが提供するコレクション型は、任意次元配列のみです。ほとんどのアルゴリズムは、これらの配列に対する演算を用いることで非常に簡潔に表現できます。
J の配列は均一な型付けになっています。たとえば、リストはビットであっ 1 2 3 ても整数のリストです 1 。ほとんどの場合、このような型の問題はプログラマーには透過的です。特定の特殊な操作のみが型の違いを明らかにします。たとえば、リストは 1.0 0.0 1.0 0.0 ほとんどの操作でリストとまったく同じように扱われます 1 0 1 0 。
Jは、非ゼロ値がインデックスとともに格納される疎な数値配列もサポートしています。これは、非ゼロ値が比較的少ない場合に効率的な仕組みです。
J はオブジェクトとクラスもサポートしていますが、[ 14 ]これらは命名方法のアーティファクトであり、データ型ではありません。代わりに、ボックス化されたリテラルを使用してオブジェクト (およびクラス) を参照します。J データは値セマンティクスを持ちますが、オブジェクトとクラスには参照セマンティクスが必要です。
もう一つの擬似型は、値ではなく名前に関連付けられたメモリマップドファイルである。

J言語には、エラー発生時や動詞内の指定した箇所で停止する一般的な機能が備わっています。さらに、Dissectと呼ばれる独自のビジュアルデバッガがあり、単一のJ文の実行状況を2次元で対話的に表示します。J言語の1文は、低レベル言語のサブルーチン全体と同等の計算量を実行するため、このビジュアル表示は非常に役立ちます。
J のドキュメントには辞書が含まれており、J の単語は名詞、動詞、修飾語などとして識別されます。主要な単語は語彙にリストされており、それぞれの品詞はマークアップを使用して示されています。動詞には、単項動詞(引数が右側のみ)と二項動詞(引数が左側と右側の両方)の 2 つの形式があることに注意してください。たとえば、' -1' ではハイフンは単項動詞であり、' 3-2' ではハイフンは二項動詞です。動詞が原始動詞か派生動詞かに関わらず、単項動詞の定義は二項動詞の定義とはほとんど独立しています。
Jは他の手続き型言語と同様の制御構造を提供する。[ 15 ]
assert.break.continue.for.goto_label.if. else. elseif.return.select. case.throw.try. catch.while. whilst.