2009-04-14 11 views
43

私は数ヶ月前に何かproject eulerの問題を経験しながらJ/K/APLに出くわしました。私が製作したエレガントな20行のpythonソリューションでは、10分の1の時間で実行されるゴブスマッシング20 文字 Jソリューションがあります。私はいくつかの基本的なJを学びたいと思っており、語彙を習得するためのいくつかの試みを行いましたが、学習曲線がかなり険しいことがわかりました。誰でもJ/K/APLの学習をお勧めしますか?

これらの言語に精通している方には、少しでも時間をかけて学習することをお勧めします(私は特にJと思っています)。私は、キャリアの進歩やそのようなことよりも私の好奇心を満足させるために、もっと多くのことをするでしょう。あなたが気にしている場合

考慮すべきいくつかの個人的な事情、:

  • 私は数学を愛し、そして(起動のための数学者として)私の仕事で毎日それを使用していますが、正直言って私は本当に感じていません私が使用するツール(python + NumPyのような)によって制限されるので、その言い訳を使うことはできません。
  • 私は金融業界で働くことを特に望んでいません。これは、少なくともKユーザーの主要な呼びかけのようです。プラス私は実際には、私は仕事の主な言語として次の言語としてC#を学ぶ必要があります。実際には、ほとんどの場合、ではありません。
  • 私はMATLABをよく知っているので、配列ベースのプログラミング言語を使用することは、大きなパラダイムシフトを構成しません。

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

答えて

52

何千年も前、私はAPLのプログラマーでした。何千もの言葉で言えば、私たちはAPLのキーボードと文字セットを備えた特別な印刷端末と、特殊文字を持つIBMのセレクトリックタイプボールを持っていたことを意味する70年代のことを意味する。

私は講義に行ったケンアイバーソンが「なぜAPLがクールだったのか」

彼の論文はこれでした。かつて、長い分裂は深刻な数学的取り組みであり、大学院生のために確保されていた。繰り返しの小数点の展開のようなものの表記には、数学的な象徴の大きな束が含まれていました。かつて、「負の数」のようなものでさえ、手の込んだ表記が必要でした。

これらの抽象概念をより深く理解するにつれて、複雑な概念に対してよりコンパクトな表記法を思いつきました。

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

今日、私はPythonプログラマーです。私はAPLへの私の初期の露出が私に "これは何を意味するのか?" 「これは再利用可能な操作ですか?」そして、「このアルゴリズム的な綿毛のすべてのためのぞっとする要約は何ですか?」

また、私は​​の問題を追求しているので、私の "Gin-soaked APLの回想"に裏打ちされたPythonの "functional programming lite"は、演習に取り組む上で非常に役に立ちます。

+2

スティーブンさんに感謝します。自分のPythonにどのくらいの影響を与えるのか興味深いでしょう。また、あなたが私に尋ねる気にならないなら、Project Eulerのユーザー名は何ですか? Pythonソリューションを投稿しますか? – ozan

+1

ProjectEulerでは、私は "slott"です。いいえ、私は自分のソリューションを投稿しません。私はレベル1に過ぎません。今はレベル2になるために2人います。 –

+2

+1何千年も前。しかし、細部を与えることは決してありません。 –

9

私はあなたの3点が、あなたがJを学ぶ必要がないことを示していると思います。しかし、新しい言語を習うことは有害であるとは思えません。

あなたが興味を持っているもの(または新しい言語)を学ぶ時間があれば、他のプログラミングスキルは常に向上します。他の言語とは違った方法で実装することができる問題へのさまざまなアプローチを学びます。

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

7

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

これはいくつかの点ではすばらしい言語ですが、私は実際にはWeb開発などのために使用することはできません。

統計処理と行列演算が最適です。ライナープログラミングの問題を3文字で解決できます。 LP実装の正しさを証明するほうが、Cなどのページを取るよりもはるかに簡単です。

あなたが学習の喜びのためにそれを学びたいなら、私はそれを求めて言います。あなたの仕事の見通しを向上させるために、潜在的な雇用者にもっと感銘を受けることを学ぶべきことがたくさんあります。

+1

ファイナンスでは、Q/Kdb +の知識はかなり再開ヘルパーになる可能性があります –

8

私はAPL言語開発者で、370人のアセンブラでコーディングしていました。私はJをOS2に移植しましたが、それを実際の作業にどのように使用するかを学んだことはありませんでした。私は現在JavaとPHPで作業しており、Pythonを評価していました。 Pythonチュートリアルの最初の3つのセクションの後、私はAPLとの多くの類似点にぶつかりました。

APLまたはJを知的訓練として学ぶことを強くお勧めします。プログラミングの考え方が変わり、おそらくあなたのPythonコーディングに役立つでしょう。また、APLとJのプログラマーのためにそこにはいくつかの仕事がありますし、仕事よりもプログラマーは少ないでしょう。

11

私は1980年以来APLと一緒に暮らしています。私は今後もこれからもそうし続けるつもりです。 APLを使用することは楽しいだけでなく、優れたデバッグ機能を提供します。現代の実装は完全に機能する言語であり、オブジェクト指向でもあります。

私は何年もAPLを続けることができると私は思っています。それらの人は、dbaseとPL/1、ALGOLとPascal、ForthとC、Focusと他のプログラマーでした。とった?!

+6

APLでどのようにお金を稼ぐのですか? – defhlt

+1

@defhlt http://aplteam.com/ –

11

Jはちょっとジニーのようなものです。ボトルの中に入れておく必要があります。 Jでたくさんのバッチソフトウェアを維持することは深刻な苦痛です。インターフェースを維持する(WindowsまたはWebベース、はい、あなたがWeb出力を生成するためにApacheに答えるように設定することができます)Jは実験的でほとんど知られていない地獄です。

一方、Jを使用するのは、パース、シフティング、分析、クランチなど、いくつかのデータを使用してアルゴリズムを細かく計算したり、インターネット円内に収まる三角形の数を計算する最短の方法を使用します。

careers.stackoverflow.comのキャリアプロフィールでJをディールブレーカーとして追加することに非常に近づきましたが、結局それを残しました。私には、Jを使うのはいいですが、Jを作ることはできません。

編集:

これは以前です。私はまだ完全なJソリューションの生産(つまり、すべてのMVC)の不十分だと思う。元の応答以来、私はJをC#プロジェクトでCOMとして使用しました。ここで、JにはC#で管理するのに厄介な大きな行列が提供され、大きな満足感があります。

私たちの仕事の一部は、データモデルとコードは、話すことです。その品質とJの非常に簡潔な構文を結ぶのは簡単ではありません。 Jとは違って、いくつかのフレームワークはIDEで簡単に操作でき、人間が読める形式でコードを配置できるように十分なサポートがあります。 Jの行列行列の能力は、それが欠いているものを補うものではありません。

16

私は過去25年間のほとんどの期間、JとAPLで働いており、両方を完全に推奨することができます。 アドホックデータ解析のフォームを使用している場合、私はまだどちらか一方に戻ります。私はProject Eulerでも同様に使用しています。

プロジェクト・オイラーに興味があるなら、Jは間違いなく選択してください。無限の精度整数と素数をサポートすることで、非常に良いフィット感が得られます。

14

JはProject Eulerと職場での個人的な使用のための私の主要なプログラミング言語です。私は配列の処理のためのより良い言語に遭遇したことはありません。そして、暗黙のプログラミングパラダイムは、いったんそれを掛けてしまえば、有用で思考を促すものです。 (実際には考えられているので便利です)言語のエントリーレベルの能力に到達することは困難であり、他の人のコードを読むことは知的に規律ある活動ですが、言語の力、柔軟性、簡潔さのために忍耐は大きな利益をもたらします。

私は個人用用に予約している理由は、(1)他の誰もそれを使用していないこと、(2)学習曲線が十分に険しいので、私に尋ねるのが妥当でないこと(3)複雑なプログラムを1行のコードで作成できるという事実は、特にあなたが自分で書いたことがない場合には、コード行を読むのが難しいことになります。 (基本的な原則を徹底的に理解するような方法で使用されていない限り、10人以上の演算子を使用するコード行を少なくとも30分かけて勉強することを期待しています)

楽しいJの機能の例:

1)単一の数値で動作するように定義された関数は、任意のランクの配列で動作するようにすることができます。例:

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 
5

はい、APL/J/Kを学び、それはあなたに何ができるかを独自の一見を与える。

I @ MPelletierの「三角形はどれくらいの数に収まるか」と暗黙の「...現実世界の問題ではない」と少し指摘していますが、J SoftwareのIDEには、物事ですが、独自のIDEを構築することは大きな問題ではありません。良いIDEは悪い言葉を隠すことができます(20行から20文字の縮みはではなく、くしゃみをするにはです)。私はAPLを@ KaiJaegerは、もはやそうでなければ、私の心は歪んだかもしれませんが、私は他の何ものでも幸せなプログラミングをしたことはありません。

6

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

今日、私はプログラミングをやっている27年後に新しい21世紀のプログラミング言語を学ぶことにしました。私はPythonを、無作為に選んで、GUIベースのオブジェクト指向の世界を恐れていました。

私の喜びには、80年代初めにAPLの人として生計を立てていた私の年は、文字通りすぐに物語を詰め込んでいることを意味しています。

関連する問題