编程语言可以有自己的调用约定吗?

问题描述

Windows 和 Unix 有它们自己的 calling-conventions for x86-64。但是,如果一种语言需要/受益于它,它是否可以有自己的调用约定供内部使用?例如,Swift / Python(已编译)可能会受益于具有多个寄存器以从函数返回多个结果(因为这些语言支持)。所以保留,比如说 3 个寄存器(raxrcxrdx),用于他们的语言调用约定中的返回值,它会破坏什么吗?导致任何未被注意到的错误,或在任何情况下导致未定义的行为?

另外,如果没有必要遵循那个约定,那他们为什么要为用户空间定义调用约定?

解决方法

当然可以。剩下的问题将是与 API/操作系统的交互,您必须遵守操作系统的做事方式。

总的来说,重点可能是成本/收益关系。

但出于特殊目的,这是可能的,甚至可能更好(你为什么还要这样做?)。
此外,还要考虑对操作系统特定事物(例如 red-zone)可能产生的副作用。

,

调用约定完全由编译器的作者决定。它们没有任何理由符合任何 ISA 供应商记录的约定或任何其他约定。对于已经创建约定的 ISA 供应商,它们经常被使用。但是没有要求。看看过去的 x86 吧。标准的概念是一个相对较新的事物(在编译语言的时间范围内)。

如果你想创建二进制文件,那么你可以做你想做的,如果你想制作可以与来自其他工具链的二进制文件一起使用的对象/库,那么双方(竞争并且可能不相处)需要使用同样的约定。这通常意味着有一个占主导地位的工具链,而其他工具链则试图顺应变化并跟上变化。

共享运行时库(.dll、.so 等)将使用约定编译二进制文件,如果您希望应用程序能够使用它们,您需要使用该约定调用其中的函数,无论是您用来使用不同约定的垫片,还是您的编译器本机使用相同的约定。