0

总是有一些关于 C++ 模块的讨论。但是昨天(就在昨天让我感到羞耻)我遇到了这个带有 c++ 模块提案链接的线程。

就像“男孩哦男孩!终于会有一些关于实现或设计以及一些有趣的想法......”

在那一刻,我必须请求原谅我进一步的愤怒......

我已经读了两遍了。

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

• 显着缩短大型项目的构建时间(Olalal 我虽然在那里!那将是真棒......)

• 更好地分离接口和实现

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

• 屏蔽宏观干扰

• 屏蔽私人成员

• 改进的初始化顺序保证

• 避免未诊断的 ODR 问题

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

还有一些人提到了algon的文字。

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

嗯...老实说,我并不真正关心他的导入/导出技巧如何(混淆与否都没关系),不关心可见性,隐藏等我不关心某些事情,例如在 java 和其他一些中确实存在的静态 init 块。

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

• 显着缩短大型项目的构建时间

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

我按我说的读了两遍。

并且热实现模块以实现加速绝对没有任何用处。我只是“什么?你在开玩笑吗?”

QUOTE:模块通过用预编译的模块附件机制(其处理时间可以与导入声明的数量成正比)替换文本包含机制(其处理时间与包含的代码量成正比)来解决此问题。可以保留私有模块定义发生变化时不需要重新编译客户端翻译单元的属性。

我们知道目标。但是除了“它应该”之外还有什么东西呢?

我不知道 mb 提案的目标只是说“他你对这个想法有什么看法?” 但我虽然会有一些像 RFC 这样的想法。看来我错了。

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

不用说,要实现模块,这些模块应该有某种数据格式,一些元数据。好的。可以是纯文本不是吗?它服务于目标,但ofc NO!这样就会有另一个 import->import->ipmport 纯文本链,应该在编译时进行解析。所以似乎应该有二进制数据:) 好的。它应该只是特定于语言和跨平台还是特定于平台?

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

它到底是如何被创造出来的?主要思想:)

那么所有这些库的实现呢?.dll、.a、.so?例如,现在我们有源+标头(+标头+标头+标头)-> obj-> 二进制。c++ 模块在该链中的位置在哪里?它应该是什么样子?来源-> obj+模块-> 二进制?或来源->模块+模块->objs->二进制?

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

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

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

4

1 回答 1

2

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

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

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

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

于 2012-10-11T19:45:30.443 回答