(誤解を招くタイトル:が全体以外のリファレンスマニュアルではありませんが、このトピックのための完全なリファレンスマニュアルを尋ねるが、心に留めておくようにこれらの音:それは唯一の以下、相互に関連似た質問の茄多のをです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から
、私は-O2
、both captured in this diffで(右に)最初(左側)-O0
で、次いで、二回-ddump-stg
編を持っています。
...デフ・バイ・デフのすべてを歩い
行L_ | R5-11:そうO2、
testX1
とtestX2
でグローバル定数であるように見える/整数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-4
と5
から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 m1
とStr=DmdType m
があります、何m
/m1
について、「モジュールレベルのどこにでも定義されています」と表示されていませんか?そしてそれはO0にはありません。まだまだ強くなっていますか?単にボーナスの質問は(今のところ)約
srt:SRT:[]
教えてください;)
多くのおかげでクリス!私は "すべての答え"を期待していないだろうが、実際に彼らに簡単に来るビットでチャイルドを期待しています。 dictsとSRT、特に厳密性に関する詳細へのリンクについて知っておくとよいでしょう。とても感謝しております! – metaleap