Jプログラミング言語は、1990年代初頭にケネス・E・アイバーソンとロジャー・ホイによって開発された[ 5 ] [ 6 ]配列プログラミング言語で、主にAPL(これもアイバーソンによる)に基づいています。
APLの特殊文字の問題を繰り返さないために、Jは基本的なASCII文字セットのみを使用し、ドットとコロンを屈折記号[ 7 ]として使用して、二重音字に似た短い単語を形成します。このような基本的な(または原始的な)Jの単語のほとんどは数学記号として機能し、ドットまたはコロンによって使用可能な基本文字の意味が拡張されます。また、他の言語ではしばしばペアにする必要がある多くの文字(やなど[] {} "" ``)<>は、Jでは単独の単語として、または屈折している場合は複数文字の単語の単一文字の語根として扱われます。
Jは非常に簡潔な配列プログラミング言語であり、特に行列演算を行う場合など、数学的および統計的プログラミングに最適です。また、エクストリームプログラミング[ 8 ]やネットワークパフォーマンス分析[ 9 ]にも使用されています。
ジョン・バッカスが開発した言語FPやFLと同様に、Jは暗黙的なプログラミング機能を通じて関数レベルプログラミングをサポートしています。
オブジェクト指向プログラミングをサポートするほとんどの言語とは異なり、Jの柔軟な階層型名前空間スキーム(すべての名前が特定のロケールに存在する)は、クラスベースとプロトタイプベースの両方のオブジェクト指向プログラミングのフレームワークとして効果的に使用できます。
2011年3月以降、JはGNU一般公衆利用許諾契約書バージョン3(GPLv3)に基づくフリーかつオープンソースのソフトウェアです。[ 10 ] [ 11 ] [ 12 ]また、交渉済みのライセンスに基づいてソースコードを購入することもできます。[ 13 ]
J言語は、ポイントフリーのスタイルと関数合成を可能にする。そのため、J言語で書かれたプログラムは非常に簡潔になりがちで、一部のプログラマーからは読みにくいと感じられる。
J言語で記述された「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.は、任意のサイズの配列内を検索して一致するものを見つけます。
3 1 4 1 5 9 i . 3 1 NB. 3 と1 0 1 の最初の出現のインデックスを見つけます。3 1 4 1 5 9 i : 3 1 NB. 3 と 1 0 3の最後の出現のインデックスを見つけます。ユーザープログラムは、プリミティブが許可されている場所であればどこでも名前を付けて使用できます。
J の力は主にその修飾語に由来します。修飾語とは、名詞や動詞をオペランドとして受け取り、指定された方法でオペランドを適用する記号です。たとえば、修飾語/ は、左側の動詞という 1 つのオペランドを受け取り、その動詞を引数の各項目間に適用する動詞を生成します。つまり、+/は「引数の各項目間に+を適用する」と定義される動詞です。したがって、次の文は
+/ 1 2 3 4 5効果を生み出す
1 + 2 + 3 + 4 + 5+/ 1 2 3 4 5 15Jには、このような修飾語が約20種類あります。これらはすべて、ユーザーが作成した動詞を含むあらゆる動詞に適用でき、ユーザーは独自の修飾語を作成することもできます。修飾語は個々に強力ですが、
修飾子の中には、コンポーネントの実行順序を制御するものがあり、修飾子を任意の順序で組み合わせることで、実用的なプログラミングに必要な無限の種類の演算を実現できます。
Jは3つのシンプルな型をサポートしています。
これらのうち、数値型が最も多くのバリエーションを持つ。
J の数値型の 1 つはビットです。ビット値には0と1 の2 種類があります。また、ビットはリストとして構成することもできます。たとえば、 1 0 1 0 1 1 0 0 は 8 ビットのリストです。構文的には、J パーサーはこれを 1 つのワードとして扱います。(スペース文字は、本来数値ワードとなるはずの要素間のワード形成文字として認識されます。)任意の長さのリストがサポートされています。
さらに、J はこれらのリストに対して、and、or、排他的 or、rotate、shift、notなどの通常の二項演算をすべてサポートしています。たとえば、
1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. または1 1 0 1 1 0 1 0
3 |. 1 0 1 1 0 0 1 1 1 1 1 注:回転1 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.