SWIFT ABI在哪里出现?

时间:2019-04-18 09:51:50

标签: ios swift compiler-construction llvm abi

标题可能不足以概述问题上下文。因此,说明如下:

SWIFT编译过程 Swift编译器需要执行以下步骤来编译Swift文件

Swift compilation steps

根据Apple

  

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

查询编号1- 我们都知道编译器会将源代码转换为汇编语言和汇编器(大多数嵌入在OS中,至少Swift编译器没有汇编程序)将其转换为机器代码。因此,按照上面引用的语句,编译器中的LLVM将LLVM IR更改为机器代码。 因此,如果是这种情况,那么汇编程序将不会在Swift程序和执行中发挥作用?

查询编号2- Swift中的LLVM将LLVM IR直接更改为机器代码。因此,这意味着我编译的可执行二进制文件包含机器代码,而不是汇编代码。而且据我所知,机器代码不需要像汇编语言那样的任何特定调用约定,而ABI就是关于调用约定,内存布局表示等的,通过它们定义两个二进制文件之间的通信。 那么ABI出现在图片的什么位置,因为二进制可执行文件已经具有机器代码了?

那么我有什么想念的东西吗?或者苹果一直把它弄得很抽象?

1 个答案:

答案 0 :(得分:1)

ABI Stability Manifesto中对ABI的作用有很好的描述。

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

ABI回答以下问题:

  • 如何存储函数?名称如何存储?如何存储其参数?默认参数值如何存储?属性(例如可用性)如何存储?泛型如何存储?您在哪里找到功能的机器说明?

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

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

装配对ABI稳定性没有影响。汇编只是Swift中不使用的另一种低级编程语言。