57

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

私は Atom の例をいくつか探しました。このブログ投稿では、結果の C コード 22KLOC について言及されています (そして明らかにコードはありません:) 。含まれている例はおもちゃです。thisおよびthisリファレンスにはもう少し実用的なコードがありますが、これで終わりです。この件名に「かなり」を入れた理由は、生成された C コードを 300KLOC+ の範囲で使用した経験を共有していただければ幸いです。

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

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

注:上記の「リアルタイム」は「ハード リアルタイム」に近いものです。メイン タスクが実行されていないときの一時停止時間を 0.5 ミリ秒未満にすることができるかどうか、興味があります。

4

5 に答える 5

52

Galois では、次の 2 つの目的で Haskell を使用しています。

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

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


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

EDSL

システム

  • HaLVM -- 組み込みおよびモバイル アプリケーション向けの軽量マイクロカーネル
  • TSE -- クロスドメイン (セキュリティ レベル) ネットワーク アプライアンス
于 2009-08-12T18:15:26.487 に答える
6

アンドリュー、

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

于 2009-10-17T13:14:17.990 に答える
6

小さなメモリに収まり、サブミリ秒の一時停止時間を保証できる Haskell システムが登場するまでには、長い時間がかかるでしょう。Haskell 実装者のコミュニティは、この種のターゲットに関心がないようです。

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

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

于 2009-08-12T03:36:35.313 に答える
4

Haskell やその他の Garbage Collected 言語は、ハード リアルタイム システムにはあまり適していないと思います。GC はランタイムを短い一時停止に分割する傾向があるためです。

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

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

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

于 2009-08-12T12:31:05.410 に答える