首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打破ABI调用惯例的后果是什么?

打破ABI调用惯例的后果是什么?
EN

Stack Overflow用户
提问于 2022-07-05 02:53:41
回答 1查看 50关注 0票数 1

我正在做一些编译器编写项目,我想确保我正确地理解ABI和调用约定。

假设我正在为一些高级语言L编写编译器,它的目标是一些系统S

如果我的理解是正确的,只要我正在为调用其他L方法的L方法生成指令,我就可以使用我想要的任何调用约定。我唯一需要遵循S的ABI所指定的标准调用约定的时间是,每当我想进行系统调用或调用符合ABI调用约定的外部函数时。

这种理解是正确的吗?此外,除了与外部函数的明显兼容性之外,语言运行库具有不同的内部调用约定是否会带来任何负面影响?

EN

回答 1

Stack Overflow用户

发布于 2022-07-05 04:32:10

如果是您的语言,您可以在硬件和操作系统的约束下,在内部使用您喜欢的任何调用约定(请参阅@RaymondChen's comment for examples)。如果您知道可以看到函数的所有调用站点,则甚至不必保持一致。

但是:

  • 如果您想调用外部函数,还需要实现它们的调用约定(如果需要的话,还需要使用名称mangling )。

  • 如果您希望外部函数能够调用您的函数(包括您使用的任何顶级函数),那么您需要实现他们希望您做的事情。因此,您可能需要一些类似C++的extern "<language>"语法来标记foreign-callables.

系统调用通常有自己的调用过程;通常,这涉及到使用特殊用途的操作码来引发中断。标准库通常包括系统调用的包装器,但是如果您有一些语法来声明函数的调用约定,那么您也可以将它用于系统调用,尽管它会限制可移植性。

但所有这些都不是反对创建自己的ABI的理由。实际上,您的语言设计可能依赖于没有自定义ABI (异常、协同、分隔的延续、生成器、异步过程等)无法有效实现的特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72863544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档