总是有一些关于 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!希望我不会被禁止 :(