web-dev-qa-db-ja.com

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

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

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

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

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

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

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

171
Pepijn

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

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

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

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

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

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

プロトタイプベースのJavaScript/Io/Self-Selfは祖父であり、プロトタイプベースのすべての言語に非常に影響力があります。これは、クラスベースのOOPと同じではありません。そのように扱われるべきではありません。多くの人々がプロトタイプ言語に来て、アドホッククラスシステムを作成します。あなたの心を広げて、それは間違いだと思う。言語を最大限に活用する。 クラスなしでプログラムを整理する アイデアを読んでください。

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

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

機能+オプション型、Qi-あなたはいくつかの型システムの経験があると言いますが、「スキナブル*型システムの経験はありますか? Qiは多くの点でLISPに似ていますが、そのタイプシステムはあなたを驚かせます。

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

楽しい!

288
fogus

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

言語ではありませんが、 Art of the Metaobject Protocol は驚くべきものです

33

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

[〜#〜] c [〜#〜]

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

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

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

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

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

33
Jonas Kölker

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

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

33
user395760

Peter Norvigのサイトから:

「少なくとも半ダースのプログラミング言語を学んでください。クラスの抽象化をサポートする言語(JavaまたはC++)、機能の抽象化をサポートする言語(LISPやMLなど)、構文の抽象化をサポートする言語(LISPなど)、宣言仕様をサポートするもの(PrologまたはC++テンプレートなど)、コルーチンをサポートするもの(アイコンまたはスキームなど)、および並列性をサポートするもの(Sisalなど)。

http://norvig.com/21-days.html

27
Galactus

6か月と数百票の投票の後、誰も言及していないことに驚いています[〜#〜] sql [〜#〜] ...

13
ypercubeᵀᴹ

定理/高度な型システムとしての型: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で関数を書いて、それからあなたはそれがどんな入力に対しても正しいことを証明することができます、それは驚くべきことです!

11
GClaramunt

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

6
jneira

データフロープログラミング、別名フローベースのプログラミングは、今後の良い一歩です。いくつかの流行語:並列処理、ラピッドプロトタイピング、ビジュアルプログラミング(最初に聞こえるほど悪くない)。

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

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

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

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

6
ern0

あなたは多くの言語を学びました。今こそ、1つの言語に集中し、それをマスターするときです。

5
Sandman

Fogusが彼のリストであなたにそれを提案したように、私もあなたに言語を見るよう勧めます OzML/Mozart 主に並行性/マルチエージェントプログラミングをターゲットとする多くのパラダイム。

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

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

5

おそらく、視覚的なプログラミングのためにLabViewを試してみたいと思うかもしれませんが、工学的な目的のためです。

それにもかかわらず、あなたはそこにあるすべてにかなり興味があるようです、したがって提案

また、Android視覚的にものを構築するためのappinventorを試すこともできます

4
Belun

ブルースA.テート、 実用的なプログラマー からページを取り、正確にそれについて本を書いた: 7週間の7つの言語:プログラミング言語学習のための実用的なガイド

この本では、Clojure、Haskell、Io、Prolog、Scala、Erlang、Rubyを取り上げています。

2
Aissen

水銀http://www.mercury.csse.unimelb.edu.au/

それは型付きプロローグであり、一意性のタイプとモード(つまり、Yに追加されるXがZであることを意味する述語append(X,Y,Z)は、XとYが与えられると1つのZを生成しますが、特定のZに対して複数のX/Y )。また、カットまたはその他の余分な論理述語はありません。

あなたがそうするなら、HaskellがLISPにあるように、それはPrologにあります。

2
yatima2975

PostScript。それはスタックベースであるため、かなり興味深い言語であり、物事を紙に書きたい場合、それを成し遂げるか、なぜ成し遂げられないのかをトラブルシューティングしたい場合には非常に実用的です。

アーラン。固有の並列処理により、かなり珍しい感じがし、そこから再び有用なことを学ぶことができます。実用性についてはよくわかりませんが、いくつかの高速プロトタイピングタスクや非常に冗長なシステムに役立つ可能性があります。

GPUのプログラミングを試してください-CUDAまたはOpenCLのいずれか。これは単なるC/C++拡張機能ですが、アーキテクチャのメンタルモデルは従来のアプローチとはまったく異なり、実際の数値計算を行う必要がある場合は確実に実用的になります。

1
pasky

Erlang、Forth、および組み込み言語は、アセンブリ言語で動作します。本当に; Arduinoキットなどを購入し、アセンブリでポリフォニックビープ音を作成します。あなたは本当に何かを学びます。

1
Bart van Deenen

アカデミックレベルで新しい言語を学ぶことは興味深い趣味ですが、IMHOを実際の問題に適用するまで使用することを実際に学ぶことはできません。だから、学ぶために新しい言語を探すのではなく、私はあなたの代わりにまず構築する新しいものを探し、それからその特定のプロジェクトに使用する適切な言語を探します。最初に問題を選択し、次にツールを選択します。逆ではありません。

1
ivanhoe

「異なる」というあなたの要件を満たしていない-私は Fantom はプロのプログラマが見るべき言語であると賭けたいで。ファントムの作者は、自分の承認により、それを退屈な言語と呼んでいます。 JavaおよびC#の最も一般的なユースケースを補強するだけで、Rubyおよび同様の新しい言語からのクロージャー構文を借用しています。

それでも、独自のブートストラップされたコンパイラを持ち、外部依存関係のないインストールをドロップするプラットフォームを提供し、パッケージを適切に取得し、Java、C#、およびWeb(js経由)で動作します。

新しいプログラミング方法に関しては、視野が広がることはないかもしれませんが、より良いプログラミング方法が明らかになります。

1
vkd

愛の詩を書きたいとしましょう...

すでに手元にあるハンマーを使用する代わりに、タスクに適したツールを学びましょう。フランス語を話すことを学んでください。

ネイティブに近い会話レベルに達したら、詩を始める準備ができました。

1
roger

80年代半ばから出回っていない人には、8ビットBASICを学ぶことをお勧めします。これは非常に低レベルで非常に原始的であり、その穴の周りをプログラムするのは興味深い演習です。

同じ行で、HP-41Cシリーズの計算機(またはエミュレーターを選びますが、実際のハードウェアに勝るものはありません)。脳を包むのは難しいですが、それだけの価値はあります。 TI-57でも可能ですが、まったく異なる体験になります。 TI-55で2次方程式を解くと、マスターと見なされます(条件を持たず、RST以外の分岐がないため、プログラムはステップ0に戻ります)。

最後に、FORTHを選択します(前に説明しました)。それは、ニースの「あなたの言語を構築する」LISPのようなものを持っていますが、はるかにベアメタルです。なぜRailsが興味深いのか、DSLが理にかなっていて、入力中に非RPN電卓が何を考えているのかがわからないときを教えてくれます。

1
rbanffy
  1. プログラミングはプログラマーのタスクをカバーしません。
  2. 新しいものは常に面白いですが、いくつかの非常にクールな古いものがあります。

私にとって最初のデータベースシステムはdBaseIIIでしたが、小さな例を書くのに約1か月を費やしていました(dBase/FoxPro/Clipperはインデックス付きのテーブルベースのデータベースです)。その後、最初の職場でムンプスに出会い、頭痛がしました。私は若くて新鮮でしたが、MUMPSデータベースモデルを理解するのに2週間かかりました。コミックのように瞬間がありました。2週間後、ボタンがオンになり、電球が私の頭の中で明るくなりました。ムンプスは自然で、低レベルで、非常に高速です。 (これは、型のない不均衡で非公式のbtreeです。)今日のトレンドは、それに戻る方法を示しています。NoSQL、キー値db、多次元db-ですので、いくつかの手順が残っているだけで、ムンプスに到達します。

MUMPSの利点についてのプレゼンテーションを次に示します。 http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

階層データベースに関する短いドキュメント: http://www.cs.pitt.edu/~chang/156/14hier.html

MUMPSグローバルの概要(MUMPSでは、ローカル変数、short:ローカルはメモリ変数、グローバル変数はshort:グローバルは「db変数」で、グローバル変数の設定はすぐにディスクに移動します): http://gradvs1.mgateway.com/download/extreme1.pdf (PDF)

1
ern0

他の答えに欠けているのは、用語書き換えに基づく言語です。

Pure- http://code.google.com/p/pure-lang/ をご覧ください。

Mathematicaは書き換えベースでもありますが、何が起こっているかを把握するのはそれほど簡単ではありません。

1
JonyEpsilon

anicもあります:

https://code.google.com/p/anic/

そのサイトから:

Cより高速、Javaより安全、* shより単純

anicは、実験的、高性能、暗黙的並列、デッドロックフリーの汎用データフロープログラミング言語ANIのリファレンス実装コンパイラです。

それはもう活発に開発されているようには見えませんが、いくつかの興味深い概念を持っているようです(そして、それは結局のところ、あなたが後にいるように見えるものです)。

1
itistoday

APL、Forth、およびAssembly。

楽しんできてね。レゴマインドストームロボットキットとCMUのRobotCを受け取り、ロボットコードを作成します。 「汚い」コードを書いて、他の方法では学べない現実の世界とやり取りする必要がある場合に、事態が発生します。はい、同じ言語ですが、視点が大きく異なります。

0
martin's