首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程语言可以有自己的调用约定吗?

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

Stack Overflow用户
提问于 2021-07-09 18:09:53
回答 2查看 58关注 0票数 2

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

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

EN

回答 2

Stack Overflow用户

发布于 2021-07-09 18:23:05

当然,他们可以。遗留的问题将是与API/ OS的交互,其中您必须遵守OS的做事方式。

总体而言,主要观点可能是成本/收益关系。

但对于特殊目的,这是可能的,甚至可能是更好的(否则你为什么要这样做呢?)。

此外,还要考虑到对特定于操作系统的东西(如red-zone )可能产生的副作用。

票数 4
EN

Stack Overflow用户

发布于 2021-07-11 20:41:57

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

如果你想创建二进制文件,那么你可以做任何你想做的事情,如果你想创建可以与其他工具链中的二进制文件一起使用的对象/库,那么双方(相互竞争,可能无法相处)都需要使用相同的约定。这通常意味着有一个占主导地位的工具链,而其他工具链则试图遵循并跟上变化。

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

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

https://stackoverflow.com/questions/68315024

复制
相关文章

相似问题

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