42

Haskell と C++ の両方を使用するアプリケーションを作成する可能性がある場合。どのレイヤーを Haskell に管理させ、どのレイヤーを C++ に管理させますか?

そのような関連付けを行った人はいますか (確かに) ?

(Haskell のサイトによると、Haskell には gcc によって C でコンパイルできるモードがあるため、非常に簡単です)

最初は、すべての I/O 操作を C++ レイヤーに保持すると思います。GUI管理も同様です。

かなり漠然とした質問ですが、Haskell を学ぶつもりなので、Haskell コードに一部の作業を委任することを考えていました (実際にコーディングする中で学びます)。Haskell の利点が見られる部分を選択したいと考えています。

4

4 に答える 4

28

Haskell の利点は、使用できる強力な抽象化です。1 と 0 とアドレスとレジスタの観点からではなく、計算と型のプロパティと継続の観点から考えています。

C++ の利点は、必要に応じてどれだけ厳密に最適化できるかです。高尚なモナド、矢印、部分適用、純粋な関数の作成について考えているわけではありません。C++ を使用すると、ベアメタルにすぐに到達できます。

この 2 つのステートメントの間には緊張があります。ドナルド・クヌースは、彼の論文「ステートメントを使用した構造化プログラミング」で、次のように書いています。go to

私は長い間、プログラミングの才能は、物事の微視的な見方から巨視的な見方へと容易に切り替える能力、つまり、抽象化のレベルを流暢に変える能力に大きく左右されると感じてきました。

Haskell と C++ の使い方だけでなく、それらをいつ、どのように組み合わせるかを知っていれば、あらゆる種類の問題を解決できます。

私が最後に書いたFFIを使用した大きなプロジェクトでは、C で記述された社内のレーダー モデリング ライブラリを使用していました。それを再実装するのはばかげたことであり、アプリケーションの残りの部分の高レベル ロジックを表現するのは大変なことでした。その「頭脳」を Haskell に保持し、必要なときに C ライブラリを呼び出しました。

演習としてこれを行いたいので、同じアプローチをお勧めします: Haskell でスマートを記述します。Haskell を C++ の奴隷としてシャックリングすると、おそらくイライラしたり、時間を無駄にしたように感じたりすることになります。それぞれの言語の強みを生かしてください。

于 2010-08-22T13:16:28.310 に答える
11

これが私が物事を見る方法です:

  • 関数型言語は、物事の変換に優れています。入力を取り、それをマップ/フィルター/縮小するプログラムを作成するときはいつでも、関数構造を使用してください。Haskell が優れているはずの素晴らしい現実世界の例は、Web アプリケーションによって提供されます (基本的に、データベースに格納されているものを Web ページに変換します)。
  • 手続き型言語 (OOP 言語手続き型) は、オブジェクト間の副作用と通信に優れています。それらを使用してデータを変換するのは面倒ですが、システム プログラミングや人間との (双方向の) 対話 (クライアント側の Web プログラミングを含む、あらゆる種類のユーザー インターフェイス) を行う場合はいつでも、きれいにジョブを実行します。
  • ただし、ユーザー インターフェイスには機能的な記述が必要であると主張する人もいるかもしれませんが、十分に確立されたフレームワークは OOP 言語で簡単に使用できるため、このように使用する必要があると私は答えます。結局のところ、UI コンポーネントをオブジェクトとオブジェクト間の通信の観点から考えるのは自然なことです。
  • IO は単なるツールです。入力を出力に変換するときはいつでも、Haskell (または任意の FP 言語) が IO を実行する必要があります。人間と話すときはいつでも、C++ (またはその他の OOP 言語) が IO を実行する必要があります。
  • 速度は気にしないでください。適切な仕事に Haskell を使用すると効率的です。適切な仕事に C++ または Python を使用すると、効率的です。

したがって、私が Haskell、C、C++、および Python に堪能であるとしましょう。以下に、アプリケーションの作成方法を示します。

  • アプリケーションの主な役割がデータを変換することである場合、Haskell で記述し、低レベルの部分を C で記述します (C++ で記述されたハイテクの低レベルの部分を呼び出す可能性がありますが、私は固執します)。移植性の理由から、インターフェイスとして C を使用します)。
  • アプリケーションの主な役割がユーザーと対話することである場合、Python (たとえば PyQt) で記述し、C++ で記述されたパフォーマンスが重要なルーチンを Python に呼び出させます (boost::python はバインディング ジェネレーターとして非常に優れています)。また、Haskell で記述されるデータを変換またはフェッチするサブルーチンを呼び出す必要がある場合もあります。
  • Haskell でアプリケーションの一部を作成する必要がある場合は、それを C 呼び出し可能な API に分離します。
  • 場合によっては、stdin で読み込んで stdout に書き戻す Haskell アプリケーションがサブモジュール (fork/exec などで呼び出すもの) として役立ちます。場合によっては、シェル スクリプトがそのようなアプリケーションの適切なラッパーになることがあります。
于 2010-11-08T11:08:29.250 に答える
7

この回答は、包括的な回答というよりもストーリーですが、計算言語学の論文には、Haskell、Python、および C++ を組み合わせて使用​​し、作成していない C および Java ツールもいくつか使用しました。Python を接着コードとして使用して、Haskell、C++、および Java プログラムを開始することで、すべてを個別のプロセスとして実行するのが最も簡単であることがわかりました。

C++ は、機能の出現をカウントする非常に単純でタイトなループでした。基本的には、数学と単純な I/O だけでした。実際には、Python グルー コードに#defines でいっぱいのヘッダーを書き出させて再コンパイルすることで、オプションを制御しました。ちょっとハックですが、うまくいきました。

Haskell はすべての中間処理でした。私が使用したさまざまな C および Java パーサーから複雑な出力を取得し、無関係なデータをフィルター処理して、C++ コードが期待する単純な形式に変換します。次に、C++ の出力を取得し、LaTeX マークアップ (他の形式の中でも) に変換しました。

これは、Python が強いと期待される分野ですが、Haskell を使用すると複雑な構造を簡単に操作できることがわかりました。単純な行から行への変換にはおそらく Python の方が適していますが、解析ツリーを細かく分割していたところ、Python でコードを書いたときに入力と出力の型を忘れていたことに気付きました。

私は Haskell をより構造化されたスクリプト言語のように使用していたので、いくつかのファイル I/O ユーティリティを作成することになりましたが、それ以上は、ツリーとリスト操作用の組み込みライブラリで十分でした。

要約すると、私のような問題がある場合は、メモリに制約があり速度が重要な部分には C++ を、高レベルの変換には Haskell を、すべてを実行するには Python をお勧めします。

于 2010-08-22T22:07:48.140 に答える
5

私は両方の言語を混在させたことはありませんが、あなたのアプローチは少し逆さまに感じます. Haskell は高レベルの操作に適していますが、C++ は最適化でき、タイトなループやその他のパフォーマンスが重要なコードに最も有益です。

Haskell の最大の利点の 1 つは、IO をモナドにカプセル化できることです。この IO がタイム クリティカルでない限り、C++ で実行する理由はありません。

GUI部分については、おそらく正しいでしょう。多くの Haskell GUI ライブラリがありますが、C++ には QtCreator などの強力なツールがあり、退屈なタスクを大幅に簡素化します。

于 2010-08-22T10:39:42.903 に答える