C++ C/C++&引用;“失去”;如果他们定义了标准ABI?

C++ C/C++&引用;“失去”;如果他们定义了标准ABI?,c++,c,standards,abi,C++,C,Standards,Abi,标题说明了一切。我具体讲的是C/C++,因为两者都认为这是“实现问题”。我认为,定义一个标准接口可以简化在其上构建模块系统的过程,还有许多其他好处。 如果C/C++定义了一个标准ABI,那么它会“失去”什么呢?在每个处理器上以最自然的方式实现事物的自由 我认为c语言比任何其他语言在更多不同的体系结构上都有一致的实现。遵守针对当前常见、高端、通用CPU优化的ABI将需要对一些更奇怪的机器进行非自然的扭曲。除了选择了ABI的平台外,每个平台上的向后兼容性都会受到影响。大多数平台上的执行速度都会急剧下

标题说明了一切。我具体讲的是C/C++,因为两者都认为这是“实现问题”。我认为,定义一个标准接口可以简化在其上构建模块系统的过程,还有许多其他好处。

如果C/C++定义了一个标准ABI,那么它会“失去”什么呢?

在每个处理器上以最自然的方式实现事物的自由


我认为c语言比任何其他语言在更多不同的体系结构上都有一致的实现。遵守针对当前常见、高端、通用CPU优化的ABI将需要对一些更奇怪的机器进行非自然的扭曲。

除了选择了ABI的平台外,每个平台上的向后兼容性都会受到影响。

大多数平台上的执行速度都会急剧下降。因此,在许多嵌入式平台上使用C语言可能不再合理。标准机构可能会对与ABI不兼容的各种芯片制造商提起的反垄断诉讼负责。

好吧,不会有一个标准ABI,但大约有1000个。操作系统和处理器架构的每一种组合都需要一个

最初,不会有任何损失。但最终,有人会发现一些可怕的错误,他们要么修复它,打破ABI,要么离开它,造成问题


我认为现在的情况很好。任何操作系统都可以自由地为自己定义ABI(他们确实这样做了),这是有道理的。操作系统的工作应该是定义其ABI,而不是C/C++标准。

而不是针对所有平台的通用ABI(这将是灾难性的,因为它只适用于一个平台)。标准委员会可以说,每个平台将符合特定的ABI

但是:谁定义了它(第一个通过门的编译器?)。在这种情况下,他们获得了过度的竞争优势。或者在编撰了5年之后成立一个委员会(这将是另一个可怕的想法)

此外,它也没有给编译器提供进一步研究新优化策略的余地,您将被困在定义标准时可用的技巧中。

C(或C++)语言规范定义了源语言。他们不关心运行它的处理器(一个C程序甚至可以由一个人类奴隶来解释,但这是不道德的,也不划算)

根据定义,ABI与目标系统有关。它与处理器和系统(以及ABI之后的现有库)相关

在过去,确实有一些处理器拥有专有(即未公开)规范(即使它们的机器指令集不是公共的),并且它们有一个非公共的ABI,后面跟着一个编译器(或多或少遵守语言标准)

定义编程语言不需要与定义ABI相同的技能


<>你甚至可以为现有的处理器定义一个更新的ABI,但是这需要大量的工作(修补编译器,重新编译每一个东西,包括C&C++标准库和你需要的所有实用程序和库),所以通常是无用的。

< P> C总是有一个标准的ABI,甚至是任何标准ABI中使用的标准ABI。(我的意思是,当不同的语言或系统必须相互绑定时,C ABI是首选的ABI)C abi是其他ABIS的常见ABI,C++虽然扩展,因此基于C,但实际上,C++的标准ABI更具挑战性,并且可能会给C++编译器自身的目标机器代码的实现带来问题。然而,它实际上有一个标准的ABI;参见./P> 因此,问题可能不是“他们能松开什么?”,而是“他们松开了什么?”(如果他们真的松开了什么)


旁注:需要记住,ABI始终依赖于体系结构和操作系统。因此,如果“标准ABI”是指“跨体系结构和平台的标准”基本上,每个人都忽略了C++ 14的一个建议实际上定义了一个标准的ABI。它是一个标准的ABI,专门用于使用C++子集的库。它需要符合子集

<>这不仅是草本口吃,C++专家和作者的“例外C++”系列丛书。 该提案深入探讨了便携式ABI难以实现的诸多原因,以及新颖的解决方案

注意,他将“目标平台”定义为CPU体系结构(x64、x86、ARM等)、操作系统和比特率(32/64)的组合

这样,这里的目标是,实际上,C++代码(VisualStudio)能够在同一平台上与其他C++代码(GCC,旧的Visual Studio等)进行对话。这不是通用的ABI的目标,它允许手机库在Windows机器上运行。 这个建议在C++14中没有得到批准,但是,它进入了C++17的“进化”阶段,以便进一步讨论/迭代


因此,到2017年1月,我仍然祈祷好运。

非常同意。在许多平台上,您希望在寄存器中传递参数以提高速度,但您不希望使用所有寄存器来传递参数。但是不同的平台有不同数量的寄存器。有些平台根本没有浮点寄存器。任何完全不同的通用ABI在几乎所有平台上都是次优的。C如此流行的原因之一是因为它没有指定标准ABI(IIRC,Pascal指定了)。因此,编译器编写人员可以做任何最有效的事情。最初,每个人在堆栈框架方面做的事情几乎都是一样的,但后来,对于DSP这样的体系结构,他们