最近、関数型プログラミング言語に関する多くのスレッドを読んでいます(実際には、ほぼ1年間ですが)。本当に選んで徹底的に学びたいです。
前の[コース]学期、Schemeを紹介されました。私はそれが好きだった。構文の極端な単純さ、 ホモモニコニティー 原理、マクロ( 衛生的 および非衛生的)、手順のn-arityなどが気に入りました。
Schemeの問題は、それが学術的な言語であることです。本番環境で実際に使用されているとは思いません。私も履歴書を持っていることが特に良いとは思いません。それで、私は代替案を探していました。それらの多くがあり、それらはどういうわけかすべて同じようなレベルの人気を持っているようです。
私がまだ検討した他のいくつかの関数型言語についての考え:
今夜、私はLISPに傾いています。 1週間前、Haskellでした。それ以前はClojureでした。昨年、私は楽しみのためにSchemeをやっていましたが、あなたが知っている理由でそれを推し進めていませんでした。今、私は真剣になりたいと思います(1つを学ぶこと、それを使って実際のプロジェクトを行うこと、多分最終的にそれを専門的に扱うことについて)。私の問題は、1つを選択できるようになる前に、それらをすべて深く学ぶ必要があることです。
実用的な言語が必要なので、
最近、HashellとLISPは業界で他よりも多く使用されていますが、ClojureとF#には最近関心が寄せられています。
しかし、Schemeをミックスに追加するとどうなるか見てみましょう。
うーん、今は学術的な言葉に似ていませんか?
実際、上のグラフはおそらく嘘です。 「スキーム」という単語は、プログラミング言語以外のコンテキストでヘルプの求人広告に表示されます。 :)
だからここにおそらくもう少し代表的な別のグラフがあります:
Schemeの非常に魅力的な方言を探索したい場合は、 Racket。 を参照してください。
関数型プログラミングを学びたい場合は、最初にHaskellを学び、それから好きな言語を使うほうがよいでしょう。他の言語を使用して関数型プログラミングを学ぶことができますが、それでも命令型のオブジェクト指向コードが可能です。 Haskellで実際のプログラムを書くと、他のパラダイムを利用できないため、関数型プログラミングをより速く学習できます。
Haskellプログラムを作成すると、モナドなどのツールや、ポイントフリーコーディングなどの手法を使用して、選択した言語を実現できます。概念は特にSchemeにうまく対応しているようです。
実際、Schemeにかなり複雑なシステムを実装できたとしたら、おそらく働きたいと考えている企業ではかなり望ましいでしょう。私のキャリアの前半で、Schemeでかなりの量の仕事をしたいくつかの学生に出くわしました、そしてそれが不利だったのは、彼らが彼らの仕事を説明できないか、基本的なデータを実装するために実際に十分に理解していないときでした妥当な時間内の構造とアルゴリズム。私は常に候補者にそのような質問に優先言語で答えさせます。リンクリストに要素を追加するなど、簡単なはずのことでかなり苦労し、Schemeが一番だと思っていた人に出会いました。
しかし、Schemeを平均的なWebアプリでさえ作成できるほど十分に「取得」できれば、ほとんどの真面目なソフトウェア会社では、それがかなり良いセールスポイントになるでしょう。
「ぶっちゃけた」ショップで面接していて、開発者がScheme、Haskell、またはF#に習熟しているために変だと思っただけなら、おそらくそこで働きたくないでしょう。ほとんどの場合、有能な開発者はギグの選択を得るので、将来的に想像できる唯一のオプションが企業である場合を除いて、「実用性」を気にしないでください。有能で柔軟性があり、問題を解決することに取り組みます。
大学は実用性についてではありません。探索して学ぶための安全な環境を作ることです。それは実際、あなたがキャリアの残りのために普通のソフトウェアを書いてしまうとしても、役に立ちます。
そうは言っても、なぜそんな選択肢の1つだけにすぐに制限したいのかはわかりません。約4週間で4つの言語すべての感覚を簡単に理解できます。次に、現在の気まぐれでメッシュに最も集中するものを1つ選択します。次に、別のオプションに戻って、同様のものを実装してみます。より複雑なものに進み、選択肢をもう一度検討してください。実験は良いです。来月生計を立てているのでなければ、まだ専門家になる必要はありません。
私は、Scheme、F#、Emacs LISP、Common LISPでいくつか書いて、少なくともここ数年は少なくとも少しはHaskellを読んでいます。私がそれらの専門家であるとは言えませんが、それらの言語への各エクスカーションは、私がプロで作業する他のすべての言語(C#、Java、Ruby、そして時にはBoo、PerlおよびPython)で私に利益をもたらしました。好奇心はあなたに他の何よりも永続的で充実したキャリアを構築します。
私はしばらくHaskellに浸りましたが、私が思いついた結論は、それが少し学術的すぎるということでした。実用的なことをするのはとても大変でした。純粋な関数型言語では、IOはモデルに完全に適合しないため、モナドを処理する必要があります。非常に長い時間をかけて、かろうじて有能であるので、私は次に進みました。
私は大学でSchemeをやった。ささいなことのように聞こえるかもしれませんが、すべての括弧は本当に気を散らす/迷惑です。 Pythonのような言語を使用した後、それに戻るのは困難です。
最近、F#を調査しています。これは機能的ですが、必要に応じて命令型やオブジェクト指向にすることもできます。これは、任意の.NETライブラリを使用できるとともに、純粋な機能部分をGUI、IOおよびネットワークなどのより実用的なものと簡単に組み合わせることができます。スタンドアロンバージョンを取得できます。 F#。
私は、実用的で汎用的な関数型プログラミング言語が欲しいという観点から、すべての主要な関数型言語を1年か2年前に評価しました。
私は最終的に Clojure を選択することになりましたが、これはその後優れた選択肢であることが証明されています。
大まかに言えば、主な理由は次のとおりです。
ライブラリエコシステム-言語を使用するには、適切なライブラリにアクセスする必要があります。 JVMにいるということは、最大のオープンソースライブラリとツールエコシステムに簡単にアクセスできることを意味します。そのため、JVM言語を採用することは、実用的な観点から考えると簡単でした。 Scalaもここで高得点を獲得しました。
マクロメタプログラミング-特にかなりのコード生成を行うことを期待していたため、LISPのこの側面は常に魅力的でした。 Paul Grahamの短いエッセイ " Beating The Averages "で行われた議論に非常に感謝しています。ここでは、さまざまなLispがすべて強く評価されました。
パフォーマンスは「十分に良好」でした-Clojureは常にコンパイルされ、JVM JITオプティマイザーと優れたGCの利点を享受します。いつものように、関数型言語の使用にはある程度のオーバーヘッドがありますが、Clojureを使用すると、少しの労力でJava速度にそれぞれ近づくことができます(ClojureはJavaプリミティブとオプションの静的型付け(必要な場合)。私の推定では、Clojureは最適化されたJavaまたはC++コードで実現できるものよりも2-5倍遅い) 欠陥のあるベンチマーク に見られるものと一致しており、時間が経つにつれてそのギャップはさらに狭くなると予想しています。また、純粋にJavaおよびClojureから呼び出します。
Concurrency-Clojureには、非常にユニークで強力な並行性のアプローチがあり、特にマルチコアの並行性の場合に適しています。説明するのは少し難しいですが、- このビデオは優れています 原則を味わうことができます。 Clojureは現在、「関数型プログラミング言語で共有、並行、および変更可能な状態をどのように管理する必要があるか」という難しい質問に対する最良の答えを持っていると思います。
言語デザイン-Clojureは、非常によく考え抜かれたIMOです。例としては、通常のLISP括弧に加えてベクトル[]およびマップ{}リテラル、不変の永続データ構造の使用、シーケンス抽象化による言語全体の遅延のサポート、プログラマーにさまざまな直交機能を提供してさまざまな問題を解決する。 抽象化の芸術 と 簡単な簡単化 を参照してください。
コミュニティ-常に主観的ですが、Clojureコミュニティで見たものが好きでした。態度は非常に役に立ち、建設的で実用的でした。多くのClojureの人々(Rich Hickey自身を含む)が複雑なエンタープライズシステムの構築のバックグラウンドから来ているという事実を反映している可能性があるため、「物事を成し遂げる」ことに重点が置かれています。 ClojureコミュニティがJavaコミュニティにも強いリンクを持っているという事実は、Clojureが「ニッチ」に行き詰まるリスクを負わないことを私に納得させるために重要でした。
Clojureのいくつかのマイナーな欠点を挙げなければならない場合、これらは次のようになります。
動的型付け-多くの場合、これは生産性の点で有利ですが、平均して、これをより強力な型チェックと推論と交換すると思います。ほとんどの場合、これは適切な自動テストスイートを使用することで軽減されますが、コンパイラーによって静的に検証される型が好きな場合は、HaskellまたはScalaのほうが適しているかもしれません。
最先端-Clojureは非常に速く開発されており、多くの革新が進んでいます-これの欠点は、多くの実験といくつかのライブラリがあることですツールはまだ未成熟であり、Clojureのメジャーバージョン間で、目を離さないようにする必要がある重大な変更が時々あります。
しかし、全体として、優れた実用的な現代の関数型言語が必要な場合は、Clojureで問題が発生することはないと思います。
あなたは宿題を終えたように見えるので、おそらくすでにこれを知っていますが、SchemeはCommon LISPと同じようにLISPの方言です。 Schemeについて多くのことが好きだが、その学術的性質が気に入らない場合は、Common LISPを試してください。 TIOBEインデックス によると、26位で13番目に人気のある言語とSchemeです。
あなたが言及した言語のいくつかは、最近見た仕事の説明に表示されますが、それは私の小さなサンプルセットにすぎないかもしれません。私は自分の仕事で直接その言語を使用することを期待していませんが、個人的にはHaskellを学びます。関数型プログラミングの概念は、言語自体の直接的な市場性よりも、将来のプログラム設計にとって私にとってより価値があります。