171


300

異なるアプローチと概念を理解するために学ぶべき重要な言語は何ですか?

ボルトカッターとウォッカのボトルがあれば、すべてがウルフブリッツァーのボートハウスのドアの鍵のように見えます。 (xkcdを読んでいない場合は、ハンマーと釘で置き換えてください)

現在、Clojure、Python、Java、およびPHPをプログラミングしているので、CとLISPの構文だけでなく、空白文字にも精通しています。 命令型、機能的、不変、OOP、およびいくつかの型システムなどを知っています。 今、もっと欲しい!

異なるアプローチを取り、実用的なツール選択または理論的理解のいずれかに役立つ言語とは何ですか?

別の関数型言語(Haskell)や別の命令型OOP言語(Ruby)を学ぶ気はありません。また、Brainfuckのような非実用的な楽しい言語を練習したくありません。

私が見つけた非常に興味深いことの1つは、Factorのような単層スタックベースの言語です。

ほとんどの概念を理解し、すべての質問に答えていると感じたときにのみ、個人的な好みをすべて含めるために、自分のおもちゃの言語について考え始めたいと思います。

24 Answer


288


実用性の問題は非常に主観的であるため、異なる言語のパラダイムを学習することは、より優れたプログラマーになるために役立つと単純に言います。 それより実用的なものは何ですか?

Functional、Haskell-あなたはしたくないと言ったのは知っていますが、本当に考え直すべきです。 Clojure、さらにはPythonで機能を公開しましたが、Haskellがなければ機能を十分に体験したことはありません。 あなたが本当にHaskellに反対しているなら、良い妥協はMLまたはOCamlのいずれかです。

宣言型、データログ-多くの人がこのスロットでPrologを推奨していますが、データログは宣言型言語のよりクリーンな例だと思います。

Array、J-Jを発見したばかりですが、素晴らしい言語であることがわかりました。 それはプレッツェルにあなたの心をひねります。 Jに感謝します。

Stack、Factor / Forth-Factorは非常に強力で、できるだけ早く掘り下げる予定です。 ForthはStack言語の祖父であり、追加のボーナスとして、http://github.com/fogus/rforth [実装するのは簡単]です。 実装を通じて学習することについて、何か言いたいことがあります。

Dataflow、Oz-Ozの影響は上昇にあり、今後も成長し続けると思います。

プロトタイプベースのJavaScript / Io / Self-Selfは祖父であり、プロトタイプベースのすべての言語に大きな影響を与えます。 これはクラスベースのOOPとは異なり、そのように扱われるべきではありません。 多くの人がプロトタイプ言語に来てアドホッククラスシステムを作成しますが、あなたの目標が心を広げることであるなら、それは間違いだと思います。 言語を最大限に活用してください。 アイデアについては、http://labs.oracle.com/self/papers/organizing-programs.html [クラスなしのプログラムの整理]をお読みください。

エキスパートシステム、CLIPS-私は常にこれをお勧めします。 もしPrologを知っていれば、あなたはおそらく速度を上げるのに優位に立つでしょうが、それは非常に異なる言語です。

Frink-Frinkは汎用言語ですが、単位変換のシステムで有名です。 私は、この言語が何をするかで最高になるというその容赦ない意欲に非常に刺激を受けていると思います。 プラス…​ 本当に楽しい!

機能+オプション型、Qi-一部の型システムを使用したことがあると言いますが、「スキナブル*型システムの使用経験はありますか?」 誰も持っていない…​ しかし、彼らはすべきです。 Qiは多くの点でLispに似ていますが、その型システムはあなたを驚かせます。

Actors + Fault-tolerance、Erlang-Erlangのプロセスモデルは多くの話題を集めていますが、そのフォールトトレランスとホットコードスワッピングメカニズムはゲームを変えるものです。 Clojureで学習することのないFPについてはあまり学習しませんが、そのFT機能を使用すると、なぜ他の言語ではこれを正しく行えないのか不思議に思うでしょう。

楽しい!


33


_ 現在、Clojure、Python、Java、およびPHPをプログラミングしています[…​]異なるアプローチを採用し、実用的なツール選択または理論的理解に役立つ言語とは何ですか? _

C

_lot_のCコードがたくさんあります---それは間違いなく実用的です。 C ++を学習する場合は、さらに多くのコードがあります(CとJavaを理解すれば、飛躍は短くなります)。

また、いくつかの理論的な問題を十分に理解することができます(または強制することもできます)。たとえば、実行中の各プログラムは、ある意味で4 GBのバイト配列にあります。 Cのポインタは、実際にはこの配列への単なるインデックスにすぎません。これらは単なる異なる種類の整数です。 表面層の下に隠れていることを除いて、Java、Python、PHPで違いはありません。

また、オブジェクト指向のコードをCで書くこともできます。vtablesなどについて少し手作業をするだけです。 サイモンタサムのポータブルパズルコレクションは、非常にアクセスしやすいオブジェクト指向Cコードの好例です。また、かなりうまく設計されており、初心者/中級のCプログラマーに読む価値があります。 これがHaskellでも起こります----ある種のクラスはある意味「単なる別のvtable」です。

Cのもう1つの素晴らしい点は、熟練したCプログラマーとQ&Aを行うことで、Cを低レベルの構成要素で説明する多くの回答が得られ、より鉄に近い知識ベースが構築されることです。

私はOPのポイントを見逃しているかもしれません---私は、他の答えから判断すると、私はそうだと思います---しかし、それは同様の質問を持ち、このスレッドを読んでいる他の人々への有用な答えかもしれないと思います。


33


私は2番目のHaskell。 「私はLispを知っているので、関数型プログラミングを知っている」とは思わないでください。 型クラスについて聞いたことがありますか? 代数データ型? モナド? 「モダン」(多かれ少なかれ-少なくとも50歳ではありません。))関数型言語、特にHaskellは、非常に強力で有用な新しい概念を数多く探索しています。 型クラスはアドホックポリモーフィズムを追加しますが、型推論(既に知っている言語にはない別のこと)は魅力のように機能します。 代数的データ型は、特にツリーのようなデータ構造のモデリングには非常に優れていますが、列挙型や単純なレコードでもうまく機能します。 そしてモナド…​ さて、人々がそれらを使用して例外、I / O、パーサー、リストの理解などを純粋に機能的な方法で行うとしましょう!

また、全体のトピックは、何年も忙しくするのに十分な深さです;)


33


Prolog(統合/バックトラッキングなど)、Smalltalk(「すべてがメッセージ」)、Forth(リバースポリッシュ、スレッドインタープリターなど)、Scheme(続き)はどうでしょうか。

言語ではありませんが、http://en.wikipedia.org/wiki/The_Art_of_the_Metaobject_Protocol [Art of the Metaobject Protocol]は驚くべきものです


27


Peter Norvigのサイトから:

「少なくとも半ダースのプログラミング言語を学んでください。 クラスの抽象化をサポートする言語(JavaやC など)、機能の抽象化をサポートする言語(LispやMLなど)、構文の抽象化をサポートする言語(Lispなど)、宣言仕様をサポートする言語(PrologやC テンプレートなど)、これは、コルーチン(アイコンやスキームなど)をサポートし、コルーチン(サイザルなど)をサポートします。 "


13


私は6か月と数百の投票の後、誰も* SQL *に言及していないことに驚いています…​


11


定理/高度な型システムとしての型:Coq(Agdaもこのカテゴリーに含まれると思います)。

Coqは、関数型プログラミング言語に組み込まれた証明アシスタントです。

数学的な証明を書くことができ、Coqはソリューションの構築に役立ちます。 関数を記述し、それに関するプロパティを証明できます。

依存型があり、それだけで私の心を吹き飛ばしました。 簡単な例:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

Aの要素のサイズnとmの2つの配列を連結し、サイズ(n + m)の配列を返す関数のシグネチャです。 関数がそれを返さない場合、コンパイルしません!

帰納的構築の計算に基づいており、その背後に強固な理論があります。 私はそれをすべて理解するほど賢くはありませんが、特に型理論に向かう傾向がある場合は、一見する価値があると思います。

編集:私は言及する必要があります:あなたはCoqで関数を書いて、それからあなたはそれがどんな入力に対しても正しいことを証明することができます、それは驚くべきことです!


6


私が興味を持っている言語の1つは、非常に異なる観点(言語要素を定義する新しい語彙と根本的なdiff構文を含む)がhttp://www.jsoftware.com/[J]です。 Haskellは機能的な言語ですが、その型システムや他のユニークな機能があなたの心を開き、(関数型)プログラミングの以前の知識を再考させます。


6


フローベースのプログラミングとしても知られるデータフロープログラミングは、今後の良い一歩です。 いくつかの流行語:並列処理、ラピッドプロトタイピング、ビジュアルプログラミング(最初の音ほど悪くない)。

ウィキペディアの記事は優れています。

_ コンピューターサイエンスでは、フローベースプログラミング(FBP)は、アプリケーションを「ブラックボックス」プロセスのネットワークとして定義するプログラミングパラダイムです。 これらのブラックボックスプロセスは、内部で変更することなく、さまざまなアプリケーションを形成するために無限に再接続できます。 したがって、FBPは当然コンポーネント指向です。 _

JPMの本を読む:http://jpaulmorrison.com/fbp/

(ホームオートメーションの目的でC ++で簡単な実装を作成しましたが、非常に満足しています。 ドキュメントは作成中です。)


5


fogusが彼のリストであなたにそれを提案したように、私もあなたに言語http://www.mozart-oz.org/[OzML/Mozart]を見てみることをお勧めします。

並行性および分散計算に関しては、ラムダ計算(関数プログラミングの背後にある)に相当するものをPi計算と呼びます。

私は、Pi計算の実装を調べ始めたばかりです。 しかし、彼らはすでに私のコンピューティングの概念を拡大しています。