(误导性标题:它只是一个下面的大量相互关联的类似问题:这听起来像是要求提供完整的参考手册,但请记住这个主题<除了整个GHC的STG管道阶段的源代码,以及其他人/&#34;内部人员的集体积累经验&#34; ..)之外,没有参考手册 p>
我正在探索&#34; transiling&#34; Haskell(从头开始用于娱乐/学习,忽略现有项目;目标语言/ s类似高级/&#34;已经适合STG机器&#34;使用现有GC + lambdas / func-values +闭包)所以我试图变得更加熟悉GHC的STG IR。反复浏览过十二个或两个不同年龄,深度,细节的在线文章/视频,实际上涉及该主题(加上原始论文,加上StgSyn.hs),并了解许多 - 也许 - 最基本的原则,看到-ddump-stg
输出仍然在各个部分让我困惑(我不会手动解析它,但当然会在以后重用GHC API的内存AST) - 大多数情况下我认为我&#39;我坚持映射我的&#34;大致已知&#34;概念到了#34;仍然是外国的&#34;该IR的缩写/编码标识符。如果您对STG有所了解,请注意以下小样本,以澄清一些未解决的问题,并帮助进一步巩固我(以及未来的搜索者)的掌握程度?
从a most simple .hs module开始,我-ddump-stg
两次,第一次(左侧)使用-O0
,然后(右侧)使用-O2
,{{3} }。
走过一切def-by-def ..
行L_ | R5-11:所以在O2中,testX1
和testX2
似乎是整数4和5的全局常量/文字--- O0不是拥有他们。好奇!
Str=DmdType
是关于严格的吗? &#34;严格属于按需类型&#34;还是一些这样的?但后来是顶级/堆积/全球性的#34;常数字面不能是&#34;懒惰&#34;它可以......(其中一件事我可以在StgSyn.hs中随意地按Ctrl + F ---它不在那里!这本身就很奇怪,怎么会到那里&#39 ; s STG语法不在StgSyn.hs中)
Caf
对常量应用形式有一个粗略的想法,但是Unf=OtherCon
? &#34;其他构造函数&#34; (未装箱/本地Type.S#
- 相关?)..
第L6行:R14:对于那里(Num
)仍然看到类型类信息感到惊讶,是&#34;只是信息/注释&#34;或者这对于任何内置代码生成关键词来设置一些&#34;字典&#34;在运行时查找机器? (我肯定希望通过已经解决的STG /预CMM阶段,并且至少在O2中已经尽可能地内联。毕竟GHC还决定键入默认4
和{{1到5
)。一般来说,我理解STG是&#34;无类型&#34;除了表示prim类型,饱和缺点,也许是字符串(后面看起来像是在底部),所以这样的&#34;类型类型&#34;注释只能是...我想让读者找到他们的方式围绕ddump-ed * .stg。但如果不是,请纠正我。
Integer
可能只是&#34;全局标识符&#34;又名顶级CAF吧? Arity clear。
第L7行| R18:现在GblId
的{{1}}仅在O2中,然后是奇怪的Str=DmdType
!那是什么,SKI微积分? ; D不认真,LLC .. LLLL ..堆栈或其他内存布局提示CMM?任何的想法?必须进行一些优化,想了解哪个......以及
第L8行| R20:testX
(左)和<S(LLC(C(S))LLLL),U(1*C1(C1(U)),A,1*C1(C1(U)),A,A,A,C(U))><L,U>
(右)让我有点担心,他们似乎并未定义在&#34;模块级别&#34;到处都是。类型类&#34;方法调度字典查找&#34;之类的事情?例如。 CMM将上述$dNum_sGM
注释与此相结合以进行设置?它始终与$dNum_sIx
func arg。
整个功能&#34;身体&#34;对于左右两者,这里基本上可以看作&#34; 3 Num
s具有3个原子的lambda-ish形式,其中2个是静态已知的文字常数&#34; ---我想这是STG IR AST的标准和预期?对于第一个,有趣的是,我们可以说O0已经&#34;内联全局(O2中的testX1或testX2)和O2没有&#34;#34; (使后者更短,因为这适用于这两个常数文字)。
我才见过input
,其他人是什么以及如何解读? let
即使在StgSyn.hs中也是如此。
现在Occ=Once
与之前遇到的Once
相对应。这表示标识符的范围?在这个表达式上下文中,它还可以是其他任何东西吗?如:如果遍历AST我大致知道我有多深,我可以忽略这一点,因为如果我在顶级,它必须是LclId
,否则GblId
?嗯..也许更好地采取STG给我的东西,但后来我需要确定语义和可能性..伙计们,使用StgSyn.hs我有错误的源文件,对吧?在那里也没有任何东西......(总是充满希望,因为它的评论做得很好)
其余的只是元数据作为字符串常量,好的..哦等等,看看O2,那里有GblId
和LclId
,Str=DmdType m1
是什么1}} / Str=DmdType m
关于,我在模块级别的任何地方都没有看到&#34;定义的另一件事&#34;这里?并且它不在O0 ..
还是强势吗?仅仅是一个奖金问题(暂时),请告诉我们m
;)
答案 0 :(得分:1)
只是几个花絮 - 一个完整的答案是我所不知道的。
您的功能类型是
testX :: GHC.Num.Num a => a -> a
它被编译为具有两个参数的函数:Num
类型类的字典和实际参数。
$d…
名称代表类型类实例的字典。 <S(LLC(C(S))LLLL),…
注释是关于函数参数的严格信息。他们基本上说你的功能将使用哪个部分参数,哪个不会。这里看起来有点奇怪,因为它包含有关所有类实例成员的信息。
其中一些解释如下:
https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/Demand
str:STR:
是“静态参考表”,即表达式的自由变量列表 - 在您的情况下,始终为[]
。