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

Can programming languages have their own calling conventions?

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

此外,如果没有必要遵循该约定,那么他们为什么要为用户 space 定义调用约定?

当然可以。剩余的问题将是与 API/the OS 的交互,您必须遵守 OS 做事方式。

总的来说,重点可能是cost/benefit关系。

但对于特殊用途,这是可能的,甚至可能更好(否则你为什么要这样做?)。
此外,请考虑对 OS 特定事物可能产生的副作用,例如 red-zone.

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

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

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