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


172

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

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

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

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

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

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


3
xkcdの参照だけで+1したいのですが、質問も興味深いものです。

63
あなたはプログラマーとして成功しているようですが、残りは徐々に増えていきます。ディックになろうとはしていませんが、...あなたの人生は、財務面、関係面、健康面、楽しみ面、趣味面でどうですか?おそらく今こそ、それらのいくつかを追求する時です。一度に12以上の言語を知る必要があるとは思いません。あなたがそれを使用するために支払われた場合-それを学んでください。あなたが1つについての本を書きたいなら-それを学んでください。それ以外には、優れたプログラミングベースがあります。なぜあなたは真剣に(読んで$を使わない)何か(J-私のsubjの意見:)など)を学ぶのですか?墓地でクールなハッカーにならないでください。
Hamish Grubijan、

6
はい、私は自分の基準に従って成功したプログラマーです。私は現在多くのお金を稼いでいませんが、ねえ、私は19歳です。これらすべてのポイントなどに時間を費やしていますが、プログラミングには趣味と楽しみの両方があります。また、言語の理解と習得には違いがあるとも言いたいです。PythonとClojureをマスターするだけで十分です。コードが改善され、コンピューターを理解し、独自のプログラミング言語を定義するのに役立つため、他のオプションも理解したいと思います。
Pepijn、

5
Programmers.SEを見たことがありますか?これは、そこでよく尋ねられる種類の質問に分類されます。

3
この本は興味深いかもしれません:Bruce A. Tateによる7週間の七つの言語:プログラミング言語の学習への実用的なガイド
Martin Ba

回答:


287

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

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

宣言型、Datalog-多くの人々はこのスロットでPrologを推奨しますが、Datalogは宣言型言語のより明確な例だと思います。

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

スタック、ファクター/フォース -ファクターは非常に強力であり、できるだけ早く掘り下げるつもりです。フォースはスタック言語の祖父であり、追加のボーナスとして、自分で実装するのは簡単です。実装による学習については、何か言いたいことがあります。

データフロー、オズ - オズの影響は上向きであり、今後も成長し続けると思います。

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

エキスパートシステム、CLIPS-私は常にこれをお勧めします。あなたがプロローグを知っているなら、あなたはスピードに慣れるのに優位性を持っているでしょうが、それは非常に異なる言語です。

フリンク -フリンクは汎用言語ですが、単位変換のシステムで有名です。この言語は、その言語が何をするのに最高であるという容赦のない意欲に非常に刺激的であることがわかります。それに...本当に楽しい!

機能+オプション型、Qi-一部の型システムでの経験があるとおっしゃっていますが、「スキナブル*」型システムでの経験はありますか?誰も持っていません...タイプシステムはあなたの心を吹き飛ばします。

アクター+フォールトトレランス、Erlang -Erlangのプロセスモデルは多くの話題を集めていますが、そのフォールトトレランスとホットコードスワッピングメカニズムはゲームを変えるものです。Clojureで習得できないFPについてはあまり学習しませんが、そのFT機能により、より多くの言語がこれを正しく理解できないように思われる理由がわかります。

楽しい!


8
+1-すばらしい答えです。
duffymo

2
たくさんの言語を教えてくれてありがとう。

2
私は、アクターベースのプログラミングにはErlangを、並列プログラミングのものにはFortressを追加します。
nickik

2
Erlangのホットスワップおよびフォールトトレランス認識のための+1
Mic

14
組み立てなし?プロセッサがどのようなコードを好むかを理解するためにプロセッサがどのように機能するかを理解するのは良いことです。
Nick T

33

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

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


私が間違っている場合は訂正してください。ただし、Python sortofはすでに継続を行っていると思います。そして私が読んだことから、私はForthやSmalltalkよりもFactorとObjective-Cを学びたいと思いますが、私はそこに手を出すかもしれません。
Pepijn

1
@ pepijn、pythonにはファーストクラスの継続がありません(私はそれを偽造するためにバイトコードハックに取り組んでいますが)
10:12にaaronasterling

1
Objective-CはSmalltalkを利用していますが、STの本当の意味は環境自体のダイナミズムだと思います。
John Cromartie、

33

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

また、トピック全体が深く、何年も忙しい人もいます;)


「また、トピック全体が深く、何年も忙しい人がいるほどです;)」-なぜこれが良いことなのでしょうか?結局のところ、私たちの生活は有限です。
vegai

1
@vegai:なぜそれが悪いのでしょうか?一生を過ごすには学習よりも悪い方法があります。そして、言語を適切に使用するためだけに何年も勉強する必要があると誰も言っていません-トピックが短時間で使い果たされないだけです。(また、スマイリーに注意してください-その部分は完全に深刻ではありません。)

32

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

C

多くのCコードが存在します。これは間違いなく実用的です。C ++についても学ぶと、コードの量が大幅に増えます(CとJavaを知っていれば、飛躍は短くなります)。

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

また、Cでオブジェクト指向のコードを記述できます。vtableなどについて少しマニュアルを書くだけで済みます。Simon TathamのPortable Puzzle Collectionは、かなりアクセスしやすいオブジェクト指向のCコードの好例です。また、かなりよく設計されており、初心者/中級Cプログラマに一読する価値があります。これはHaskellでも起こります---型クラスはある意味で「単なる別のvtable」です。

Cのもう1つの優れた点は、熟練したCプログラマーとのQ&Aに取り組むことで、Cを下位レベルの構成要素の観点から説明する多くの回答を得て、鉄に近い知識ベースを構築することです。

OPのポイントを見逃している可能性があります---他の答えから判断すると、私はそう思います---しかし、これは、同様の質問をしてこのスレッドを読んでいる他の人々にとって有用な答えになると思います。


1
これにはもっと賛成票が必要です。Cは、ベアメタルに取り掛かり、マシン(またはより高いレベルのプログラミング言語)の仕組みを最初から理解する必要がある、または知りたい場合の最大の言語です。さらに、これは非常に普遍的でもあり、Cコンパイラは(これまでに)考案されたすべてのCPUアーキテクチャに対応しています。
2011年

27

Peter Norvigのサイトから:

「少なくとも6種類のプログラミング言語を学びます。クラスの抽象化(JavaまたはC ++など)をサポートする言語、関数の抽象化(LispまたはMLなど)をサポートする言語、構文の抽象化(Lispなど)をサポートする言語、宣言型をサポートする言語を含めます。仕様(PrologまたはC ++テンプレートなど)、コルーチン(IconまたはSchemeなど)をサポートする仕様、および並列処理(Sisalなど)をサポートする仕様。

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


13

6か月と数百回の投票の後、誰もSQLについて言及しなかったことに驚いています ...


10

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

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で関数を書き、それからあなたはそれがどんな入力に対しても正しいことを証明することができます、それは素晴らしいです!


私は2番目のコックです。ほとんどの言語を学ぶとき、あなたはまだあなたの古い技術を使うことができます、しかしcoqはあなたにいつも働く完全なプログラムを書くことを強います。
ブルーノマルティネス

私は去年の夏にCoqを学ぼうとしましたが、それを学び、使用するための優れたドキュメントを見つけるのが難しいと感じたため、あきらめました。助言がありますか?

私は大学でコースを学び、「Coq'Art:帰納的構造の微積分」を読みました。実際にそれを習得するだけでは十分ではありませんが、感謝するには十分です。
ブルーノマルティネス

6

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


5

fogusがリストで提案したように 、主に並行性/マルチエージェントプログラミングを対象とした言語OzML / Mozart多くのパラダイムを検討することもお勧めします。

同時実行性と分散計算については、ラムダ計算(関数型プログラミングの背後にある)に相当するものをPi計算といいます。

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


5

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

ウィキペディアの記事は良いです:

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

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

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


+1、データフローとフローベースのプログラミング(おそらく関数型反応型プログラミングも)は、マルチコアの将来の重要な部分になると思います。

5

あなたは多くの言語を学びました。今が一つの言語に焦点を合わせ、それを習得する時です。


3

おそらく、それはエンジニアリングの目的ですが、ビジュアルプログラミングのためにLabViewを試してみたいと思うかもしれません。

それにもかかわらず、あなたはそこにあるすべてのものにかなり興味を持っているように見えるので、提案は

また、あなたはものを視覚的に構築するためにアンドロイドappinventorを試すことができます


LabViewには面白い「構文」がありますが、すべてのコードをクリックしてドラッグするのは本当に大変です。プログラマにはお勧めしません。
イシュタール

それがレゴNXTに同梱されているものですよね?まったくうまくいきませんでした。しかし提案をありがとう。
Pepijn、

ナショナルインスツルメンツからです。LabVIEWは、科学者やエンジニアの生産性を向上させるグラフィカルな開発環境です
Belun

2

ブルースA.テート、 実用的なプログラマー:まさにその上で本を書いた 学習は、プログラミング言語に実用的なガイド:セブン週間で7ヶ国語

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


2
この本には、明らかに米国のポップカルチャーの一部となった映画への言及がぎっしり詰まっていることに注意してください。映画を見たことがなければ、テートが何をしているのか疑問に思うでしょう。あなたが映画を見たことがあるなら、プログラミング言語の絶え間ない擬人化や、問題のキャラクターが単に好きではないことによって、あなたはまだ延期されているかもしれません(私はメアリーポピンズが好きではありません。偶然にもRubyも好きではないので、類推何かにあるかもしれません)。
アランプラム

2

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

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

もしそうなら、HaskellがLispにあるように、それはPrologにあります。


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

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

MUMPSの利点に関するプレゼンテーションは次のとおりです。http//www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

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

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


1

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

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

ネイティブに近いスピーキングレベルに達すると、詩を始める準備が整います。


4
もちろん、詩を書くためには普通のネイティブレベルをはるかに超えて話す必要があるので、それはごみの詩になるでしょう。そして、あなたのガールフレンドはそれを読むためにフランス語を学ぶ必要があります。彼女がすでにフランス人でない限り、彼女はおそらくそれが恥ずかしいと思うでしょう。
John Lawrence Aspden、

美味しい皮肉、ジョン、私はそれが好きです(私はフランス語です、ところで)
Vinzz

1

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


1

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

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

そして最後に、FORTHを選択します(これについては前述しました)。「言語を構築する」というLisp風の優れた機能がありますが、よりベアメタルです。Railsがなぜ興味深いのか、DSLが理にかなっていることがわかり、入力中に非RNP計算機が何を考えているのかが一目でわかります。


1

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

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

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


1

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


1

anicもあります:

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

そのサイトから:

Cより高速、Javaより安全、* shよりシンプル

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

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


1

「異なる」という要件を満たしていませんが、Fantomはプロのプログラマーが注目すべき言語であると思っています。彼ら自身の認めにより、fantomの作者はそれを退屈な言語と呼んでいます。JavaとC#の最も一般的な使用例を裏付けるだけで、Rubyや類似の新しい言語からクロージャ構文を借用したものもあります。

それでも、独自のブートストラップコンパイラを使用して、外部依存関係のないインストールが簡単で、パッケージが適切になり、Java、C#、およびWeb(js経由)で動作するプラットフォームを提供できます。

それはプログラミングの新しい方法に関してあなたの視野を広げないかもしれませんが、それは確かにあなたにプログラミングのより良い方法を示すでしょう。



0

APL、フォース、アセンブリ。

楽しんできてね。レゴマインドストームロボットキットとCMUのRobotCを入手して、ロボットコードを記述します。「ダーティ」になり、他の方法では学習できない現実の世界と対話する必要があるコードを記述すると、事態が発生します。はい、同じ言語ですが、見方は大きく異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.