web-dev-qa-db-ja.com

HaskellとC ++の混合

HaskellとC++の両方を使用するアプリケーションを使用する可能性がある場合。 Haskellで管理するレイヤーとC++で管理するレイヤーを教えてください。

誰かがそのような関連付けをしたことがありますか(確かに)?

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

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

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

38

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

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

これら2つのステートメントの間には緊張関係があります。彼の論文では 「構造化プログラミングとgo toステートメント、” ドナルドクヌースは書いた

私は長い間、プログラミングの才能は、物事の微視的ビューから巨視的ビューに簡単に切り替える能力ieで構成されていると感じていました。抽象化のレベルを流暢に。

HaskellとC++の使い方だけでなく、いつどのように結合するかを知っていると、あらゆる種類の問題が解決されます。

私が書いた最後の大きなプロジェクトでは、 [〜#〜] ffi [〜#〜] Cで書かれた社内レーダーモデリングライブラリを使用していました。それを再実装するのはばかげていて、高い表現をしていました。アプリケーションの残りの部分のレベルのロジックは苦痛だったでしょう。私はその「頭脳」をHaskellに保存し、必要なときにCライブラリを呼び出しました。

あなたはこれを演習としてやりたいので、同じアプローチをお勧めします:Haskellでsmartsを書いてください。 HaskellをC++のスレーブとしてシャックリングすると、おそらくあなたを苛立たせたり、時間を無駄にしているように感じさせたりするでしょう。その強みがある各言語を使用してください。

27
Greg Bacon

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

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

したがって、私がHaskell、C、C++、Pythonに精通しているとしましょう。アプリケーションの作成方法は、次のとおりです。

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

この答えは包括的な答えというよりは物語ですが、私は計算言語学の論文に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)をお勧めします。

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

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

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

5
pmr