質問

私は最近 (実際にはほぼここ 1 年)、関数型プログラミング言語に関するスレッドをたくさん読みました。どれか一つを選んで徹底的に学びたいと思っています。

最後の[コース]学期に、私はSchemeを紹介されました。私はそれが好きだった。構文の極端な単純さが気に入りました。 同形性 原則として、マクロ (衛生的な 非衛生的)、手順の多様性など。

Scheme の問題は、それが学術言語であることです。本番環境では実際には使用されていないと思います。私も履歴書に書くことが特に良いとは思いません。そこで、代替品を探してみました。それらはたくさんありますが、どういうわけかそれらはすべて同じようなレベルの人気があるように見えます。

私がまだ検討している他の関数型言語についてのいくつかの考え:

  • クロージュア:Java の世界にアクセスでき、スケーラビリティと同時実行性を重視しているため、それは素晴らしく聞こえますが、Java の世界は現在危機に瀕しているのではないでしょうか?私は Java についてはすでにかなりよく知っていますが、JVM への依存についてさらに力を入れるのは賢明でしょうか?
  • ハスケル:非常に評価されている言語のように見えますが、私が読んだ限りでは、学術言語でもあるようです。
  • 舌足らずの発音:それはずっと昔から存在しています。Scheme の私の好きなものがほとんど入っているようです。大きなコミュニティがあります。私が知っている限りでは、これはおそらく業界 (?) で最も広く使用されている関数型プログラミング言語です。
  • F#:あまり考慮していませんでした。私はMSのものの大ファンではありません。私には彼らのソフトウェアに支払うお金がありません (大学の提携から無料にすることもできますが、私はコミュニティ主導のソリューションを使用する傾向があります)。けれど...それがキャリアを考えた最良の選択だと思います。

今夜、私は Lisp に傾いています。1週間前はHaskellでした。その前は Clojure でした。昨年、私は趣味で Scheme をやっていました。ご存知のとおり、無理強いしたわけではありません。今、私は真剣に取り組みたいと思っています(学習について、それを使って実際のプロジェクトを行うことについて、そしておそらく最終的にはそれを専門的に扱うことについて)。私の問題は、1 つを選択できるようになる前に、それらをすべて深く学ぶ必要があるということです。

役に立ちましたか?

解決

あなたが欲しいので 実用的 言語:

alt text

HaskellとLispは、ClojureとF#に最近関心が寄せられていますが、業界の他のHaskellとLispが使用されていることに注意してください。

しかし、ミックスにスキームを追加すると何が起こるか見てください:

alt text

うーん、今は学問的な言語のようには見えませんか?

実際、上記のグラフはおそらく嘘です。 「スキーム」という言葉は、プログラミング言語以外に、他のコンテキストのヘルプ募集広告に表示される可能性があります。 :)

したがって、これはおそらく(少し)より代表的な別のグラフです:

alt text

スキームの本当にキックアス方言を探求したい場合は、 ラケット。

他のヒント

機能的なプログラミングを学びたい場合は、最初にHaskellを学習するためによりよく役立つかもしれません。次に、必要な言語を使用してください。他の言語を使用して機能的なプログラミングを学ぶことができますが、それでも命令的でオブジェクト指向のコードを可能にします。 Haskellで実際のプログラムを書くと、他のパラダイムが頼りにくいため、機能的なプログラミングをより速く学習します。

Haskellプログラムを作成した後、Monadsなどのツールと、選択した言語に持ち込むためのポイントフリーコーディングなどのテクニックがあります。概念は、スキームに特にうまくマッピングされているようです。

実際、Scheme でかなり複雑なシステムを実装できれば、おそらく働きたいと思われる企業でかなり望ましい存在になるでしょう。私のキャリアの初期に、Scheme でかなりの量の作業を行った何人かの学生に遭遇しましたが、それが不利だったのは、彼らが自分の作業を説明できなかったり、基本的なデータを実装するのに十分なほど実際に理解していなかったりしたときだけでした。構造とアルゴリズムを合理的な時間内に構築します。私は常に候補者にそのような質問に彼らの好みの言語で答えてもらいます。Scheme が最も得意だと思っている人たちにも、リンクされたリストに要素を追加するなど、簡単なはずのことにかなり苦労している人に遭遇しましたが、これには私は戸惑いました。

しかし、平均的な Web アプリさえ作成できるほど Scheme を「習得」できれば、ほとんどの本格的なソフトウェア会社では、それがかなり良いセールスポイントになるでしょう。

もしあなたが「ブルーブ」ショップで面接を受けていて、Scheme や Haskell、F# の熟練度のせいで開発者があなたのことを変人だと思っていたとしたら、おそらくそこでは働きたくないでしょう。ほとんどの場合、有能な開発者は仕事の選択肢を自分で選ぶことができるので、将来想像できる選択肢が企業以外にない限り、「実用性」を重視する必要はありません。有能で柔軟になり、問題を解決するよう努めます。

大学は実用性を重視するものではありません。それは、探索し学ぶための安全な環境を作り出すことです。これは、たとえ残りのキャリアで普通のソフトウェアを書くことになったとしても、実際には役に立ちます。

そうは言っても、なぜすぐにそれらの選択肢の 1 つに限定したいのかわかりません。4 つの言語すべてについては約 4 週間で簡単に理解でき、その後、現在の気まぐれに最も合う言語を 1 つ選択して集中して取り組むことができます。次に、別のオプションに戻って、同様のものを実装してみてください。より複雑なものに移り、オプションをもう一度検討してください。実験はいいですね。来月も生計を立てようとしているのでなければ、まだスペシャリストになる必要はありません。

私は Scheme、F#、Emacs Lisp、Common Lisp でいくつかを書き、過去数年間、少なくとも時々、Haskell を少なくとも少し読みました。私はそれらのどれについても専門家であるとは言えませんが、これらの言語を学ぶたびに、専門的に使用する他のすべての言語 (C#、Java、Ruby、そして場合によっては Boo、Perl、Python) にも役に立ちました。好奇心は、他の何よりも永続的で充実したキャリアを築きます。

私はしばらくの間Haskellに身を包みましたが、私が来た結論は、それが少し学問的すぎるということでした。実用的なことをするのは非常に大変でした。純粋な機能的言語では、IOのようなものはモデルに完全に適合していないため、モナドに対処する必要があります。私は、かろうじて有能になるために途方もない時間を費やさなければならないと判断したので、私は先に進みました。

私は大学で計画を立てました。些細なことに聞こえるかもしれませんが、すべてのパレンズは本当に気を散らしています/迷惑です。 Pythonのような言語を使用した後、それに戻るのは難しいです。

最近、F#を探索しています。それは機能的ですが、あなたが望むときに不可欠でオブジェクト指向であることもあります。これは、任意の.NETライブラリを使用できるとともに、純粋な機能部品とGUI、IO、ネットワーキングなどのより実用的なものと簡単に混ぜることができます。 F#のスタンドアロンバージョンを入手できます。

http://www.microsoft.com/downloads/en/details.aspx?familyid=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang = en

私は 1 ~ 2 年前に、実用的な汎用関数型プログラミング言語が欲しいという観点から、主要な関数型言語をすべて評価しました。

結局選んだのは クロージュア, 、その後、これが優れた選択であることが証明されました。

大まかに言うと、主な理由は次のとおりです。

  • 図書館エコシステム - 言語が役立つためには、優れたライブラリにアクセスする必要があります。JVM を使用するということは、最大のオープンソース ライブラリとツールのエコシステムに簡単にアクセスできることを意味するため、実用的な観点からは JVM 言語を選択するのは簡単でした。Scala はここでも高得点を獲得しました。

  • マクロメタプログラミング - 特にかなりの量のコード生成を行うことが予想されていたので、Lisp のこの側面は常に私にとって魅力的でした。私はポール・グレアムの短いエッセイで述べられた議論を非常に高く評価しています。平均を上回る」。ここではさまざまな Lisp がすべて高いスコアを獲得しました。

  • パフォーマンス 「十分に良い」 - Clojure は常にコンパイルされ、JVM JIT オプティマイザーと優れた GC の利点を享受できます。いつものように、関数型言語の使用にはある程度のオーバーヘッドがありますが、Clojure を使用すると、少しの努力で Java の速度に近づけることができることは明らかでした (Clojure は、必要に応じて Java プリミティブとオプションの静的型付けをサポートしています)。私の推定では、Clojure は、最適化された Java または C++ コードで達成できる速度よりもおおよそ 2 ~ 5 倍遅いと考えられます。これは、 欠陥のあるベンチマーク, そして時間が経つにつれて、その差はさらに縮まると私は予想しています。また、特にパフォーマンス重視のコードを Pure Java で記述し、Clojure から呼び出すだけでも十分簡単です。

  • 同時実行性 - Clojure は、特に高度なマルチコアの同時実行に対して、非常にユニークで強力な同時実行アプローチを備えています。ちょっと説明が難しいですが、 このビデオは素晴らしいです 原理を味わってもらうために。Clojure は現在、「関数型プログラミング言語で共有状態、同時状態、変更可能な状態をどのように管理すべきか?」という難しい質問に対する最良の答えを持っていると思います。

  • 言語設計 - Clojure は、IMO において非常によく考えられた言語設計です。例としては、通常の Lisp 括弧に加えてベクトル [] およびマップ {} リテラルを使用すること、不変の永続データ構造の使用、シーケンス抽象化による言語全体の遅延のサポート、さまざまな問題を解決するためのさまざまな直交機能をプログラマに提供することなどが挙げられます。 。見る 抽象化の芸術 そして シンプルで簡単.

  • コミュニティ - 常に主観的ですが、Clojure コミュニティで見たものが気に入りました。その姿勢は非常に有益で、建設的で実用的でした。「物事を成し遂げる」ことが強く強調されており、これはおそらく、Clojure の従業員の多く (Rich Hickey 自身を含む) が複雑なエンタープライズ システムの構築に携わってきたという事実を反映していると考えられます。Clojure コミュニティが Java コミュニティとの強い結びつきも持っているという事実は、Clojure が「ニッチ」にはまり込む危険はないと私を納得させる上で重要でした。

Clojure の小さな欠点をいくつか挙げるなら、次のとおりです。

  • 動的型付け - 多くの場合、これは生産性の点で利点ですが、平均して、これをより強力な型チェックと推論と交換すると思います。ほとんどの場合、これは優れた自動テスト スイートを使用することで軽減されますが、コンパイラーによって型が静的に検証されるのが好きなら、Haskell または Scala の方が適しているかもしれません。

  • 最先端 - Clojure は非常に速く開発されており、多くの革新が起こっています。これのマイナス面は、多くの実験があり、一部のライブラリとツールがまだ未熟で、Clojure のメジャー バージョン間には重大な変更が時折存在することです。目を離さない。

ただし、全体としては、優れた実用的な最新の関数型言語が必要な場合は、Clojure を選択して間違いはないと思います。

宿題をしたように見えますので、おそらくすでにこれを知っていますが、スキームは一般的なLispと同じようにLispの方言です。スキームについて多くのことが好きであるが、その学問的性質が気に入らない場合は、一般的なLISPを試してみてください。による Tiobe Index, 、それは位置26で13番目に人気のある言語とスキームです。

あなたが言及した言語のいくつかは、私が最近見た仕事の説明に掲載されていますが、それは私の小さなサンプルセットかもしれません。私は仕事で直接その言語を使用することを期待していないにもかかわらず、私は個人的にHaskellを学びます。機能プログラミングの概念は、言語自体の直接的な市場性よりも、将来のプログラム設計にとって私にとってより価値があります。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top