如果他们定义了标准的ABI,C / C ++会“丢失”什么?

时间:2010-01-17 23:21:12

标签: c++ c standards abi

标题说明了一切。我特别谈论C / C ++,因为他们都认为这是“实施问题”。我认为,定义一个标准界面可以轻松构建一个模块系统,以及许多其他好东西 如果他们定义了标准的ABI,C / C ++会“丢失”什么?

8 个答案:

答案 0 :(得分:38)

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

我认为c特别是在与其他语言不同的架构上实现了一致的实现。遵循针对当前常见的高端通用CPU优化的ABI,在某些奇怪的机器上需要不自然的扭曲。

答案 1 :(得分:10)

除了选择了ABI的平台之外,每个平台都具有向后兼容性。

答案 2 :(得分:7)

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

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

此外,它不会让编译器进一步研究新的优化策略,您将会遇到标准定义时可用的技巧。

答案 3 :(得分:7)

C(或C ++)语言规范定义了源语言。他们并不关心运行它的处理器(一个C程序甚至可以由人类奴隶来解释,但那是不道德的,而且不符合成本效益。)

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

过去,确实发生过某些处理器具有专有(即未公开)规范(甚至其机器指令集不公开),并且它们具有非公开ABI,其后是编译器(或多或少地尊重)语言标准)。

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

您甚至可以为现有处理器定义更新的ABI,但这需要大量工作(修补编译器,重新编译所有内容,包括C& C ++标准库以及您需要的所有实用程序和库)所以通常没用。

答案 4 :(得分:5)

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

答案 5 :(得分:5)

基本上,每个人都错过了其中一个C ++ 14提案实际上是DID定义标准ABI。它是一个标准的ABI,专门用于使用C ++子集的库。您可以定义“ABI”代码的特定部分(如命名空间),并且需要符合该子集。

不仅如此,它还是由The Herb Stutter,C ++专家和“Exceptional C ++”系列丛书撰写。

该提案涉及便携式ABI难以解决的许多原因,以及新颖的解决方案。

https://isocpp.org/blog/2014/05/n4028

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf

请注意,他将“目标平台”定义为CPU架构(x64,x86,ARM等),操作系统和位数(32/64)的组合。

所以这里的目标实际上是让C ++代码(Visual Studio)能够在同一平台上与其他C ++代码(GCC,旧版Visual Studio等)交谈。这不是通用ABI的目标,它允许手机库在Windows机器上运行。

此提案尚未在C ++ 14中批准,然而,它已进入C ++ 17的“Evolution”阶段进行进一步讨论/迭代。

https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/c_14_is_ratified_the_view_from_the_june_2014_c_standard_meeting?lang=en

截至2017年1月,我的手指仍然交叉。

答案 6 :(得分:4)

嗯,没有一个标准的ABI,但是大约有1000个。对于操作系统和处理器架构的每种组合,你都需要一个。

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

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

答案 7 :(得分:2)

C总是有一个标准的ABI,甚至是用于任何大多数标准ABI的ABI(我的意思是,当不同的语言或系统必须彼此绑定时,C ABI是首选的ABI)。 C ABI是其他ABI的常见ABI。 C ++虽然扩展并且因此基于C更复杂,但事实上,C ++的标准ABI更具挑战性,并且可能给C ++编译器自身实现目标机器代码带来了自由问题。然而,它似乎实际上有一个标准的ABI;见Itanium C++ ABI

所以问题可能不是那么多“他们可以放松什么?”,而是“他们放松了什么?”(如果他们真的失去了什么)。

附注:需要牢记ABI始终是体系结构和操作系统相关的。因此,如果“标准ABI”的含义是“跨架构和平台的标准”,那么可能永远不会有或者是这样的东西,而是通信协议。