web-dev-qa-db-ja.com

SMLとOCamlの違いは何ですか?

2つのML方言の違いは何ですか?

98
Nathan

技術的なもの、社会政治的なものなど、多くの違いがあります。私はもっ​​と重要な違いを最初にしようとしました。

  • SMLは、定義と標準を備えた言語です。安定しています(実際には凍結されているため、進化することはできません)。 Objective Camlは、INRIAの小さなグループによって制御される実装です。それは進化し続けています。 (IMOの進化はうまく管理されています。)

  • SMLには多くの実装があります。 Camlには1つしかありません。

  • Objective Camlにはいくつかの追加機能があり、その中で最も顕著なのはおそらくオブジェクトと多態的なバリアントです。

  • 2つの言語では、レコードタイプのモデルが劇的に異なります。簡単に言えば、Camlでは、レコードフィールドの名前は一意である必要があります。SMLでは、同じスコープ内の2つの異なるレコードタイプが共通のフィールド名を持つ場合があります。この癖により、SMLからCamlへの移植が少し難しくなる場合があります。

  • かなりの構文上の違いがあります。

  • ライブラリと標準関数は劇的に異なります。 Camlライブラリは非常に必須ですが、SML標準ベーシスライブラリはより機能的です。たとえば、関数構成はSMLのトップレベルのプリミティブです。 Camlライブラリの一部ではありません。 Caml文字列ライブラリは折りたたみ機能を提供しません(少なくともバージョン3.08以降)。 CamlのList関数の多くの実装は、非常に長いリストに対して安全ではありません。彼らはスタックを爆破します。

  • 型システムは微妙に異なります。Camlでは、型tyが型eと統一されている場合、式e : tyの型注釈が受け入れられます。 SMLでは、_e : tyは、ty型がe型のinstanceである場合にのみ受け入れられます。この違いは、式が多形であることを主張するために型注釈を使用することが不可能であるため、Camlでの注釈の実用性を大幅に低下させます。

  • Camlは、インターフェイス(モジュールタイプまたはsignaturesと呼ばれる)と(コンクリート)実装((modulesまたはstructures)SMLより。 SMLではほとんどすべてのことがうまくいき、良い規則を確立するにはプログラマーに依存する必要があります。 Camlでは、コンパイラーによって適切な規則が確立され、適用されます。

  • SMLでは、算術演算子がオーバーロードされて、浮動小数点データと整数データの両方に適用されます。 Camlでは、オペレーターは過負荷になりません。浮動小数点演算子は、余分なドットで表記されます。

  • SMLでは、プログラマーは中置演算子の優先順位と結合性を制御できます。 Camlでは、これらはオペレーターの名前の最初の文字によって決定されます。この制限により、独自の中置記法を定義できる利点が制限されます。

編集コメント付きのより詳細な分析については、 Adam Chlipalaの比較ページ もご覧ください。

156
Norman Ramsey

Norman Ramseyが述べた構文の違いに関する詳細については、ここにいくつかのWebページがあります。

31
bk1e