标题可能不足以概述问题上下文。因此,说明如下:
SWIFT编译过程 Swift编译器需要执行以下步骤来编译Swift文件
根据Apple,
IR生成(在lib / IRGen中实现)将SIL降低为LLVM IR, LLVM可以继续优化它并生成机器代码。
查询编号1- 我们都知道编译器会将源代码转换为汇编语言和汇编器(大多数嵌入在OS中,至少Swift编译器没有汇编程序)将其转换为机器代码。因此,按照上面引用的语句,编译器中的LLVM将LLVM IR更改为机器代码。 因此,如果是这种情况,那么汇编程序将不会在Swift程序和执行中发挥作用?
查询编号2- Swift中的LLVM将LLVM IR直接更改为机器代码。因此,这意味着我编译的可执行二进制文件包含机器代码,而不是汇编代码。而且据我所知,机器代码不需要像汇编语言那样的任何特定调用约定,而ABI就是关于调用约定,内存布局表示等的,通过它们定义两个二进制文件之间的通信。 那么ABI出现在图片的什么位置,因为二进制可执行文件已经具有机器代码了?
那么我有什么想念的东西吗?或者苹果一直把它弄得很抽象?
答案 0 :(得分:1)
ABI Stability Manifesto中对ABI的作用有很好的描述。
总而言之,ABI是关于链接和运行时编译的应用程序模块之间的通信层。例如,应用程序和已编译的静态库。或应用程序和标准库(Swift运行时)。
ABI回答以下问题:
如何存储函数?名称如何存储?如何存储其参数?默认参数值如何存储?属性(例如可用性)如何存储?泛型如何存储?您在哪里找到功能的机器说明?
如何在开始执行函数机器指令之前将参数放在调用堆栈上(即,如何将参数和self
传递给函数?)。这就是调用约定的含义。
如果您有两个版本的Swift编译器,并且每个版本使用不同的格式,则它们将无法相互调用,因为它们不知道如何解释文件中的信息。这就是为什么需要ABI稳定性。它可以稳定代码的存储方式。请注意,机器指令是功能的主体,但所有其他元数据也必须存储。
装配对ABI稳定性没有影响。汇编只是Swift中不使用的另一种低级编程语言。