2017-02-14 14 views
2

(誤解を招くタイトル:が全体以外のリファレンスマニュアルではありませんが、このトピックのための完全なリファレンスマニュアルを尋ねるが、心に留めておくようにこれらの音:それは唯一の以下、相互に関連似た質問の茄多のをですGHCのSTGパイプラインステージのソースコードと、他の人や "インサイダー"の集約されたエクスペリエンス)GHCの-O2でのSTG出力では、Str = DmdTypeに続くこのシーケンスはどれくらいですか?

私は、 /既存のGC +ラムダ/関数値+クロージャを使用して同様の高レベル/「STGマシンに適合」)、GHCのSTG IRをもっとよく理解しようとしています。さまざまな年齢、奥行き、詳細を扱ったダース・ツー・オン・オンラインの記事/ビデオを繰り返し読んで(そして原著論文とStgSyn.hsを加えて)、多分最も基本的な原則を理解しながら、 -ddump-stg edの出力は、いろいろなところで私を困惑させます(私は手作業で解析するのではなく、GHC APIのメモリ内ASTを後で再利用します)---私は大体私の "大まかに知られている"そのIRの略称/コード化された識別子である。 STGの周りにあなたのやり方を少し分かっているなら、いくつかの未解決問題を明確にし、私(そして将来の調査者)をさらに堅固にするために、以下のミニサンプルを見てください。 a most simple .hs moduleから

、私は-O2both captured in this diffで(右に)最初(左側)-O0で、次いで、二回-ddump-stg編を持っています。

...デフ・バイ・デフのすべてを歩い

  • 行L_ | R5-11:そうO2、testX1testX2でグローバル定数であるように見える/整数4と5のためのリテラル - - O0はそれらを持っていません。興味深い!

  • Str=DmdType厳密さについて何か? 「厳密性はタイプオンデマンドのものなのか?しかし、トップレベル/ heap-ish/"グローバル"定数リテラルは "怠惰"にはなりません。(StgSyn.hsのCtrl + Fを軽く押すことはできません。独自の方法で奇数である!そこでは、STGの構文はStgSyn.hsではありません来るか)

  • Cafは一定のApplicative-フォームに関する大まかなアイデアを持っていますが、Unf=OtherConありませんか? 「その他のコンストラクタ」(ネイティブ/箱なしType.S#が - 関連?)..

  • ラインL6 | R14:まだそこにタイプクラスの情報を見て驚い(Num)は、その「単なる情報/注釈」であるか、これです実行時に組み込みのコードジェネレータがいくつかの "辞書"ルックアップ機構をセットアップするのに重要ですか? (すべてのGHCがタイプdefault-45からIntegerにタイプすることを決定した後、可能な場合にはすでにOG2で解決されインライン化されたSTG /一般的に言えば、私はSTGがプリミティブ型、飽和コンス、おそらくは文字列を表す以外の「型指定されていない」ことを理解していますので、そのような「typeclass」アノテーションのみが可能です。 ddump-ed * .stgの周りにあります。しかし、もしそうでなければ私を修正してください。

  • GblId「グローバル識別子」は、おそらく最上位のCAF権利ですか?アーティクリア。

  • ラインL7 | R18:のtestXは、O2のみであり、それに続いてフリーダイヤル<S(LLC(C(S))LLLL),U(1*C1(C1(U)),A,1*C1(C1(U)),A,A,A,C(U))><L,U>!それは何ですか、SKI計算法ですか? ; D真剣に、LLC .. LLLL ..CMMのスタックやその他のメモリレイアウトのヒント?何か案が?いくつかの最適化でなければなりません..これ-と-方法を理解したいと思います

  • ラインL8 | R20:$dNum_sGM(左)と$dNum_sIx(右)彼らは「定義されていないようだ、私は少し心配していモジュールレベルで "どこにでもあります。 Typeclassメソッドディスパッチ辞書ルックアップのようなもの?そうだろうか。 CMMはこれを上記のNum注釈とともに使用して設定します。常にinput func argと一緒に表示されます。

  • 左右の両方の関数 "body"は、本質的に、3つの原子のラムダ型を持つ "3 "と見なすことができます。そのうち2つは静的に既知の定数です。これが標準であり、STG IR ASTで期待されるとしますか?最初は、O0が "グローバルにインライン展開し(O2ではtestX1またはtestX2は何か)、O2はそうではない"と言うことができました(これらの定数リテラルに当てはまるように後者をはるかに短くします)。

  • これまでにOcc=Onceを見たことがありますが、他には何があり、どのように解釈するのですか? OnceはStgSyn.hsにも含まれていません。

  • 今すぐに対応するものはGblIdです。これは識別子の範囲を示していますか?この表現の文脈で、他の何かにもなりうるのでしょうか?次のように:ASTを通過すると私は深くわかっていますが、私がトップレベルにいる場合はGblIdでなければなりません。それ以外の場合はLclIdでしょうか? Hm ..多分STGが私に与えるものを取るほうがいいかもしれませんが、意味や可能性について確かめる必要があります。StgSyn.hsを使用する人、間違ったソースファイルがあります。そこのいずれかで、この上の何も...(そのコメントが非常によく行われているとして、常に希望に満ちた)

  • 残りは文字列定数としてメタデータだけで、OK ...ああ、待ってO2を見て、Str=DmdType m1Str=DmdType mがあります、何m/m1について、「モジュールレベルのどこにでも定義されています」と表示されていませんか?そしてそれはO0にはありません。

  • まだまだ強くなっていますか?単にボーナスの質問は(今のところ)約srt:SRT:[]教えてください;)

答えて

1

わずか数一口を - 完全な答えは非常に私の知識を超えています。 Num型クラスの辞書、および実引数:それは二つの引数を持つ関数にコンパイルされます

testX :: GHC.Num.Num a => a -> a 

あなたの関数の型があります。

$d…の名前は、クラス・インスタンス・タイプの辞書を表します。 <S(LLC(C(S))LLLL),…アノテーションは、関数の引数に関する厳密な情報です。彼らは基本的に議論のどの部分があなたの機能によって使われるのか、そうではないのかを言う。すべてのクラスインスタンスメンバーに関する情報が含まれているため、少し奇妙に見えます。

このうちのいくつかはここで説明されています

https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/Demand

str:STR:は、表現の自由変数のすなわちリスト「静的参照表」である - あなたのケースでは、常に[]

+0

多くのおかげでクリス!私は "すべての答え"を期待していないだろうが、実際に彼らに簡単に来るビットでチャイルドを期待しています。 dictsとSRT、特に厳密性に関する詳細へのリンクについて知っておくとよいでしょう。とても感謝しております! – metaleap

関連する問題