在N2073提案的情况下以及作为一个整体的c++模块设计

c++ modules design in case of proposal N2073 and as a whole

本文关键字:一个 c++ 模块 N2073 情况下      更新时间:2023-10-16

关于c++中的模块总是有一些讨论。但昨天(我很遗憾,就在昨天),我遇到了这个链接到c++模块提案的线程。

这就像是"天哪,天哪!终于会有一些关于实现或设计的东西,以及一些有趣的想法……">

在那一刻,我必须请求原谅我的愤怒。。。

我已经读了两遍了。

正如作者所说,有以下好处:

•显著提高大型项目的构建时间(尽管有Olalal i!那将是很棒的…)

•实现接口和实施之间更好的分离

•为现有图书馆提供可行的过渡路径

•屏蔽宏干扰

•屏蔽私人成员

•改进的初始化顺序保证

•避免未诊断的ODR问题

•全局优化属性(异常、副作用、别名泄漏等)

还有一些人在文本中提到了algon。

(再次为愤怒的语气道歉)

嗯。。。老实说,我真的不在乎他在进出口方面的技巧是什么样子的(困惑与否无关紧要),不在乎可见性、隐藏、e.t.c我不关心一些东西,比如java中确实存在的静态init块和其他一些东西。

但主要目标,模块的核心应该是编译速度,这里提到:

•显著提高大型项目的构建时间

所有那些没有提高编译速度的动作都是无用的。这是胡说八道。

我已经照我说的读了两遍了。

而且hot实现模块以实现加速绝对没有任何用处。我只是"什么?你在开玩笑吗?">

引用:模块通过替换文本包含机制(其处理时间与包含的代码量成比例)连接机构(其处理时间可以与进口报关单)。客户端翻译单元不需要重新编译的属性当私有模块定义改变时可以保留。

我们知道目标。但是除了"它应该"之外,什么东西在哪里呢

我不知道mb的提议目标只是说"他你觉得这个主意怎么样?"但我认为会有像RFC这样的东西。看来我错了。

所以在这种情况下,我只想问社区一些非常基本的问题,因为我不想真正理解如何在不从头开始重写的情况下实现模块语言的大部分和所有编译以及我们今天的联系机制。真的我不明白:(如此巨大的努力值得吗?这将是完全不同的语言。。。为什么说"进化的c++"?

不用说,要实现模块,应该有某种数据格式——这些模块是编写的,一些元数据。好啊它可以是纯文本,不是吗?进球了,但是没有!这样就会有另一个导入->导入->ipmport应在编译时解析的纯文本链。看来应该有二进制数据:)好的。它应该只是特定于语言和跨平台的,还是特定于平台的?

那么代码中所有的#ifdef块呢?如果会有某种预编译的二进制数据,它将是或依赖于平台的(并且包括世界上所有的ifdef分支),或者它将是我们每次都应该重新编译的奇怪模块。看来这不可能是真的。那方面呢?或者说c++中的模块我们根本不谈论平台无关的元数据,我们只是在谈论某种预编译的数据,这些数据只有在同一项目的重新编译阶段才能使用?没有类似java的机器可以在运行时排除某些分支,不是吗?

它究竟是如何被创造出来的?主要想法:)

那些图书馆里的暗示呢。dll、.a、.so?例如,现在我们有sources+headers(+headers+headers+headers)->obj->binary。c++模块在这个链中的位置在哪里?它应该是什么样子?源->obj+模块->二进制?还是源->模块+模块->对象->二进制?

似乎以任何方式实现模块都会影响我们今天使用的所有编译过程。

总之,我只是对基本概念感兴趣,但比"哦,这应该会减少编译时间"更有建设性——这并不严重!希望有人能分享一些关于如何实现它的知识或概念(或指出正确的方法)。

提前Tnx!希望我不会被禁止离开:(

首先,请注意N2073相当旧!据我所知,最新的模块提案是N3347。当然,这也只是关于语言层面的结构。关于这个主题(或任何其他主题)的所有其他论文也是如此:语言标准根本没有规定语言是如何实现的。C++标准规定的是语言的语义。如何实现这一点取决于编译器作者,在某种程度上也取决于定义软件开发平台的人:对于给定的平台,可能会有不同编译器如何互操作的规范。如果模块被包含在语言标准中,这就是定义文件格式等内容的地方。

也就是说,请注意,指定如何在语言级别上表示模块的语义,为编译器提供了创建高效表示的必要杠杆(当然,假设它做得正确)。目前,任何奇怪的#define都可能绕过大量声明,使给定标头中的声明看起来完全不可预测。当然,任何理智的库都会对用户的行为施加限制,但所有这些限制都在语言规范之外。一旦有了稳定的定义,编译器就可以基于之前以某种方式创建的模块的适当表示来加载其内部数据结构。编译器供应商在如何制作特定的编译器过程模块方面也不需要任何指导:他们比任何人都更了解自己的内部数据结构。。。任何固定的配方无论如何都不会对一些编译器供应商起作用。

只需注意模块内容的表示方式:模块中声明的表示方式是文本还是二进制并不重要:在这两种情况下,表示的数据都是相同的,并且很容易包括名称解析,避免任何解析怪癖。

模块是该标准未来修订议程上的主题之一。我没有看到太多关于模块状态的信息,但这是许多编译器供应商感兴趣的话题。当然,他们都对需要什么以及应该是什么样子有不同的想法,但他们同意合作。