web-dev-qa-db-ja.com

誰かがJ / K / APLを学ぶことをお勧めしますか?

数ヶ月前、いくつかの プロジェクトオイラー の問題を解決しているときに、J/K/APLに出くわし、控えめに言っても興味をそそられました。私が作成したエレガントな20行のpythonソリューションごとに、20characterJソリューションがあります。私はいくつかの基本的なJを学びたいと思っていて、語彙を習得しようと何度か試みましたが、学習曲線がかなり急であることがわかりました。

これらの言語に精通している人には、時間をかけて学習することをお勧めしますか(特にJを考えています)。キャリアアップなどよりも、好奇心を満たすためにやりたいと思います。

あなたが気にかけているなら、考慮すべきいくつかの個人的な状況:

  • 私は数学が大好きで、仕事で毎日使用しています(スタートアップの数学者として)が、正直なところ、使用するツール(python + NumPyなど)に制限されているとは感じていません。 )だから私はその言い訳を使うことができません。
  • 少なくともKユーザーの主な寄港地と思われる金融業界で働きたいとは特に思っていません。さらに、C#は私が働く主要言語であるため、次の言語として実際に学ぶ必要があります。つまり、実際には、Jはほぼ間違いなくが私が学ぶ次の言語であってはなりません。
  • 私はMATLABにかなり精通しているので、配列ベースのプログラミング言語を使用しても、大きなパラダイムシフトを構成することはありません。

これらの言語に精通している人からのアドバイスをいただければ幸いです。

44
ozan

数千年前、私はAPLプログラマーでした。数千とは、カスタム文字セットがAPLキーボードと文字セットを備えた特別な印刷端末、および特殊文字を備えたIBM選択型ボールなどを意味していた70年代のことを意味します。

ケン・アイバーソンの「なぜAPLがかっこいいのか」という講演に行きました。

彼の論文はこれでした。昔々、筆算は大学院生のために予約された深刻な数学の仕事でした。循環小数展開などの表記には、数学記号の山がたくさん含まれていました。昔々、「負の」数のようなものでさえ、手の込んだ表記法が必要でした。

何年にもわたって、これらの抽象化をよりよく理解するようになると、複雑な概念のはるかにコンパクトな表記法を思いつきました。

APL(およびJとK)のポイントは、大きなアルゴリズムを整然とした表記に要約することです。

今日、私はPythonプログラマーです。APLへの初期の露出は、「これはどういう意味ですか?」と「これは再利用可能な操作ですか?」と尋ねることによって私の脳を歪めたことがわかりました。 「このすべてのアルゴリズムの綿毛についての簡潔な要約は何ですか?」

また、私が Project Euler の問題を追求するとき、Pythonの「APLのジンに浸した思い出」に裏打ちされた関数型プログラミングライト」は両方とも取り組むのに非常に役立ちます演習。

54
S.Lott

Jは、ProjectEulerおよび職場での個人的な使用のための私の主要なプログラミング言語です。配列処理に適した言語に出会ったことはありません。ポイントフリープログラミングパラダイムは、コツをつかめば便利であり、示唆に富むものです。 (実際、考えさせられるので便利です。)言語でエントリーレベルの能力に到達することは難しく、他の人のコードを読むことは知的に訓練された活動ですが、言語の力、柔軟性、簡潔さのために忍耐力には大きな見返りがあります。

とは言うものの、私がそれを個人職場での使用のために予約する理由は、(1)職場の他の誰もそれを使用しない、(2)学習曲線が十分に急なので、私にとって合理的ではないからです同僚にそれを手に取ってもらいます。(3)1行のコードで複雑なプログラムを作成できるという事実は、特に自分でコードを書かなかった場合、1行のコードを読むのを難しくします。 (基本的な原則を完全に理解するような方法で使用されていない限り、10個以上の演算子を使用するコード行の調査に少なくとも30分を費やすことを期待しています。)

楽しいJ機能のいくつかの例:

1)単一の数値を操作するように定義された関数は、任意のランクの配列を操作するように作成できます。例えば:

NB. totient(n) = n * \prod_{p|n} (1 - 1/p)
totient=: * -.@%@~.&.q:

NB. Finding the totient of 10
totient 10

NB. Finding the totient of all numbers from 1 to 10
totient"0 (1+i.10)

これはまったく同じ関数であり、1xN入力配列のアトム(単一要素コンポーネント)を操作するだけです。同様に、ランク2の配列(行列)で機能するように定義された関数を取得し、「(ランク)」接続詞を使用するだけで、それをより高いランクの任意の配列に適用できます。

2)Jのほぼすべての理論的に反転可能な関数を取得し、「逆方向に繰り返す」ことで反転できます。例えば、

NB. Converts an array of binary digits to a decimal number
(#.) 1 0 1
5

NB. Converts a decimal number to an array of binary digits
(#.^:_1) 5
1 0 1
17
estanford

私は過去25年のほとんどの間JとAPLで働いており、両方を徹底的に推奨することができます。 any形式のアドホックデータ分析を実行する必要があり、Project Eulerでも使用した場合でも、どちらかに戻ります。

プロジェクトオイラーに興味があるなら、Jは間違いなく選択するものです。無限精度の整数と素数をサポートしているため、非常によく適合します。

16
Duncan

私は1980年からAPLで生計を立てています。これからも、これからもそうし続けることを楽しみにしています。 APLを使用するのはとても楽しいだけでなく、この言語は優れたデバッグ機能を提供します。最新の実装は本格的な関数型言語であり、オブジェクト指向でもあります。

何年にもわたって多くの人に会い、APLをいつまで続けることができると思うかと尋ねました。それらの人は、dbaseとPL/1とALGOLとPascalとForthとCとFocusと他のプログラマーでした。とった?!

14
KaiJaeger

Jは魔神に少し似ています。ボトルの中に入れておく必要があります。 Jで多くのバッチソフトウェアを維持することは深刻な苦痛です。 Jでインターフェース(WindowsまたはWebベース、はい、Apacheに応答してWeb出力を生成するようにJをセットアップできます)を維持することは、実験的な、あまり知られていない地獄の輪です。

一方、Jを使用するのは、データの解析、ふるい分け、分析、クランチなど、データをいじったり、アルゴリズムの詳細を理解したり、インターネットは、円に収まる三角形の数を計算するための最短の方法です。

careers.stackoverflow.com のキャリアプロファイルでJをディールブレーカーとして追加することに非常に近づきましたが、最終的には省略しました。私にとって、Jを使用することは問題ありませんが、Jを生成することは問題ありません。

編集:

それは少し前のことです。私はまだ、本番環境での完全なJソリューション(つまり、すべてのMVC)についてはよく考えていません。最初の応答以来、私はJをC#プロジェクトのCOMとして使用しました。ここで、Jには、C#で管理するのが面倒な大きなマトリックスが提供されており、非常に満足しています。

私たちの仕事の一部は、データモデルとコードspeakを作成することです。その品質とJの非常に簡潔な構文を橋渡しするのは簡単ではありません。 Jとは異なり、いくつかのフレームワークはIDEでの作業が簡単で、人間が読める方法でコードを配置できるように十分なサポートがあります。 Jのユーバーマトリックス機能は、不足しているものを補うものではありません。

13
MPelletier

あなたの3つのポイントは、Jを学ぶ必要がないことを示していると思います。しかし、新しい言語を学ぶことが有害であるという状況は考えられません。

興味のあること(または新しい言語)を学ぶために時間をかけると、他のプログラミングスキルが常に向上します。他の言語で異なる方法で実装できる可能性のある問題に対するさまざまなアプローチを学びます。

さらに、Jの最小限の構文を使用すると、別の言語でソリューションを実装するときに正しい結果が得られるようにするのに適した言語になります。

9
Inisheer

昔、私はAPL言語開発者で、370アセンブラーでコーディングしていました。 JをOS2に移植しましたが、実際の作業での使用方法を学びませんでした。私は現在JavaおよびPHPで作業しており、Pythonを評価していました。Pythonチュートリアルの最初の3つのセクションの後、 APLとの多くの類似点に感銘を受け、ここに来ました。

知的演習としてAPLまたはJを学ぶことを強くお勧めします。それはプログラミングについてのあなたの考え方を変え(あなたの脳を歪める)そしておそらくあなたのPythonコーディングを助けるでしょう。またAPLとJプログラマーのためにそこにいくつかの仕事があり、おそらく仕事よりプログラマーが少ない。

8
pkw

私は1970年代に数年間APLプログラマーとして働いていました。私はその言語が大好きですが、何年も使っていません。

いくつかの点で優れた言語ですが、たとえばWeb開発に使用することは想像できません。

それが素晴らしいのは、統計演算と行列演算です。ライナープログラミングの問題は3文字で解決できます。たとえばCのページを使用するよりも、そのLP実装の正確さを証明する方がはるかに簡単です。

ですから、学ぶことの喜びのためにそれを学びたいのなら、私はそれのために行くと言います。あなたの仕事の見通しを高めるために、潜在的な雇用主をより感動させるであろう学ぶべき他の多くのことがおそらくあるでしょう。

7
JonnyBoats

はい、APL/J/Kを学びましょう。何が可能かをユニークに垣間見ることができます。

@MPelletierの「円にいくつの三角形が収まるか」とその暗黙の「...しかし実際の問題ではない」は少し近視眼的であると指摘します。はい、JSoftwareのIDEにはいくつか欠けていますが、独自のIDEを構築することは大きな問題ではなく、良いIDE =悪い言語を隠すことができます(20行から20文字の縮小はないくしゃみをする必要があります。)@ KaiJaegerがそうしている限り、私はAPLを行ってきました。歪められますが、私は他のものでプログラミングすることに満足したことはありません。

6

これは、50歳の私にとって面白い確認です。

今日の初め、私は27年の間隔を置いてゼロプログラミングを行った後、新しい21世紀のプログラミング言語を学ぶことにしました。私はPythonをランダムに選びました。これは、私たち全員が現在住んでいるGUIベースのオブジェクト指向の世界を恐れています。

嬉しいことに、80年代初頭にAPLの男として生計を立てていたのは、文字通り、すぐに理解して資料をざっと読んでいることを意味します:)それを共有したいと思っただけです。

6
Mani Sitaraman