J(プログラミング言語)

J
パラダイム配列関数型オブジェクト指向クラスベースプロトタイプベース)、関数レベル暗黙的
家族APL
デザイン:ケネス・E・アイバーソンロジャー・フイ
開発者Jソフトウェア
初登場1990 (1990年
安定版リリース
J9.6 / 2025年2月25日[ 1 ] (2025年2月25日
タイピングの規律動的
OSクロスプラットフォームWindowsLinuxmacOSAndroidiOSRaspberry Pi [ 2 ]
ライセンスGPLv3
Webサイトwww.jsoftware.com
主要な実装
J
影響を受けた
APL
影響を受けた
NumPy[ 3 ] SuperCollider [ 4 ]

Jプログラミング言語は、1990年代初頭にケネス・E・アイバーソンロジャー・フイによって開発され、[ 5 ] [ 6 ]主にAPL(アイバーソンによる) に基づいた配列プログラミング言語です。

APL特殊文字問題の再発を避けるため、Jは基本的なASCII文字セットのみを使用し、ドットとコロンを屈折記号[ 7 ]として使用して、二重音字に似た短い単語を形成します。このようなJの基本(またはプリミティブ)単語のほとんどは数学記号として使用され、ドットまたはコロンは利用可能な基本文字の意味を拡張します。また、他の言語ではペアで表す必要がある多くの文字(またはなど[] {} "" ``<>は、Jでは独立した単語として扱われるか、屈折した場合は複数文字からなる単語の1文字の語根として扱われます。

Jは非常に簡潔な配列プログラミング言語であり、特に行列演算を行う数学的統計的プログラミングに最適です。また、エクストリームプログラミング[ 8 ]ネットワーク性能解析[ 9 ]にも使用されています。

John Backusの言語FPFLと同様に、 J は暗黙のプログラミング機能を通じて関数レベルのプログラミングをサポートします。

オブジェクト指向プログラミングをサポートするほとんどの言語とは異なり、J の柔軟な階層型名前空間スキーム (すべての名前が特定のロケールに存在する) は、クラスベースプロトタイプベースの両方のオブジェクト指向プログラミングのフレームワークとして効果的に使用できます。

2011年3月以降、JはGNU一般公衆利用許諾書バージョン3(GPLv3)に基づくフリーのオープンソースソフトウェアです。[ 10 ] [ 11 ] [ 12 ]また、交渉によるライセンスの下でソースコードを購入することもできます。[ 13 ]

Jはポイントフリースタイル関数合成を許容します。そのため、Jのプログラムは非常に簡潔になり、一部のプログラマーからは読みにくいとみなされることがあります。

J の 「Hello, World!」プログラムは次のとおりです。

'こんにちは世界!'

このHello Worldの実装は、Jの伝統的な使用法を反映しています。プログラムはJインタプリタセッションに入力され、式の結果が表示されます。Jスクリプトをスタンドアロンプ​​ログラムとして実行することも可能です。Unixシステムでは、以下のように表示されます

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

(現在の j 実装では、 または がインストールされますjconsole(jconsole は java によって使用されるため)。また、これは/usr/binijconsoleまたは他のディレクトリ (おそらく OSX のアプリケーション ディレクトリ)にインストールされる可能性があります。したがって、ここではユーザーが解決しなければならないシステム依存関係があります。)

歴史的に、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.5
m=:?.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 でのソートは通常、組み込みの(プリミティブな)動詞/:(sort up) と\:(sort down) を使用して実行されます。上記のクイックソートなどのユーザー定義のソートは、通常、説明のみを目的としています。

次の例は、自己参照動詞を使用して$:フィボナッチ数を再帰的に計算する方法を示しています。

1 :` ( $:@-& 2 +$:@<: ) @. ( >& 2 )

この再帰は、動詞を名前で参照することによっても実現できますが、もちろんこれは動詞に名前が付けられている場合にのみ可能です。

フィボナッチ=: 1 :` (フィボナッチ@-& 2 +フィボナッチ@<: ) @。( >& 2 )

次の式はn 桁のpiを示しており、J の拡張精度機能を示しています。

n=:50注: n を必要な桁数として設定します注: 拡張精度は 10 の n 乗 * π 314159265358979323846264338327950288419716939937510です<.@o.10x^n

動詞と修飾語

プログラムまたはルーチン(データを入力として受け取り、データを出力するもの)は、動詞と呼ばれます。J には豊富な定義済み動詞が用意されており、それらはすべて複数のデータ型に自動的に適用されます。例えば、動詞i.は任意のサイズの配列内を検索して一致を見つけます。

3 1 4 1 5 9 i . 3 1注: 3 が最初に出現するインデックスと 1 0 1 3 1 4 1 5 9 i : 3 1注: 3 が最後に出現するインデックスと 1 0 3

ユーザー プログラムは、プリミティブが許可されている場所であればどこでも名前を付けて使用できます。

Jの威力は、主に修飾語に由来します。修飾語とは、名詞や動詞を被演算子として取り、それらを特定の方法で適用する記号です。例えば、修飾語/ は、被演算子として動詞を一つ取り、その動詞を各項の間に適用する動詞を生成します。つまり、+/は「被演算子の間に + を適用する」と定義される動詞です。したがって、以下の文は

+/ 1 2 3 4 5

効果を生み出す

1 + 2 + 3 + 4 + 5+/ 1 2 3 4 5 15

Jには約24個の修飾語があります。これらはすべて、ユーザーが作成した動詞を含むあらゆる動詞に適用でき、ユーザーは独自の修飾語を書くこともできます。修飾語はそれぞれ強力ですが、

  • 繰り返し実行、つまりdo-while
  • 条件付き実行、つまりif
  • 引数の規則的または不規則なサブセットの実行

一部の修飾子はコンポーネントの実行順序を制御し、修飾子を任意の順序で組み合わせて、実用的なプログラミングに必要な無制限の種類の演算を生成できます。

データ型と構造

J は次の 3 つの単純な型をサポートします。

  • 数値
  • リテラル(文字)
  • 箱入り

このうち、numeric には最も多くのバリエーションがあります。

J の数値型の一つにビットがあります。ビット値は01 の2種類です。また、ビットはリストとして形成できます。例えば、 1 0 1 0 1 1 0 0 は8ビットのリストです。構文的には、J パーサーはこれを1つの単語として扱います。(空白文字は、本来数値単語である単語間の単語形成文字として認識されます。)任意の長さのリストがサポートされています。

さらに、J はこれらのリストに対する通常の二項演算、たとえばandor排他的論理和回転シフトnotなどをすべてサポートします。たとえば、

 1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 注. または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のデータは値セマンティクスを持ちますが、オブジェクトとクラスは参照セマンティクスを必要とします。

値ではなく名前に関連付けられた別の疑似タイプは、メモリ マップ ファイルです。

デバッグ

6から始まるコラッツシーケンスの解析

J には、エラー発生時や動詞内の指定位置で停止する一般的な機能が備わっています。また、Dissectと呼ばれる独自のビジュアルデバッガも搭載されており、J の単一文の実行を 2D インタラクティブ表示で表示します。J の単一文は、低水準言語のサブルーチン全体と同等の計算量を実行するため、このビジュアル表示は非常に役立ちます。

ドキュメント

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.

参照

参考文献

  1. ^ 「リリースノート J9.6」
  2. ^ 「Jsoftware」
  3. ^ Wes McKinney、2012年のPython for Data Analysis会議にて
  4. ^ SuperCollider ドキュメント、二項演算子の副詞
  5. ^ APLの個人的な見解、1991年のKEアイバーソンによるエッセイ(アーカイブリンク)
  6. ^ Roger HuiによるJの歴史の概要(2002年3月19日)
  7. ^ J NuVoc の言葉
  8. ^ Bussell, Brian; Taylor, Stephen (2006). 『共同執筆プロジェクトとしてのソフトウェア開発』 . ソフトウェア工学におけるエクストリームプログラミングとアジャイルプロセス. オウル(フィンランド): Springer . pp.  21– 31. ISBN 978-3-540-35094-1
  9. ^ Holt, Alan (2007).ネットワークパフォーマンス分析:Jプログラミング言語の使用. Springer . ISBN 978-1-84628-822-7
  10. ^ Jsoftwareのソースダウンロードページ
  11. ^ Eric Iverson (2011年3月1日). 「J Source GPL」 . Jプログラミングメーリングリスト. 2016年9月23日時点のオリジナルよりアーカイブ。 2015年6月24日閲覧
  12. ^ GitHubopenj
  13. ^ Jsoftwareの調達方針
  14. ^第25章 オブジェクト指向プログラミング
  15. ^(詳細はこちら)