タグ

ブックマーク / www.kotha.net (10)

  • 7.22. Concurrent HaskellおよびParallel Haskell

    ruicc
    ruicc 2012/07/08
    僕がイメージしていたConcurrentとParallelはこれだな。
  • GHCのこと

    オブジェクトレイアウト 通常のHaskellの値(代数的データ型および関数)と、未評価の計算を表すサンクは、全てポインタで参照される。ポインタが指す先は通常はヒープ上のオブジェクトだが、静的セクションに置かれていることもある。いずれにしてもレイアウトは同じで、以下の一般形をとる。 オブジェクトの先頭1ワードは静的領域へのポインタ(infoポインタ)で、この値を評価(関数なら適用)するためのコード(entry code)と、このオブジェクトの種類に関する情報を集積したレコードを指している。なお、GHCにおける1ワードはポインタと同じ大きさ、つまり32ビットOSなら32ビット、64ビットOSなら64ビットである。これはIntの精度と同じでもある。 代数的データ型 代数的データ型の評価済みの値では、infoポインタが構築子の種類を表し、その後に構築子の引数を入れるスロットが続く。したがって、N引

    ruicc
    ruicc 2012/03/11
    高階関数や型クラスで多重定義された関数は、実行時まで関数が決まらないのでインライン化やworker/wrapper変換の恩恵を受けられない
  • 最適化(コードの改善)

  • 非ボックス化型とプリミティブ演算

    GHCは大量のプリミティブなデータ型と演算を基礎としている。(「プリミティブ」だというのは、Haskell自体では定義できないという意味である)。高速なコードを書くためにこれらを使うこともできるが、高水準の言語機能やライブラリを使った方が、通常はずっと苦痛が少なく、長期的に見て良い結果になる。運が良ければ、書いたコードは最適化されて、結局、効率的な非ボックス化版になる。もしそうならないときは知らせてほしい。 これらのプリミティブなデータ型と演算は全てGHC.Primというライブラリからエクスポートされている。これには詳細なオンライン説明書がある。(この説明書はcompiler/prelude/primops.txt.ppというファイルから生成されている) プログラム中でプリミティブなデータ型や演算に言及したいなら、まずGHC.Primをインポートしてそれらをスコープに導入しなければならない

    ruicc
    ruicc 2011/08/06
    ボックス化と非ボックス化について
  • Haskellコードの高速化

    Haskellで速いコードを書くためのヒントを無秩序に集積したもの。環境としてはGHCを想定する。私は高速化について詳しい訳ではないが、思い付いたことはなんでもかんでも書くように心がけたので、運が良ければ何か役に立つ情報があるかもしれない。 並列処理のパフォーマンスについてはこの文章では触れない。まったく経験がないので。同じ理由で、浮動小数点数を多用した数値計算コードの効率化と、書き換え規則を多用する高水準の最適化も扱わない。 お願い: 文中に間違いや分かりにくい部分があれば指摘いただけると有難いです。また、他に載せた方が良さそうな最適化テクニックや、その他の改善提案があれば教えてください。掲示板またはメールまたはTwitter(@mkotha)までお願いします。 目次 基的なこと 遅延評価の計算量見積もりの方法と、GHCの内部に依存しないテクニック集。入門書を読んだけれども、Haske

    ruicc
    ruicc 2010/12/24
    ghc内部の理解に。
  • 4.20. フラグ早見表

    この節はGHCのコマンド行フラグの早見表である。それぞれのフラグについて、動的/静的の区別(4.3. 静的オプション、動的オプション、モード指定オプションを見よ)と逆のフラグ(存在すれば)も載せられている。

    ruicc
    ruicc 2010/12/12
    ghcフラグ
  • 7.19. アサーション

    標準Haskellのコードでアサーションを使いたいなら、次のような関数を定義することができるだろう。 assert :: Bool -> a -> a assert False x = error "assertion failed!" assert _ x = x これは動作するが、発生するエラーメッセージは全く役に立たない。アサーションが失敗した。よろしい。しかしどこのどれが失敗したのだ? 一つの解決策は、assertを拡張して、エラーメッセージに含める文字列を受け取るようにし、例えばソース中でassertが使われている場所にソース位置を挿入する前処理器と組み合わせることである。 GHCはこれに対して救いの手を差しのべる。これら全てを代わりに行うことによって。ユーザのソースにおいてassertが使われているところ全てに対して、以下の処理を行う。 kelvinToC :: Double

    ruicc
    ruicc 2010/11/10
    ghcではControl.Exception.assertの適用を見つけると、ファイル名と行番号を出力するように書き換える
  • 2.6. GHCiを起動する

    GHCiはghciまたはghc --interactiveというコマンドで起動される。一つまたは複数のモジュールやファイル名をコマンド行から指定することもできる。そうすると、GHCiは、プロンプトで:load moduleと入力されたときと同じように(2.7. GHCiのコマンド群を見よ)、指定されたモジュールやファイル(と、それらが依存するモジュール)をロードする。例えば、GHCiを起動して、プログラム(Main.hsに最上位モジュールがある)をロードするには、次のように打てば良い。 $ ghci Main.hs GHCが受け付けるコマンド行オプション(第4章. GHCを使うを見よ)の大部分は対話的モードでも有効であり、そうでないオプションは大抵明らかである。 大部分のパッケージ(4.9.1. パッケージを使う を見よ)は追加のフラグを指定することなく利用可能であり、初めて必要になったと

    ruicc
    ruicc 2010/11/10
    同名モジュールを持っている複数のパッケージがある場合、:set -hide-package {package-name} として隠せばいいと。もしくはghci立ち上げ時に-hide-packageフラグを用いる。
  • 4.5. 実行モード

    GHCの振る舞いはまずモード指定フラグによって制御される。これらのフラグのうちただ一つだけを使うことができるが、コマンド行において最初のオプションである必要はない。 モードフラグがない場合、コマンド行にソースファイルがあるならGHCはmakeモード(4.5.1. ghc --makeを使う)に入り、そうでないならコマンド行中で指定されたオブジェクトをリンクして実行ファイルを作る。 以下のモードフラグが利用できる。

    ruicc
    ruicc 2010/11/10
    --makeについて。"コマンド行はソースファイル名やモジュール名をいくつ含んでいても良い。それらを初期モジュールとしてインポートを追いかけることで、GHCはプログラムの全てのモジュールを見つけ出す。"
  • 栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン7.8.2

    栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン7.8.2 The GHC Team 目次 The Glasgow Haskell Compiler License 1. 参考訳 1. GHCの紹介 1.1. GHCを入手する 1.2. メタ情報: ウェブサイト、メーリングリストなど 1.3. GHCのバグを報告する 1.4. GHCのバージョン番号付け規則 1.5. Release notes for version 7.8.1 1.5.1. Highlights 1.5.2. Full details 1.5.2.1. Language 1.5.2.2. Compiler 1.5.2.3. GHCi 1.5.2.4. Template Haskell 1.5.2.5. Runtime system 1.5.2.6. Build system 1.5.3. Lib

  • 1