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

Ara*_*raK 27 c c++ standards abi

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

dmc*_*kee 38

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

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

  • 我记得一个架构有一个32寄存器文件可供程序员看到,但是在硬件中实现它是一个带有滑动窗口的512寄存器块.r0-r7是传递给被调用函数的参数,r8-r15是函数本地,r16-r23是从函数调用者传入的参数,r24-r31是全局变量,包括堆栈指针.r24-31总是指向同一个地方,但其他地方通过一个窗口映射,该窗口将通过函数调用向下滑动16个寄存器(将调用者的r0-7映射到被调用者的r16-r23),然后返回时返回16 . (9认同)
  • 非常同意.在许多平台上,您希望在寄存器中传递参数以获得速度,但您不希望将所有寄存器用于参数传递.但是不同的平台具有不同数量的寄存器.有些平台根本没有浮点寄存器.任何完全一般的ABI几乎在每个平台上都不是最理想的. (6认同)
  • C变得如此受欢迎的原因之一是因为它没有指定标准ABI(IIRC,Pascal确实如此).因此,编译器编写者可以做任何最好的工作.最初,每个人在堆栈框架方面都做了同样的事情,但后来,对于像DSP这样的架构,他们开始指定将函数参数打包到寄存器中的方法,大大减少了函数调用所需的指令和内存事务的数量. (4认同)
  • @Mike:这听起来很像 SPARC,但不同代在溢出到 RAM 之前有不同数量的硬件寄存器。 (2认同)

Ste*_*non 10

除了选择了ABI的平台之外,在每个平台上都向后兼容.

  • @Stephen:GCC在之前的版本中做了3次.2.9x - > 3.0(休息:新ABI)3.0 - > 3.1(破解Bug修复)3.1 - > 3.2(打破别的东西) (5认同)
  • 然后就没有人会遵守这个标准了。 (2认同)
  • 使用GCC的C++中可能存在问题,但我不记得C有任何问题. (2认同)

Mar*_*ork 7

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

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

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


Bas*_*tch 7

C(或C++)语言规范定义了源语言.他们并不关心运行它的处理器(AC程序甚至可以被人类奴隶解释,但那将是不道德的并且不具有成本效益).

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

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

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

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


Jus*_*ith 6

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

  • 奔向你的生活,他们有律师! (4认同)

Kat*_*age 5

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

不仅如此,它还由C ++专家THE Herb Stutter撰写,并着有“ 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等),OS和位(32/64)的组合。

因此,这里的目标实际上是使C ++代码(Visual Studio)能够与同一平台上的其他C ++代码(GCC,旧版Visual Studio等)对话。通用ABI的目标不是让手机库在Windows计算机上运行。

该提议未在C ++ 14中批准,但是已进入C ++ 17的“演进”阶段,以供进一步讨论/迭代。

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=zh-CN

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