2016-09-08 10 views
0

私は、リアルタイム組み込みシステムをテストするための簡単なインタプリタ言語を設計しています。制御フローは、スクリプトが何を実行するか、どのくらい実行するかについて強い静的保証を提供するために厳しく制限されています。たとえば、定数条件に分岐するか、固定範囲にループするだけです。HaskellでシンプルなDSLをC++ interopで構築する

関連するモデルとIOライブラリを持つC++には大きなコードベースが存在するため、この言語はC++を呼び出すことができる必要があります。テスト対象のシステムには厳しいタイミング要件があるため、テストフレームワークでは多くのジッタを許容できません。過去のソリューションはC++ランタイムに埋め込まれたカスタムDSLでしたが、必要な静的保証を実現するにはあまりにも多くのホイール(パーサー、リンター、インタラクティブなインタプリタなど)を再発明しました。

埋め込まれたDSLをこれらの保証付きで作成するためのHaskellの機能は、私には非常に魅力的ですが、ソフトリアルタイムのC++ランタイムに埋め込む方法が決まっていません。何か案は?任意のライブラリ/既存のプロジェクトへのポインタは非常に高く評価されるでしょう!

+1

[GHC RTSを埋め込む](https://downloads.haskell.org/~ghc/7.10-latest/docs/html/users_guide/ffi-ghc.html) - 簡単に説明すると、 HaskellからのHaskellソースをロード&実行するために[ヒント](https://hackage.haskell.org/package/hint)を使用するか、C++からプリコンパイルされたHaskellコードの共有ライブラリをロードしてください。 (後者は、Facebookの[Haxl](https://github.com/facebook/Haxl)コードでやっていることです)。 –

答えて

2

最も抵抗の少ないパスのような音は、C++を生成するEDSLです。このように、ソフトリアルタイムとGHC RTSの潜在的な不一致を心配する必要はありません。

あなたはどのように実装されている他のPLを生成EDSLsに見えるかもしれません:

  • HJScriptはJSを埋め込むに無料モナドのアプローチを使用しています。
  • JMacroは、より多くの外部DSLアプローチを使用しますが、TH経由で埋め込みます。私の選択ではないだろう。

C++コードの文字列を生成するのではなく、データ構造を持つのがいいです。残念ながら、C++で利用可能なパッケージはないようです。しかし、あなたはlanguage-cを見ることができます - おそらくそれを拡張するか、自分でビルドします。 Cを生成し、それらの言語が提供するC to C++相互運用機能を使用することも考えられます。

CryptolまたはCogentのデザインは、完全に本格的なプログラミング言語であるため(あなたが離れて行く傾向があることを示しています)、あなたを納得させるでしょう。

関連する問題