使用MESON对C、C++和其他语言进行货运式依赖管理

2020-10-21 14:02:33

我上一篇关于现代C++的博客文章获得了惊人数量的反馈。有些人甚至用其他语言重新实现了这个程序,包括Go中的一个,Rust中的两个不同的,甚至这个稍微有点费解的C++重新实现是一个声明式流水线。这件事也在Reddit和Hacker新闻上被谈论过。不断弹出的两条主要评论如下。

让我们同时解决这两个问题吧。有很多支持Unicode的文本处理解决方案,但我们将使用10,000公斤的锤子:Unicode的国际组件。实际的代码更改不是那么大,感兴趣的人可以在这个Github回购中查找详细信息。与这篇博客相关的是构建和依赖管理。介子构建定义相当简短:线程依赖是针对多线程部分的(参见本文末尾)。我是在Linux上开发的,并使用了ICU提供的便捷系统。Windows和Mac不提供系统库,因此我们需要在这些平台上从头开始构建ICU。这是通过在项目的源根目录中运行以下命令来实现的:

这将联系Meson的WrapDB服务器并下载ICU的构建定义文件。这就是你需要做的全部事情。构建文件不需要任何更改。当您开始构建项目时,Meson将自动下载并构建依赖项。以下是下载步骤的屏幕截图:

这种方法的一个值得注意的缺点是,WrapDB还没有那么多包。然而,有人告诉我,考虑到下一个Meson版本(几周后)和一些上游补丁,可以将整个GTK小部件工具包作为一个子项目构建,即使是在Windows上也是如此。

如果有人想为这个项目做贡献,我们非常欢迎。例如,您可以转换现有项目并将其提交到wrapdb或成为审查者。介子网站有相关文档。

多位人士指出,虽然原来的程序运行得很好,但只用了一个线程。这可能是一个瓶颈,而且在C++中很难并行执行工作。这也是在过去的几年里变得更好的事情之一。正确的解决方案应该是使用Transform_Reduce的并行版本。不幸的是,大多数并行STL实现仍在实现过程中,所以我们不能在多平台代码中使用这些实现。然而,我们可以相当容易地滚动我们自己的互斥体,而不需要手动创建或锁定单个互斥体。代码包含实际细节,但其要点(略有编辑)如下:

这里,COUNT_WORD_FILES函数计算单个文件中的字数,POP_FOREND函数将各个结果连接到最终结果。通过使用无共享体系结构、纯函数和值类型,所有业务逻辑代码都可以像单线程一样编写,线程和互斥管理的细节可以留给库代码。哈斯克尔的粉丝们会感到自豪(或者可能感到恐惧,不是很确定)。