核心是GHC的中间语言.阅读核心可以帮助您更好地了解您的计划的性能.有人问我关于阅读Core的文档或教程,但我找不到多少.
有哪些文档可供阅读GHC Core?
这是我到目前为止所发现的:
所以有时我需要编写一个我在Hackage上找不到的数据结构,或者我发现没有经过测试或质量不足以让我信任,或者只是我不想成为依赖项.我现在正在阅读冈崎的书,它很擅长解释如何设计渐近快速的数据结构.
但是,我正在专门研究GHC.常数因素对我的应用来说是一个大问题.内存使用对我来说也是一个大问题.所以我对GHC有特别的疑问.
特别是
我浏览了网络上的各个地方,我对如何使用GHC 有一个模糊的想法,例如,查看核心输出,使用UNPACK编译指示等.但我不确定我明白了.
所以我弹出了我最喜欢的数据结构库,容器,并查看了Data.Sequence模块.我不能说我理解他们正在做的很多事情,以使Seq快速.
引起我注意的第一件事就是定义FingerTree a.我认为这只是我对手指树不熟悉.引起我注意的第二件事是所有的SPECIALIZEpragma.我不知道这里发生了什么,我很好奇,因为这些都遍布整个代码.
许多函数也有一个INLINE与它们相关的编译指示.我可以猜到这意味着什么,但是如何判断何时INLINE起作用呢?
事情变得非常有趣~~475线,一个被称为"应用建筑"的部分.它们定义了一个newtype包装器来表示Identity monad,它们编写自己的严格状态monad副本,并且它们有一个被定义的函数applicativeTree,它显然专用于Identity monad,这增加了函数输出的共享.我不知道这里发生了什么.什么巫术被用来增加分享?
无论如何,我不确定从Data.Sequence中学到很多东西.是否有其他"模范程序"我可以阅读以获得智慧?我真的很想知道当我真正需要它们更快时,如何更新我的数据结构.有一件事特别是编写使融合变得容易的数据结构,以及如何编写良好的融合规则.
我在哪里可以得到一些论文/ doc /描述Haskell编译器实际工作方式的内容?我阅读了很多GHC的文档,但在头痛之后就停止了.因此,不需要博士学位来理解它并且不是用你应该已经熟悉的那种方式写的东西会更好.如果它真的很长并且需要一些时间来理解它,这不是问题.
PS:最有趣的是关于GHC,但一切都很好.
我找到了许多论文,讨论使用有符号数字流实现精确算术的实现.使用无限流来获得任意精度可以在函数式语言(如Haskell)中使用惰性列表实现良好的实际实现.然而,在功能语言中讨论这种实现的论文似乎得出的结论是性能非常差.
现在,我理解与标准浮点表示相比,精确的非硬件实现通常具有相对较差的性能,但我有兴趣在命令式语言(特别是C++)和操作集合中提供更高效的实现./functions(算术运算,三角函数,exp,log等).
我的问题:是否存在导致性能不佳的签名数字/惰性流表示的内在缓慢,或者是Haskell?是什么让它变慢?是否有可能使用C++中的延迟流实现带符号的数字流表示,实现(显着)比其Haskell对应物更好的性能,或者这是徒劳的练习?也许重建为迭代?
我知道有两个C++库,RealLib和iRRAM,可以实现高效的实数计算.然而,这些似乎使用区间运算,将实数表示为缩小的嵌套区间,这似乎不像无限流那样"纯粹"(如果您不同意,请纠正我!).但也许这些是实现良好效率的唯一方法?
任何输入都表示赞赏!