这是我们GHC活动报告的第二十二版,其中描述了我们正在Well-Typed进行的GHC、Cabal和相关项目的工作。当前版本大致涵盖2023年12月至2024年2月的几个月。您可以在ghc-activities-report标签

非常感谢我们的赞助商,他们使这项工作成为可能:安督瑞尔,哈苏拉Juspay公司此外,我们感谢水银为大型代码库上的开发人员工具改进性能的具体工作提供资金,并发送至主权科技基金供资在Cabal上工作

然而,我们需要更多的赞助支持团队!如果贵公司能够出资支持这项工作,请阅读有关如何提供帮助的信息联系

当然,Haskell工具是一项大型社区工作,Well-Typed的捐款只是其中的一小部分。本报告的目的不是提供详尽的图片全部的GHC工作正在进行中这里省略了目前正在开发的一些很棒的功能,原因很简单目前我们都没有参与其中。此外,我们提到的仍然是许多人的工作。在许多情况下,我们只是在帮助解决最后几个问题整合步骤。我们非常感谢为GHC做出贡献的每一个人!

团队

Well-Typed的GHC团队目前包括本·加马里,安德烈亚斯·克莱宾格,马修·皮克林,祖宾·达加尔,萨姆·德比郡罗德里戈·梅斯基塔,带有汉内斯·西本汉德尔1月加入团队芬利·麦克尔瓦恩转移到另一个客户端项目。此外,Well-Typed中的许多其他公司也在更偶尔地为GHC做出贡献。

发布

祖宾被释放通用条款9.6.41月份通用条款9.8.22月。我们现在正在努力争取在今年晚些时候发布GHC 9.10。结账这个GHC状态页对于有关发布计划的更多信息。

擦除分析

Matthew和Zubin最近实现了一种新的评测模式,即擦除评测可以深入了解什么时候分配特定对象。这对于诊断长时间运行的程序中的内存泄漏非常有用。

查看我们的介绍eras分析的博客帖子有关此新功能的更多信息,以及我们如何使用这种新的评测模式用于诊断GHCi中的内存泄漏。Matthew还使用eras分析来诊断太空泄漏在GHC的简化程序中(11914)。

eras分析和ghc调试特别适用于分析内存泄漏,所以Zubin一直在对ghc调试(MR 32型),包括改进它处理已分析可执行文件的方式(MR 35型,MR 36型)。

GHC内部构件的新家

GHC的基础图书馆长期以来有双重目的:一方面是面向用户的标准库界面,但同时它包含许多用于实现标准库的内部详细信息。这种双重目的给实现者和用户都带来了问题内部接口与预期的长稳定接口自由穿插用于一般消费。更糟糕的是基础经常提供对于哪些界面属于哪一类,用户几乎没有什么指导。

今年早些时候,核心图书馆委员会和GHC团队同意了改善这种情况的途径通过拆分基础三个库:基础,ghc内部,ghc实验。我们希望这种方法能够解决同时出现几个问题:

  • 基础为用户提供了一组清晰的稳定界面,由核心图书馆委员会监督。
  • ghc实验为新语言和库功能的开发人员提供专门用于迭代他们的设计,同时仍然允许使用用户愿意接受稍低程度的稳定性。
  • ghc内部为内部提供了一个家不打算由用户消费的实现细节,并且可能从一个版本到另一个版本发生变化。

Ben一直致力于通过分离定义来实现这种分离属于ghc内部包装(11400)。这种分裂导致了整个生态系统的许多改进,包括Haddock改进(参见Haddock问题1629,1630)到编译器错误文件(#24436)和实施清理(#24472)。

异常回溯

本一直在努力实现他期待已久的梦想例外回溯建议(8869)遵循广泛的与核心图书馆委员会的讨论预计这将成为GHC 9.10的一部分,并将是朝着异常诊断对用户来说更容易。

GHC指导委员会和GHC2024型

Adam现在担任GHC转向委员会,以下是约阿希姆·布雷特纳下台经过多年的专注服务在这个角色上。他的第一项主要任务是秘书一直在寻找新的志愿者加入委员会。如果你有兴趣,请阅读更多内容并联系

委员会更新了推荐的语言扩展集合引入GHC2024型GHC 9.10将随附GHC2024型可用(12084),但尚不清楚何时将成为默认值(请参阅ghc提案先生632)。

STM正确性和性能

Andreas一直在使用STM诊断进度和性能问题用户报告STM饥饿问题(#24142). 特别地:

  • STM事务性能随着TVar公司涉及的(#24410),因为当前实现使用链接列表来跟踪所有的TVar公司事务使用的。Ben探索了一种改进方法这种情况下,使用哈希映射进行这些查找(12030)。

  • 具有大量TVar公司s可能表现不佳(#24427)由于每次Haskell线程返回到调度程序。此检查可识别潜在的非终止STM事务通过对照内存验证STM内存的事务视图当前状态。虽然这项检查非常有用,但执行起来有些费钱,并且在当前的实施中,当多个验证并行进行。最好的解决方案可能是因为这个问题是要减少执行验证的频率,特别是在长时间正在运行事务。

  • 在病理情况下,两个并行运行的事务可能无法进度(#24446),即使所有事务都是只读的。这应该是通过返工可以解决TVar公司s在验证过程中被锁定。

不幸的是,解决这些问题需要进一步的工作。

专业化和后期插件

芬利一直在探索技术,以使诊断问题更容易大型应用程序的专业化,例如由于超载呼叫未被专门处理。解决此类问题的一个解决方法是暴露所有展开并使用攻击性专业化,但这往往会反而会导致编译时性能不佳。

出于这些调查的动机,他添加了“后期插件”,这些插件是在添加后期成本中心后,核心管道结束(11765). 这允许插件,用于分析和修改编译为STG的Core,无需更改在接口文件中结束。

卡瓦尔

马修、罗德里戈和萨姆一直致力于解决长期存在的建筑问题和中的维护问题卡瓦尔图书馆和电缆安装建造工具。这项工作得到了主权科技基金如我们的上一篇博客文章

一些变化包括:

  • 设计和实施新的建筑类型:挂钩功能以提供反对的途径build-type:自定义根据社区反馈,Sam反复强调了设计,特别关注预构建规则,设计灵感来源于Cloud Haskell公司,使用静态指针。请参阅详细HF技术建议书以深入解释该设计及其优点。这个目前正在准备审查实施情况(公关9551)。

  • 将隐式全局状态从卡瓦尔库,允许它以工作目录作为参数,而不是使用工作当前进程的目录(公关9718)。这是为了允许直接调用卡瓦尔要构建的库并发设置中的包。

  • 为私有依赖项进行设计和原型实现(发行号4035),允许包来表示它们不公开来自API中的依赖项。这为构建构建提供了更大的灵活性计划,可能使库版本升级更容易,并允许测试和基准来比较同一库的不同版本。

  • 使测试套件更加健壮,包括对其进行重构以在单独的临时目录,使其不受外部用户系统的配置(9717年4月)。

  • 允许使用Haskell Program Coverage(HPC)信息进行每个组件的构建(公关9464)。

  • 重构以消除长期存在的代码重复构建组件逻辑中的错误源(公关9602)和全球支持(公关9673)。

  • 使用install命令修复几个长期存在的错误,通常忽略CLI标志(公关9697)。

  • 稳健地处理从源代码编译的相同GHC版本多次(公关9618),因为GHC版本号不足以确保ABI兼容性。

  • 更多错误修复和重构,以提高可维护性和代码库的健壮性(例如公关9524 公关9554)。

GHC错误修复

  • Ben使用ThreadSanitizer调查了内存排序问题并修复了许多数据竞赛(9372,11795,11768)。

  • Ben解决了GHC使用C导致的线程安全问题斯特雷罗公用事业(#24344)。

  • Sam修复了涉及记录字段的隐藏错误消息中的9.8回归没有字段选择器(11981)。

  • Hannes修正了Haddock如何解析限定引用的9.8回归(11920)。

  • Zubin修复了GHC报告错误消息不佳的回归存在包括hs-boot文件的模块周期(11718,11792)。

  • Zubin使用不正确的成本中心修复了跨模块模块断点(11892)。

  • Sam和Andreas修复了fused-multiply-add处理中的各种错误GHC 9.8.1中添加的首字母(11587,11893,11902,11987)。

  • Ben修复了在32位上实现唯一生成时的一个微妙错误平台(11802)。

  • Andreas修复了引入的C外部函数接口中的一个错误通过使用子单词大小的参数(11989)。

  • 祖宾集合-数字编程使用评测编译C++源代码时(11871)。

  • Matthew修复了处理来源信息表条目时出现的一个离群错误(11873)。

  • 祖宾修复了一个生成ghcup-metadata的错误(11791)。

  • 祖宾更新了用户指南,以考虑到无限制超载标签GHC提案,降落在GHC 9.6(11774)。

  • Hannes修复了在包含以下内容的文件路径中安装GHC时产生的错误Windows上的空间(11938)。

构建系统、CI和分销改进

  • Ben为GHC 9.10进行了许多子模块碰撞准备释放。

  • Rodrigo允许配置脚本使用自动配置文件2.72 (11942)。

  • Matthew修复了配置中的一个错误hsc2小时建造GHC时,这是链接器错误的来源(#24050,11384)。

  • Matthew更新了CI图像,特别关注改进在CI上测试LLVM后端(#24369,11976)。

  • Matthew确保文档建立在CI中的更多配置之上(例如阿尔卑斯山、岩石、Windows、达尔文)(12134)。

  • Ben将GHC改编为LLVM的新通行证管理器CLI(8999)。