HTML版への序

JはVer.8になり、iphoneやタブレットでも使えるようになった。 QT版とHTML版(JHS)があり、このリファレンスもユーザーマニュアルを中心にup to dateを図った。

ProjectEulerという数論とプログラミングのネット講座がある。今までに600問以上が出題され、 世界各国の85万人が挑戦しており、現在トップは日本人である。

使用言語の統計があり、双璧はPythonとC,C++,Java,C#などの「C連合」である。Python,PHP,Rubyなどの 振興言語が伸びており、FORTRUN,BASICはどは苦戦していおり、Mathematicaも多くはなく、 実に多様な言語が使われている。多様性は生物学だけの世界ではないようだ。

APL/J/Kも決してユーザーは多くはないが、コアなユーザーの奮闘で、ここでのステータスは相当高い

第2版にあたって

この冊子の改訂中にBuisiness Englishのフレーズが聞こえた。

「Algebraは数学の時間ではなく情報の時間で教えた方が良いと言うことが 論議されている。」

超高級関数電卓 Jは格好のツールであり、Quick Referenceは 時宜を得た教材、自習Textになる。間もなく間違いなく。

Jはドイツ製で世界標準の経理のGraphicsや最もpopularなCPUの 計算Checkなど先端分野でも活躍しており、輪は広範に世界へ 広がっている。

最近は専門書でも数式とツールを使った計算結果のみでアルゴリズムを 丁寧に解説することが少なくなってきている。更にはプログラム特許で は理論を完全にブラックボックス化されれしまう。理論のプロセスを 確認し、ブラックボックスにしないためにも簡単に高度なプログラム が作れる言語が必要とされる。
このReferenceがJ言語を始められる人の助けとなれば幸甚である。

初版への序

人と人とが意志を伝えあうためには、まず言葉が必要である。 コンピュータに仕事をさせる場合でも、何らかの方法でコンピュータとの コミュニケーションを図る必要がある。コンピュータが理解できる言葉は、 端的にいえば、0と1の羅列からなる「機械語」である。

この機械語を人間がみると、まるで暗号のようなもので、 これではコンピュータと会話することはまず不可能である。 そこで、人間が理解しやすい言語がいろいろと考案されてきた。

最もポピュラーな言語としてはBASICがあるが、 昨今ではより高水準のCやPASCALといった言語のほうが多用されつつ ある。

特に科学技術計算向きの言語として、 40年ほど前に開発されたのがAPLという言語であるが、 当時としては大型計算機でないと利用することができないことや、 見馴れない特殊記号を用いていたために、広く普及するには至らなかった。

ところが10年ほど前に、APLの創始者であるアイバーソン(K.E.Iverson) を中心として、APLの泣きどころであった特殊記号を排し、 通常のアスキー記号にピリオド「.」やコロン「:」を付加することによって、 記号の種類を3倍に拡大し、APLの機能をさらに強力にした 「関数型言語」を開発し、これを言語Jと名づけた。

コンピュータの飛躍的な進歩は、パソコンレベルでもAPLやJが 使える時代になったのである。ともあれJ言語は、パソコンを 「超」高級電卓として利用できることが大きなメリットといえる。

つまり、コンピュータに不慣れなタイプでも、 すぐに自分でプログラムを作ることができる。そこで、この$J$言語なる ものの簡単な紹介を試みてみたい。とにかく、 「馬には乗ってみよ、人には添うてみよ」というように、 是非、チャレンジしてみて頂きたい。

本稿は、J言語の記号と基本概念を、機能・用途別に分類し、 簡単な説明を加えた「クイック・リファレンス」である。

J言語の特徴と概要を知る上で便利なものであり、また$APL$を知らない 読者でも初めて$J$言語を学ぶときにも役立つものと思う。

J言語のキーワードの日本語表現については、 J言語研究会で議論・統合したものを用いた。対応するAPLの説明や 用例は、「日本語APLクイック・リファレンス(日本IBM社)」と対比し、参照した。

J言語の特徴

品詞
  • J言語では、APLでの変数・関数等の用語に対して、以下のような 自然言語における品詞の名前を用いている。
  • 「代名詞」や「代動詞」 という概念もあるが、特に名詞、動詞と区別しなくともよい
\[ \begin{array}{lll} (J言語)& (APL)&(Others)\\ 名詞 & 定数&変数\\ 動詞 & 関数&関数\\ 副詞 & 作用素&\\ 接続詞 & - & \\ \end{array} \]
数学用語との比較
  • Jと数学用語との対応表を以下に示す。
  • Jは数値計算以外にも事務計算 や文字列の処理などにも利用できる汎用言語であるから、必ずしも数学 用語とは一致しない。
  • (実際には数学用語と混同して使用することが多い)
\[ \begin{array}{c|c|c} J言語 & 数学用語 & Jでの表示例\\\hline アトム& スカラー& 2\\ リスト& ベクトル& \begin{array}{ccc} 2 & 4 & 6\\ \end{array}\\\hline テーブル& マトリクス& \begin{array}{ccc} 0 & 1 & 2 \\ 3 & 4 & 5\\ 6 & 7 & 8\\ \end{array} \\\hline レポート& 多次元配列 & \begin{array}{ccc} 0 & 1 & 2\\ 3 &4 & 5 \\ &&\\ 6 & 7 & 8\\ 9 & 10 & 11 \\ \end{array} \end{array} \]
名詞
  • 型の指定は必要ない。
  • 型は 数値、文字、ボックスがある。
    • 数値はそのまま定義する。
      A =: 1 3 5                          
      even =.2 4 6  
      
    • 文字列はクオート(')で囲んで定義する。
      JAPLA =.'JAPAN APL ASSOCIAION'
      
    • 数値や文字を四角で囲んだものがボックスとして定義できる。
      • ボックスと数値は直接は演算できない。ただボックスの中で 演算させることはできる。
       A;JAPLA
    +-----+---------------------+
    |1 3 5|JAPAN APL ASSOCIATION|
    +-----+---------------------+
    
配列
  • 配列の大きさは$で指定する。
    2 3 $ 5 2 3 4 1 6                      
    5 2 3                             
    4 1 6     
    
  • 0から始まる整数列の生成には「i.」を用いればよい。
i. 2 3                           
0 1 2                             
3 4 5                             
単項と両項
  • ほとんどの動詞には、(右引数だけの)単項と、 (左右に引数をとる)両項の2種類がある。
    この点はC系の言語と大きく異なる。
  • キーボードに制約があるため、一つの記号を単項と両項とで 用いる場合が殆どで、使い分けに注意が必要である。
^. 100                           
4.60517 (自然対数)                     

10 ^. 100                          
2    (常用対数)                     
プリミティブ
  • J言語で用いられる、+や-:等の記号を プリミティブといい、動詞、副詞、接続詞などがある。
  • 数学=ギリシャ文字の伝統をK.E.IversonAPLで継承し、 Jは記号をキーボード記号に移した。
  • プリミティブの用法は固定されているが
    plus=:+ やsqure=:+:
    等のように名前をつけて使ってもよい。
    • このとき、plus やsqureは動詞と呼ばれる。
    • (厳密には名詞、動詞にテンポラリーな名前を付けたものを代名詞、代動詞と呼ぶ。)
    • tasu=:+ など各国の言語で自由に定義できる。
    • Unicodeもサポートされて いるが多バイト文字は名詞や動詞の名前に用いることは出来ない
  • 演算用のアスキー記号をそのまま使ったもの(ベア)ピリオド(.)を つけたもの、さらにコロン(:)を付したものと3種類あり、 機能はそれぞれ異なる。
    • (最近は {:: fetchや p.. polynomial Derivative の様なものも少しではあるが見受けられる。)
プリミティブの優先順位
  • 全てのプリミティブの優先順位は平等である。
    • 数学の優先順位は無視される
    • K.E.Iverson言語の特色である。
    • APLやJは数学を拡張しており、また多くの ユーザー定義関数も用いられるので優先順位を確立すると言語が極めて煩瑣になる
  • 動詞(APLでは定義関数)の定義には明示型と関数(タシット)型がある。
    • 明示型定義での演算の順序は、右から順に演算する。
      5%4*3+2-1                          
      0.3125   
      
      (5%(4*(3+(2-1))) = 0.3125 のように演算する)
      
    • タシット(関数)型での合成関数の定義では、フォーク(Fork)やフック(Hook) を作るので、その順序関係はやや複雑になる。
5(+%-)3                           
4            

(「(5+3)%(5-3) = 4」のように演算する)
数値
  • 数値は全て明記する必要があり、また「.5」のように「0」を省略する ことができず「0.5」のように入力しなけれならない。
  • さらにリストやテ ーブルを定義するときも、数値の間にはスペースを入れなければならな い。
  • 負の数にはアンダーバーをつけて「_5」のように表わす。

    APLの 場合のオーバーバーに対応するものでマイナス符号"-"とは 異なる点に注意。

  • FORTRANを作ったBuccusは苦心して浮動小数点を採用した。

    Jは 分数表記(1r6,3r12)、無理数の表記(1x1 (e) 1p1(パイ)、拡張表記 (123x)などを取り入れており、浮動小数点や指定精度に制約されないで 計算ができる。精度指定はなく、内部では分数で計算している

スペース
  • 動詞と数値の間には必ずスペースが必要である。
  • ドットやコロンが独立して使わ れる場合には、前のプリミティブとの間にスペース が必要となる。
    A=: 1 2 3 4 5
  • また明示的定義を宣言する際の
    name=: 3 : 0 
    では、 コロンの前のスペースは絶対必要。
  • さらに 内積の 「+/ . *」の場合もドットの前のスペ-スは必ず 挿入しなければならない。
副詞
  • 副詞は(右から)動詞を修飾して新たな動詞を作る。
  • 最も縦横に活躍する副詞は「スラッシュ(/)」である。
 +/ 1 2 3 4 5                        
15            (「1+2+3+4+5 = 15」のように演算する)

 */ 1 2 3 4 5                        
120           (「1*2*3*4*5 = 120」のように演算する)
接続詞
  • Jでは、動詞と動詞、あるいは動詞と名詞を連結して新たな動詞を作る ことができる。その連結用に接続詞を導入した。その代 表が、次の「ボンド(&)」と「アトップ(@)」である。 \[ \begin{array}{cccc} Bond&& Atop&\\ 単項&両項&単項&両項\\ \begin{array}{c} u\\ \mid \\ v \\ \mid \\ y\\ \end{array} & \begin{array}{ccc} &u&\\ /&& \backslash\\ v&&v\\ \mid&&\mid\\ x&&y\\ \end{array} & \begin{array}{c} u \\ \mid \\ v\\ \mid \\ y \\ \end{array} & \begin{array}{ccc} &u&\\ &\mid&\\ &v&\\ /&& \backslash\\ x&&y\\ \end{array} \\ \end{array} \]
  • 単項の場合に限り\&と\@は同じ機能で、「u{v(y)}」と演算する
  • 両項の場合は
    「x(u&v)y」=「v(x)u v(y)」        
    
    「x(u@v)y」=「u(xvy)」          
    
  • 動詞と数値など名詞との結合にはm&u ,u&nのように&を用いる。
フォークとフック
  • タシット型の定義で動詞を関数合成により連結する場合には、3連動 詞(フォーク)が最優先される。
  • 2の場合にはフックになる。
    (+/%#)a=: 2 3 4 5                     
    3            (「(+/ a)%(#a) = 3」のように演算する)
    
    5(+%-)3                           
    4            (「(5+3)%(5-3) = 4」のように演算する)
    
    (*-)3                            
    _9              (「3*(-3) = _9」のように演算する)
    
    \[ \begin{array}{cccc}%bmatrix} Folk&(f \ g \ h)&Hook&(g \ h)\\ 単項&両項&単項&両項\\ \begin{array}{ccc} &g&\\ /&&\backslash \\ f&&h \\ \mid&&\mid \\ y&&y\\ \end{array} & \begin{array}{ccccc} &&g&&\\ &/&& \backslash&\\ &f&&h&\\ /&\backslash&&/&\backslash \\ x&y&&x&y\\ \end{array} & \begin{array}{ccc} &g&\\ /&&\backslash \\ y&&h \\ &&\mid \\ &&y\\ \end{array} & \begin{array}{ccc} &g&\\ /&&\backslash \\ x&&h \\ &&\mid \\ &&y\\ \end{array} \\ \end{array} \]
  • (フォークやフックにおけるgは必ず両項動詞でなければならない)
  • キャップドフォーク([: g h)
\[ \begin{array}{cc} \begin{array}{c} g\\ \mid \\%/&&\backslash \\ h \\ \mid \\ y\\ \end{array} & \begin{array}{ccc} &g&\\ &\mid&\\ &h&\\ /&&\backslash \\ x&&y \\ \end{array} \\ \end{array} \]
  • (キャップドフォークに於るgは必ず単項動詞でなければならない)