web-dev-qa-db-ja.com

大規模なリアルタイムシステムにHaskellを使用する:どのように(もし?)?

Haskellの力を埋め込まれたリアルタイムの世界に適用できるかどうかを知りたいと思っていましたが、グーグルで Atom パッケージを見つけました。複雑なケースでは、コードにすべての古典的なCバグ(クラッシュ、メモリ破損など)が含まれている可能性があり、それらを引き起こした元のHaskellコードまで追跡する必要があると思います。つまり、これは質問の最初の部分です。「Atomの経験がある場合、コンパイルされたCコードの低レベルのバグをデバッグし、Haskellの元のコードで修正するタスクにどのように対処しましたか?」

Atomの例をさらにいくつか検索しました、 このブログ投稿 結果のCコード22KLOCに言及しています(そして明らかにコードはありません:)、 含まれている例 はおもちゃです。 This および this 参照にはもう少し実用的なコードがありますが、これで終わりです。そして、私が主題に「かなり」を入れた理由は、300KLOC +の範囲で生成されたCコードでの作業の経験を共有していただければ最も興味があります。

私はHaskellの初心者なので、未知のものが原因で見つからなかった方法が他にもあることは明らかです。そのため、この分野での独学に関する他の指針をいただければ幸いです。これは質問の2番目の部分です。 「Haskellでリアルタイム開発を行う他の実用的な方法は何でしょうか?」マルチコアも写真に含まれている場合、それは余分なプラスです:-)

(この目的のためのHaskell自体の使用法について:私が読んだものから このブログ投稿 、Haskellのガベージコレクションと怠惰は、スケジューリングに関してかなり非決定的ですが、おそらく2年で何かが変わりました。 実世界のHaskellプログラミング 質問SOはこのトピックに最も近いものでした)

注:上記の「リアルタイム」は「ハードリアルタイム」に近くなります-一時停止時間を確保できるかどうか知りたいですメインタスクが実行されていないときは0.5ms未満です。

56
Andrew Y

ガロアでは、Haskellを2つの目的で使用しています。

  • ソフトリアルタイム(OSデバイス層、ネットワーク)。1〜5ミリ秒の応答時間が妥当です。 GHCは高速コードを生成し、適切なタイミングを取得するためにガベージコレクターとスケジューラーを調整するための十分なサポートを備えています。
  • 真のリアルタイムシステムの場合、EDSLは、より強力なタイミング保証を提供する他の言語のコードを生成するために使用されます。例えば。クリプトール、Atomおよび副操縦士。

したがって、EDSL(CopilotまたはAtom)とホスト言語(Haskell)を区別するように注意してください。


重要なシステムのいくつかの例、および場合によっては、ガロアによって作成された、Haskellから作成または生成されたリアルタイムシステム。

EDSL

システム

  • HaLVM -組み込みおよびモバイルアプリケーション用の軽量マイクロカーネル
  • [〜#〜] tse [〜#〜] -クロスドメイン(セキュリティレベル)ネットワークアプライアンス
49
Don Stewart

アンドリュー、

はい、生成されたコードを使用して元のソースに問題をデバッグするのは難しい場合があります。 Atomが提供するのは、内部式をプローブし、これらのプローブの処理方法をユーザーに任せる手段です。車両テストでは、(Atomで)送信機を構築し、プローブをストリーミングします。その後、このデータをキャプチャしてフォーマットし、GTKWaveなどのツールで後処理またはリアルタイムで表示できます。ソフトウェアシミュレーションでは、プローブの処理が異なります。CANプロトコルからプローブデータを取得する代わりに、Cコードにフックを作成して、プローブ値を直接持ち上げます。次に、プローブ値をユニットテストフレームワーク(Atomで配布)で使用して、テストが成功したか失敗したかを判断し、シミュレーションカバレッジを計算します。

6
Tom

小さなメモリに収まり、ミリ秒未満の休止時間を保証できるHaskellシステムが登場するまでには長い時間がかかります。 Haskellの実装者のコミュニティは、この種のターゲットに興味を持っていないようです。

HaskellまたはHaskellのようなものを使用して非常に効率的なものにコンパイルすることに強い関心があります。たとえば、 Bluespec はハードウェアにコンパイルされます。

それがあなたのニーズを満たすとは思いませんが、関数型プログラミングと組み込みシステムに興味があるなら、 Erlang について学ぶべきです。

6
Norman Ramsey

私はAtomをいじっています。かなりかっこいいですが、小さなシステムに最適だと思います。はい、トラックやバスで動作し、実際の重要なアプリケーションを実装しますが、それはそれらのアプリケーションが必ずしも大規模または複雑であることを意味するわけではありません。これは本当にハードリアルタイムアプリ向けであり、すべての操作にまったく同じ時間をかけるために非常に長い時間がかかります。たとえば、実行時間が異なる可能性のある2つのコードブランチの1つを条件付きで実行するif/elseステートメントの代わりに、2つの計算値の1つを条件付きで選択する前に常に両方のブランチを実行する「mux」ステートメントがあります(したがって、合計実行時間は、どちらの値を選択しても同じです)。 Atomモナドを介して渡されるGADT値を介して適用される組み込み型(Cと比較して)以外の重要な型システムはありません。作成者は静的検証ツールに取り組んでいます。これは出力Cコードを分析します。これはかなりクールです(SMTソルバーを使用します)が、Atomは、より多くのソースレベルの機能とチェックの恩恵を受けると思います。私のおもちゃサイズのアプリでも(LED懐中電灯コントローラー)、パッケージの経験が豊富な人が避けられるかもしれない多くの初心者エラーを作成しましたが、その結果、テストではなくコンパイラーによってキャッチされたほうがよいバグのある出力コードが生成されました。一方、バージョン0.1.somethingのままなので、間違いなく改善が行われる予定です。

4
solrize

GCはランタイムを短い一時停止に償却する傾向があるため、Haskellやその他のガベージコレクション言語はハードリアルタイムシステムにはあまり適していないと思います。

Atomでの書き込みは、Haskellでのプログラミングではありません。ここでのHaskellは、実際に作成しているプログラムの純粋なプリプロセッサと見なすことができるためです。

Haskellはawesomeプリプロセッサだと思います。DSELのようなAtomを使用することは、かなりのハードリアルタイムシステムを作成するための優れた方法ですが、=かどうかはわかりません。 Atomは法案に適合するかどうか。そうでない場合は、そうするDSELを実装することが可能であると確信しています(そしてそうする人は誰でもお勧めします!)。

低水準言語用のHaskellのような非常に強力なプリプロセッサがあると、Cコードテキストジェネレータとして実装するとはるかに扱いにくいコード生成を通じて抽象化を実装する大きな機会が開かれます。

4
Peaker