web-dev-qa-db-ja.com

OCamlがもっと人気がないのはなぜですか?

Cは、組み込みシステム、または最高速度で実行する必要のあるものに使用するために選択した言語のtheであるといつも聞いていました。私はCが好きではありませんでした。これは主に、ポインター演算が好きではなく、言語がアセンブラーの上のラングであることがほとんどないためです。

一方、ML言語は関数型でガベージコレクションされた言語であり、OCamlはオブジェクトモデルさえ持っていますが、Cと同じくらい高速であるという評判があります。コードでありながら、高性能アプリケーションの作成に必要な速度を維持します。

特にOCamlは、組み込みデバイス、グラフィックスドライバー、オペレーティングシステムなど、Cが伝統的に使用されている場所であればどこでも使用できます。それを使用しました。

これは主観的な質問ですが、なぜOCamlとMLの他の言語がそれほどあいまいで、Cと他の言語が人気になったのですか?

86
Juliet

最初の答えは、なぜ言語が人気になるのか誰も実際に知らないということです。そうでなければ、だまされているか議題があります。 (言語失敗が人気になる理由を特定するのは簡単ですが、それは別の問題です。)

その免責事項を踏まえて、ここでは示唆に富むいくつかのポイントを示します。最初に最も重要です。

  • 最初の成熟したCコンパイラは1974年に登場しました。最初の成熟したOCamlコンパイラは1990年代後半に登場しました。 Cには25年の有望なスタートがあります。

  • CはUnixとともに出荷されましたが、これは史上最大の「キラーアプリ」でした。長い間、世界中のすべてのCS部門にはUnixが必要でした。つまり、すべてのインストラクターとCSコースを受講しているすべての人がCに触れる機会がありました。OCamlとMLはまだ最初のキラーアプリを待っています。 (MLdonkeyはかっこいいですが、Unixではありません。)

  • Cはそのニッチを十分に満たしているので、システムプログラミングに特化した別の低水準言語onlyは決してないでしょう。 (証拠を支持するために、HOPL IIのCの歴史に関するDennis Ritchieの論文を読んでください。)OCamlのニッチが何であるかさえ明確ではなく、Standard MLのニッチはほんの少しだけ明確です。したがって、CamlとMLにはかなりの数の競合相手がいますが、Cはその唯一の競合相手(BLISS)を殺しました。

  • Cの大きな強みの1つは、そのコストモデルが非常に予測可能であることです。Cコードの小さなフラグメントを簡単に見ることができるため、実行するために実行する必要があるマシン操作を正確に把握できます。そのコード。 OCamlのコストモデルは、特にmemory allocationの方が明示的ではないため、あまり明確ではありません。メモリ割り当ての全体的なコスト(割り当てのコストとガベージコレクション中に発生したコスト)は、時間などの新しいプロパティに依存します。オブジェクトは生きており、どのオブジェクトが他のオブジェクトを参照しているか。最終的な結果として、パフォーマンスを予測することは困難であり、事後に分析することさえ困難です。 (OCamlのメモリプロファイリングツールは本来あるべきものではありません。)その結果、OCamlは、組み込みシステムのようにパフォーマンスを非常に予測可能にする必要があるアプリケーションには適していません。

  • Cは、標準と多くのコンパイラを備えた言語です。 OCamlはソフトウェアアーティファクトです。唯一のコンパイラは単一のソースからのものであり、コンパイラisが標準です。そしてその標準はリリースごとに変わります。安定性と下位互換性を重視する人にとって、単一ソースの言語は許容できないリスクを表す可能性があります。

  • 中途半端な学部のコンパイラコースと多くの永続性を持つ誰でも、多かれ少なかれ動作し、適切なパフォーマンスでCコンパイラを書くことができます。 OCamlまたはMLの実装を地上で実現するには、さらに多くの教育が必要であり、単純なCコンパイラと同等のパフォーマンスを得るには、さらに多くの作業が必要です。これは、OCamlのような言語をいじる趣味人がはるかに少ないことを意味します。そのため、コミュニティを利用して、それを活用する方法について深い理解を深めることは困難です。

82
Norman Ramsey

OCamlの問題は、「そのまま」ではあまり役に立たないことです。人々が言語を使用する最終的な理由は、それが彼らが必要とするライブラリを持っているからです。ただし、「すぐに使える」ものは何もないため、ライブラリを作成する必要があることに気付くほどプロジェクトに参加する人はいません。その結果、ライブラリのない言語になり、「実際のアプリ」を書くことが難しくなります。

OCamlが苦しんでいるのはこれだと思います。プログラミング言語しかないため、誰も「実際のプロジェクト」を開始する気になりません。はい、2つと2つを追加して結果を印刷できます。その結果、ほとんどが学術的な放棄ウェアであるライブラリのコレクションが作成され(著者は博士号を取得して次に進みました)、プログラマーの練習にはあまり役に立ちません。

(これを変更する作業が進行中であることを知っています。 "Batteries Included"などのプロジェクトがあります。5年後にここに戻ってきて、おそらくOCamlがもっと人気になるでしょう。)

このルールにはいくつかの例外があります。 Javaライブラリなしで始まりましたが、Sunはすべてを社内で作成するように人々に支払い、それから彼らはそれから地獄を売り込みました。Java認定、Java -特定のハードウェア、Java本、Javaクラスなど)そして、それはあまり良い言語ではないがプログラミングの学習に使用します。

結果は人気でした。お金は多くの問題を解決することができます。

関数型言語の領域では、Haskellが非常に人気が高まっていることがわかります。人気のほとんどは、便利なライブラリを作成し、言語のマーケティングを止めることのないドンのような人々によるものだと思います。毎日、Redditのプログラミングに関するHaskellの記事をいくつか目にしています。これは、彼らが最終的に「私はHaskellを試すつもりだ」と決定するまで、それを人々の心にとどめておきます。そうすると、Webフレームワーク、オブジェクトデータベース、OpenGLライブラリ、XML処理ライブラリなどの便利なものが表示されます。これは、彼らが実際に「今すぐ」役立つ何かを実行できることを意味します。だから、生産的である可能性とそれについてたくさん聞くことの間で、Haskellは多くの人気を得ています。

CLにはHaskellと同じライブラリが多数あり、ほぼ同じくらい高速ですが、誰もそれについて語っていないため、「死んでいるように感じます」。実際、#LISPは#haskellよりはるかに静かですが、LISPは依然として多くのライブラリを備えた非常に生産的な言語です。他の言語にはSLIMEはありません。しかし、マーケティングは非常に重要であり、HaskellはLISPやOCamlよりも優れています(同じユーザーベースで競争します)。

最後に、一部の人々はプログラミングを「取得」しないため、メンタルモデル(変数は値を持つボックスであり、コードは上から下に実行されます)を破ると、言語が使用されなくなります。このタイプのプログラマーはプログラミング人口の大部分を占めているため、LISP、Haskell、OCamlなどの抽象言語のユーザーベースの可能性がさらに制限されています。

63
jrockway

私は言語としてOCaml たくさんが好きです。だが...

ツールのサポートはありません。デバッガーは正常に機能するだけですが、Windows(最後にチェックしたもの)では機能せず、使用できる開発ツールがそれほど多くありません。

その型システムは、時々、少しtoo強いです。型推論がどのように機能するか、または一般的にML型システムを理解していない人にとって、浮動小数点に整数を追加できないという事実は、すぐに大きな転換点です。

標準ライブラリは、一貫性がないと感じる場合があります。

オブジェクトモデルはややタックオンされているように見え、標準ライブラリではほとんど使用されておらず、代わりにモジュールベースのライブラリが選択されています。

基本的に言語が「洗練された」と感じられないことや、言語を取り上げてそれが好きかどうかを判断しようとする非常に重要な時期に人々を追い払うことには、他にもたくさんあります。

その最も重要な遺産は、他のML方言とともに、他の関数型言語に非常に強い影響を与えてきたことです。現在の世代の関数型言語のほとんどは、MLの方言から最高の要素を取り、いくつかの煩わしさを改善しています。

22
user21714

組み込みシステムには、速度と確定性の2つが必要になることがよくあります。 OCamlは速度を提供できますが、ガベージコレクターを備えているため、本質的に非決定的であり、単純なリアルタイムシステムでは実現できません。

21
ctacke

これは、リンゴとオレンジの比較です。 OCamlはかなり若い言語であり[1]、それをメインストリームにプッシュするための真面目で持続的な取り組みはこれまでありません(F#に関するMicrosoftの現在の取り組みを除く)。 Cとは異なり、これは最も広くサポートされ、模倣されたエンタープライズオペレーティングシステム(UNIXなど)のlingua francaではありません。 Javaとは異なり、Javaを次世代のコンピューティングプラットフォームとして推進している大企業はありません。 Perl、Python、Rubyとは異なり、注目を集める影響力のあるニッチ(つまり、そのニッチはプログラミング言語と自動推論研究であり、Web開発に比べてそれほど注目されているわけではありません)に定着していません。したがって、それは超人気ではありません。

[1]公平に言えば、元のML言語は70年代から存在しています。しかし、OCamlは1996年まで登場せず、標準MLライブラリを継承しませんでした。実際には、C、C++、Java、Python、Haskell、またはRubyよりも若い言語です。

18
Chris Conway

OCamlコミュニティは、アプリケーションの開発を容易にする、大きくて信頼性の高い標準ライブラリ(今日のOCamlに付属するものを超える)の開発に失敗しました。問題を解決するためのいくつかの試みがありますが、PythonまたはRubyを見て、不足しているものを確認してください。OCamlは、 XML、ネットワーキング、データ計算などの高度な標準モジュールとのやり取りにあまり依存しないアルゴリズムの問​​題を解決する。

問題の一部は、モジュールがOCamlによってファイルにマップされる方法にあると考えています。概念的には、すべての* .mlファイルは同じ名前空間にあり、ディレクトリは意味を持ちません。これは、コミュニティがライブラリを進化させることを難しくします。コンパイラーがディレクトリー階層をモジュール階層にマップする場合、標準ライブラリーが進化する可能性が高くなります。ただし、これにはコアコンパイラの開発者による相当な努力が必要です。 (パッキングモジュールについては承知していますが、これは問題だと思います。)

ライブラリのもう1つの問題は、コンパイラリリース間のバイナリ互換性です。コンパイラーのアップグレード後にすべてのライブラリー・コードを再コンパイルする必要があると言うのはかなり安全です。これにより、モジュールまたはライブラリのバイナリリリースを提供することが困難になります。

15

おそらく、型についての奇妙で紛らわしい理論的なものの紹介の一部として、あまりにも多くの人々がMLを教えられたためでしょう。それが私に起こったことです。

MLとSmalltalkをほぼ同時に見せられました。 Smalltalkだけ見たとんでもなくクール、そしてOOの目的と、この環境できれいでインタラクティブなものをどのように作成できるかがすぐに理解できました。MLは抽象的な数学的なことに関するものでしたCとは異なり、16ビットマイクロで高速なゲームを作成できるとは約束していませんでした。

もちろん、これは深く不公平で主観的です。しかし、それはほとんどの人にとって本当の話になるでしょう。

最近の質問は次のようになると思います。型に関する奇妙で紛らわしい理論的なことを知る必要があると思いますが、なぜHaskellやErlangではなくMLを選択するのでしょうか。

11
interstar

主な問題は、実際の標準ライブラリがないことだと思います。したがって、プロジェクト OCaml Batteries Included は、状況を大幅に改善すると予想されます。数日以内にベータ段階に入る予定なので、1年程度でもう一度質問する必要があります。

Windowsの貧弱なサポート、急な学習曲線、およびスリムな標準ライブラリーはすべて、過去のOCamlの普及を妨げてきたことに同意しますが、Javaのような主流の言語と比較して、OCamlに関するチュートリアル情報(本など)が大幅に不足していることを付け加えます。

また、OCamlのような言語を知っている人々の種類は非常に異質です。 Webプログラマーの中で、おそらく1,000人に1人はOCamlを聞いたことがあるでしょう。ケンブリッジ大学で科学計算を行う人々の中で、私が知っている人々の約90%はOCamlに堪能でした。確かに、私は友達の中でOCamlを学ぶ最後の一人でした。 256 CPUのスーパーコンピューターでOCamlも実行しました...

また、これらの問題は急速に対処されていることにも触れておきます。 OCamlは最近、OcsigenのようなプロジェクトでWebプログラミングのために再発明し、そのコンテキストですでに少なくとも2つの主要な産業の成功事例を持っています。 OCamlに関する別の新しい本が出ています。コミュニティーは、「バッテリー付属」と呼ばれる包括的な標準ライブラリーで共同作業を行っています。これは、ベータ・リリースに入ったばかりで素晴らしいようです。 OCamlのマルチコア対応バージョンがリリースされようとしています。 OCamlの最新バージョンには、遅延パターンや動的に読み込まれるネイティブコードOCamlライブラリなど、多くの優れた新機能も含まれています。

8
Jon Harrop

問題の一部は、関数型プログラミングはほとんどの人が考えるのに自然な方法ではないことだと思います(これは関数型プログラミングに大きな関心を持ち、高く評価している人だと言っています)。これは、今日のプログラマーの大多数が手続き型プログラミングの学習を始めた(最も一般的なOOP=言語はまだ手続き型である)ため、関数型言語を最初に調整するのが難しいという事実によってさらに悪化します。

私が大学を始めたとき、私はすでに適度な量のBASIC、C++およびJavaと少しのPascalおよびx86アセンブリ言語を知っていました。私は専門家とはほど遠かったですが、(少し素朴な)結論に達しました)すべてのプログラミング言語は基本的に同じで、構文は少し異なります。プログラミングコースの紹介ではMLを使用していたので、その概念をすぐに思いとどまらせました。プログラミングのキャリアのその段階でMLを理解するのに苦労し、実際には関数型プログラミングのポイント。関数型アプローチの利点を実際に理解するには、手続き型プログラミングのいくつかの問題を経験する必要があると思います。

私たちのML講師は、問題を再帰的に表現することは、ループやその他の手続き型の概念を使用するよりも「自然」で簡単であるとしばしば主張しました。私はその主張に納得したことは一度もなかったし、それを買わなかった。再帰関数は、問題に対して特にエレガントで簡潔な解決策を提供できる場合がありますが、それでも問題について考えるのは不自然な方法です。おそらく、非常に強力な数学的背景があると、より直感的に思えますが、ほとんどの人が再帰的に考えるのは簡単ではないと思います。関数型プログラミングのパラダイムに対する再帰関数の中心性を考えると、これも関数型言語の人気が低い理由の1つかもしれないと思います。

言語の人気へのフィードバック効果もあります。プログラミングを始めたとき、グラフィカルなエフェクトやゲームをプログラミングする方法を知りたいと思いました。 BBC BASICとそれ以降のQBASICについて少し学習した後、私は自然にデモシーンとゲームプログラマーが使用する最も一般的な言語を調べ、C++とx86アセンブリの学習に取り掛かりました。今日、一部の新しいプログラマーは、Webアプリケーションの作成方法を知りたがっているかもしれません。そのため、PHP、RubyまたはC#の学習に引き付けられます。自発的な初心者プログラマーにとって、「 Xなどのプログラミングを学ぶのに最適な言語は「オカムル」になります。

Ocamlの人気が限られているために与えられた実際的な理由の多く(成熟したライブラリ、デバッガー、IDEなどの欠如)は、ファーストクラスの.NET言語としてのF#に対するMicrosoftの公式サポートによって対処されています。 F#が関数型プログラミングの人気をさらに高めるのに役立つかどうかは興味深いことです。

6
mattnewport

問題の核心は政治だと思います。 Ocaml開発者は主に研究に関心があり、豊富なライブラリを提供および維持するためのリソースがありません。ただし、これらのリソースを持っているコミュニティに製品の制御権を解放することも望まないため、この問題を解決するためのいくつかの試みは、存在しない協力とサードパーティライブラリへの資金提供に依存しており、これらの試みは失敗しました。 Ocamlの開発者が態度を変えない限り、バッテリーは同じ理由で故障します。

私は自分の製品を開発するためにOcamlを使用しており、単純なルールがあります。サードパーティのコードへの依存を最小限に抑えることです。サードパーティのアイテムが役立つ場合は、可能な限り、ソースコードをパッケージに直接組み込んでください。たとえば、OCSスキームとDypgenはFelixパーサーの重要な部分であるため、ソースにコピーされているので、それらをある程度制御できます。コントロールはやや幻想的です(少なくともDypgenは非常に複雑であるため、維持できそうにありませんが、少なくとも私たちは機能すると思うコピーを持っています:)

ライセンスが制限されているためソースをコピーできないため、バッテリーは使用しません。また、スタンドアロン製品としての長期的なバイアビリティに信頼がありません。使用できる唯一の方法は、 Ocamlの標準ディストリビューションに直接組み込まれています。

C++の世界では、Boostの使用を検討するかもしれません。これは、標準の一部ではないサードパーティのライブラリですが、コミュニティのサポートが非常に高く、実際には標準の開発プロセスと非常に同期しています。 Boostで開発およびテストされたアイデアは、標準化できる一種の既存の慣行となり、標準化プロセスはコミュニティの参加を可能にするのに十分なほどオープンです。

Ocamlは、非常に優れた製品であるため、実際に人気を得ていますが、主流の言語になるには十分ではありません。 Javaは粗末であり、数十億ドルのマーケティングとライブラリ開発で人気を博しましたが、結局、コミュニティーに解放されて存続する必要がありました。

6
Yttrill

さまざまなプロジェクトでMLとCの両方でコーディングを楽しんでいます。組み込みプロジェクト(ほとんどがリアルタイム制約があり、検証が必要)でMLを使用できないのは、ガベージコレクションです。

regionsMLKit を参照)を使用したメモリ管理の研究がありますが、それらを適切に使用するために必要な実装とトレーニングの複雑さ(および付随するリスク)は、それらの使用を妨げてきました。

5
Doug Currie

@jrockwayが言うようにそれがお金についてであるならば、F#がJavaまたはC#のような)人気を得るかどうかがわかります。

私にとって、開発者は関数型のやり方に慣れていないようです(これは、techdays 2009のF#セッションで、約100人が関数型プログラミングを知っていると約10人が言ったからです)。

私は今年OCAMLを開始しましたが、関数型プログラミングに手を染めたことはありませんが、OCAMLと問題を解決する関数型の方法から常に新しいことを学んでいます(ただし、C#をあきらめるとは言えません) OCAMLを使用するには:))。

3
0xFF

私見、OCamlの大きな問題は言語(それは素晴らしい)ではなく、開発者とその結果としてのライセンスにあると思います。

http://caml.inria.fr/ocaml/license.en.html

彼らはコンパイラにQパブリックライセンスを使用しています!はい、Qtライブラリに使用されているex-Trolltechのライセンスです!そのようなライセンスで貢献を取得することを忘れてください。

言語シュートアウト( http://shootout.alioth.debian.org/ )を約7〜8年前にチェックしていた場合、実行速度の点でOCamlはCおよびC++よりも遅れていました。しばらくの間、(Haskellのような)他の言語はより良いコンパイラーを手に入れました(コミュニティーのアプローチが異なるためと思います)、今ではOCamlの実行速度は以前ほど速くありません。

まもなく、私はOCamlを使用しません。本当に優れたハッカーがREALYオープンソースライセンスを持つOCamlコンパイラーとREALLYオープンソースの振る舞いを持つコミュニティーを作成しなければ、それがうまくいくとは思えないからです。

3
Patrizio Rullo

まあ、おそらくF#が人気になるでしょう。

2
tuinstoel

C-> ocamlがc-> LISPより大きな精神的移行であることは役に立ちません。私はocamlを2、3回検討しましたが、コスト/メリットがまったくないことに気づきました。見た目を難しくしたのは構成ではなく、実際に非常にきれいに見えました。 「!」の完全に異なる意味を学習しようとしていました。 LISPは少なくとも非常に異なって見えるので、LISPの小さな部分をcと誤って解釈するのを避けるのは簡単です。

2
Kim Reece

リアルタイム組み込みシステムで言語を使用したい場合は、ポインターが必要であり、GCを購入する余裕はありません。

2

主な理由は、OCamlを知っている開発者が少なすぎるためだと思います。

そして、他の開発者(Ocamlについて何かを聞いた人)と話すとき、私は常に彼らがOCamlを「教育専用」の言語と考えているような印象を受けます...悲しいが本当です

1
Chris

私はO'camlがとても好きです...私はそれを使用して、コンパイラー、インタープリター、Cと通信するためのシステムをたくさん実装しました...

私がそれを学んだとき、主な問題はエラーメッセージが本当にはっきりしていないことでした...たとえば、最初は「;」をいつ置くべきか本当にわかりませんでした。そしてそれを実際に見つけるのは本当に大変でした。見当違いだった...

0
LB40