33

とりあえず、C++ は関数型プログラミング言語ではないと仮定しましょう。バックエンドに LLVM を使用してコンパイラを作成し、関数型プログラミング言語とその LLVM へのバインディングを使用して作業を行いたい場合、私の知る限り、Objective Caml と Haskell の 2 つの選択肢があります。他にもあるならそちらも知りたいです。

私は主観的な意見を求めているわけではないので、これにsubjectiveタグを付けないでください. これについて自分で決めたいのですが、すべてのトレードオフが何であるかはわかりません。だから、救助へのStackOverflow。トレードオフは何ですか?

4

4 に答える 4

14

OCaml または Haskell のいずれかが適切な選択です。各言語の LLVM チュートリアルをチェックしてみませんか? OCaml の LLVM チュートリアルはこちら: http://llvm.org/docs/tutorial/OCamlLangImpl1.html

Haskell は最近勢いを増していますが、PEG パーサー ジェネレーターAurochsMenhir、GLR パーサー ジェネレーターDypgenなど、OCaml 用の優れた解析ライブラリもたくさんあります。また、OCaml 用のモナド パーサー コンビネータ ライブラリ (Haskell 用の Parsec など) である pcl に関するこのプレゼンテーションもチェックしてください。そこには、Haskell と OCaml のアプローチを比較した良い情報があります: http://osp.janestreet.com/files/pcl.pdf

遅延は Haskell に構文解析の優位性を与えると言う人もいますが、OCaml でも遅延を取得できます。

于 2009-11-21T03:05:37.593 に答える
10

HaskellはOCamlよりもLLVMへの高レベルのバインディングを持っており(Haskellのものはいくつかの興味深いタイプの安全性保証を提供します)、Haskellははるかに多くのライブラリを使用して(http://hackage.haskell.orgの1700パッケージ)、コンポーネントを簡単に接着できます。

于 2009-11-21T19:25:23.510 に答える
7

ネイティブ バインディングが利用できるからといって、言語の選択が制限される必要はありません。バインディングを使用するか、IR テキストを直接生成する以外に、3 番目のオプションがあります。

Google の Protocol Buffers など、言語に依存しないシリアル化形式を使用して、フロントエンドからバックエンドへのブリッジとして機能させることができます。プロトコル バッファは、結局のところ、見せかけの AST にすぎません。

関数型言語で実装されたフロントエンドは、解析、型チェック、脱糖、コアからコアへの変換など、最も得意とすることを行い、C++ バックエンドはフロントエンドから IR を受け取り、LLVM の機能を使用します。 -あなたの言語のIRからLLVM IRへの低下を​​行うための定義による完全なネイティブC++ API。これにより、デバッグ メタデータなどの LLVM の「高度な」機能の処理がはるかに簡単になります。

私はこの戦略をhprotocプロトコル バッファの Haskell バインディングと関連付けて使用しており、その結果に非常に満足しています。仕事に適したツールを使用することについては、言うべきことがたくさんあります!

于 2011-02-08T05:34:13.170 に答える