大規模な関数型プログラムの欠陥を診断するために使用されるツールと方法に興味があります。どのようなツールが便利ですか? 私の現在の理解では、'printf' デバッグ (たとえば、ログの追加と再デプロイ) が通常使用されるものです。
機能するシステムのデバッグを行ったことがあれば、オブジェクト指向または手続き型言語で構築されたシステムのデバッグと何が違うのでしょうか?
大規模な関数型プログラムの欠陥を診断するために使用されるツールと方法に興味があります。どのようなツールが便利ですか? 私の現在の理解では、'printf' デバッグ (たとえば、ログの追加と再デプロイ) が通常使用されるものです。
機能するシステムのデバッグを行ったことがあれば、オブジェクト指向または手続き型言語で構築されたシステムのデバッグと何が違うのでしょうか?
悲しいことに、printf
デバッグはStandard ML、Objective Caml、Haskellの実践の状態のようです。インタラクティブなread-eval-printループでは少しデバッグが行われますが、アプリが25,000行または50,000行に達すると、あまり役に立ちません。
幸運にもHaskellを使用できる場合は、例外があります。QuickCheckは、テストとデバギングに不可欠です。Xmonadウィンドウマネージャーの経験からわかるように、QuickCheckはHaskellとCコードの組み合わせでも使用できます。
1990年頃にAndrewTolmachがニュージャージーのStandardML用に非常に優れたタイムトラベルデバッガーを構築したことは注目に値しますが、それは維持する価値があるとは見なされていませんでした。ある時点で、OCamlデバッガー(これもタイムトラベルデバッガー)はバイトコードでしか機能しなかったことも注目に値します。これは不便であり、抽象化の障壁に違反することを拒否したため、役に立たなくなりました。これはリリース3.07かそこらでした。おそらく状況は改善されました。
また、1990年代初頭、Henrik NilssonはHaskell用の興味深いデバッガーを構築しましたが、ほとんどの場合、デバッガーがプログラムの評価動作を誤って変更するのを防ぎました。これは面白かったですが、それはlavzy-evaluationweeniesだけでした。
これらの3つの言語すべてで大規模なアプリケーションを構築または開発した人として、私は遊びの状態が気のめいるように感じます。
F# には Visual Studio が統合されているため、デバッガーをプログラムにアタッチして、他の .NET 言語と同様にブレークポイントやウォッチなどを設定できます。
ただし、個別に単体テストできる短い関数を作成することで、デバッグをできるだけ避けたいと考えています。
私の現在の仕事は、新しい機能を実装し、ocaml と C# で実装された大規模システムをサポートすることです。ほとんどの「ロジック」は caml で実装され、GUI とデータ アクセスは C# で行われます。デバッグ手法は、多くのログを記述し、何が問題なのかを解決するためにアサートするのとほとんど同じです。
さらに、多数の単体テストがあります。これらは、ロジックをテストするための caml スクリプトであり、リグレッション エラーを特定するのに役立ちます。
また、継続的インテグレーションを使用してビルドをチェックし、夜間のテスト スクリプトを実行します。これには、「自動化」スタイルのスクリプト インターフェイスによる GUI の自動テストが含まれます。
アプリケーションの C# 部分をデバッグするために C# デバッガーをよく使用しますが、ocaml デバッガーはまだ Windows で動作するため、使用していません。いつの日かこれを修正できることを願っていますが、最優先事項ではありません。私は時折、windbg を使用してマネージ メモリとアンマネージ メモリの問題を調査しましたが、これは C# で実装されたサード パーティ コンポーネントが原因であることが判明しました。
全体として、異常なことは何もありませんが、問題なく動作しているように見えます。生産上の問題はあまり見られません。
ありがとう、ロブ
数年前にこれを行ったとき、printf デバッグと QuickCheck を組み合わせて使用する必要がありました。最近では、ghci 組み込みデバッガーも使用しています。
最大の頭痛の種は、時空間リークを引き起こす怠惰でした。これらに対する適切な答えはまだないようです。たくさんのプロファイリングを行い、それを理解しようとし続けてください。
OCaml と F# はどちらも優れたデバッガを備えています。OCaml は時間可逆です。F# は優れた IDE とマルチスレッドをサポートしています。