SWIFT ABI 在哪里发挥作用?

G.A*_*sek 5 compiler-construction abi llvm ios swift

标题可能不足以概述问题上下文。所以这里是描述:

SWIFT 编译过程 Swift 编译器经过以下步骤来编译 Swift 文件

Swift 编译步骤

根据苹果公司的说法,

IR生成(在lib/IRGen中实现)将SIL降低为LLVM IR,此时LLVM可以继续优化它并生成机器代码。

查询号 1 - 我们都知道编译器将我们的源代码转换为汇编语言,而汇编器(主要嵌入在操作系统中,至少 Swift 编译器中没有汇编器)将其转换为机器代码。因此,根据上面引用的语句,编译器中的 LLVM 将 LLVM IR 更改为机器代码。那么如果是这种情况,那么汇编器在 Swift 程序和执行中就没有任何作用了?

查询号 2 - Swift 中的 LLVM 将 LLVM IR 直接更改为机器代码。这意味着我编译的可执行二进制文件具有机器代码,而不是汇编代码。根据我的理解,机器代码不需要像汇编语言那样的任何特定的调用约定,而 ABI 就是关于调用约定、内存布局表示等,通过它们定义两个二进制文件之间的通信。那么,由于二进制可执行文件已经具有机器代码,ABI 会出现在哪里呢?

那么,是我遗漏了一些东西,还是苹果让它变得非常抽象?

Sul*_*han 3

ABI 稳定性宣言中对 ABI 的作用有很好的描述。

总之,ABI 是关于链接和运行时编译的应用程序模块之间的通信层。例如应用程序和编译的静态库。或者应用程序和标准库(Swift 运行时)。

ABI 回答如下问题:

  • 函数是如何存储的?名称是如何存储的?它的参数是如何存储的?默认参数值如何存储?属性(例如可用性)如何存储?泛型如何存储?在哪里可以找到函数的机器指令?

  • 如何在开始执行函数机器指令之前将参数放入调用堆栈(即如何将参数传递给self函数?)。这就是调用约定

如果您有两个版本的 Swift 编译器,并且每个版本都使用不同的格式,则它们无法互相调用,因为它们不知道如何解释文件中的信息。这就是为什么需要 ABI 稳定性。它稳定了代码的存储方式。请注意,机器指令是函数的主体,但所有其他元数据也必须存储。

装配对于 ABI 稳定性没有任何作用。汇编只是另一种低级编程语言,Swift 中不使用它。