我正在做一些编译器编写项目,我想确保我正确地理解ABI和调用约定。
假设我正在为一些高级语言L编写编译器,它的目标是一些系统S。
如果我的理解是正确的,只要我正在为调用其他L方法的L方法生成指令,我就可以使用我想要的任何调用约定。我唯一需要遵循S的ABI所指定的标准调用约定的时间是,每当我想进行系统调用或调用符合ABI调用约定的外部函数时。
这种理解是正确的吗?此外,除了与外部函数的明显兼容性之外,语言运行库具有不同的内部调用约定是否会带来任何负面影响?
发布于 2022-07-05 04:32:10
如果是您的语言,您可以在硬件和操作系统的约束下,在内部使用您喜欢的任何调用约定(请参阅@RaymondChen's comment for examples)。如果您知道可以看到函数的所有调用站点,则甚至不必保持一致。
但是:
extern "<language>"语法来标记foreign-callables.。
系统调用通常有自己的调用过程;通常,这涉及到使用特殊用途的操作码来引发中断。标准库通常包括系统调用的包装器,但是如果您有一些语法来声明函数的调用约定,那么您也可以将它用于系统调用,尽管它会限制可移植性。
但所有这些都不是反对创建自己的ABI的理由。实际上,您的语言设计可能依赖于没有自定义ABI (异常、协同、分隔的延续、生成器、异步过程等)无法有效实现的特性。
https://stackoverflow.com/questions/72863544
复制相似问题