プログラムのデバッグ支援(仮)

Yasutaka Higa

プログラムのデバッグ支援(仮)

研究目的(仮)

  • プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる
  • 挙動は予想されていた挙動と異なる場合があり、それはバグとなる
  • ソースコードの改変前と改変後の挙動を比較することで、デバッグの支援になるのでは無いか
  • 異なるバージョンのプログラムを同時に実行できるデバッグ支援ツールを開発する

近況報告

  • オープンキャンパスは土曜日です
  • ハッカーズチャンプルー行ってきました
  • glibc の printf ちょっと見たりしました
  • parallel debugger の 例探しは難航中
  • Reflection without remorse を一通り流し読み

parallel debugger sample session

  • Cerium を clone してみました
  • debugger なので実行できるコードを考える
  • あるならそれで bisect できる
    • VCS にさせるべきなのかな、と思ってしまったり
  • もっと内部的な処理が分かる実行コード?
    • それってもうテストなのでは
  • うーん、ってなってます

reflection without remorse

  • 所感まとめ
    • モノイドに対する演算で右結合だと遅いやつ
    • それを右結合で書かれても CPS にすることで左結合にしよう
    • データ型の変換で CPS に変えることができそう
  • 適応例
    • list の ++ とか
    • Monad にも適用可能っぽいです

reflection without remorse - diff list

  • hg/Members/atton/haskell/reflection_without_remorse にあります
  • DiffList を定義
  • リストを取ってリストを返す
type DiffList a = [a] -> [a]

reflection without remorse - abs and rep

  • List から DiffList にする rep と DiffList から List にする abs
absFromDiffList :: DiffList a -> [a]
absFromDiffList a = a []
rep :: [a] -> DiffList a
rep = (++)

reflection without remorse - concat diffliset

  • difflist の concat は 関数合成
  • difflist 最後に abs されるまで ++ は評価されないので速い
  • 実行例はリポジトリで
(+++) :: DiffList a -> DiffList a -> DiffList a
(+++) = (.)