Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 斯威夫特·阿比在哪里出现?_Ios_Swift_Compiler Construction_Llvm_Abi - Fatal编程技术网

Ios 斯威夫特·阿比在哪里出现?

Ios 斯威夫特·阿比在哪里出现?,ios,swift,compiler-construction,llvm,abi,Ios,Swift,Compiler Construction,Llvm,Abi,标题可能不足以概括问题的背景。下面是描述: 快速编译过程 Swift编译器通过以下步骤编译Swift文件 根据, IR生成(在lib/IRGen中实现)将SIL降低到LLVM IR,至少 这一点LLVM可以继续优化它并生成机器代码 查询编号1-我们都知道编译器将源代码转换为汇编语言,而汇编程序(大部分嵌入操作系统,至少Swift编译器中没有汇编程序)将其转换为机器代码。因此,根据上面引用的语句,编译器中的LLVM将LLVM IR更改为机器代码如果是这种情况,那么汇编程序在快速程序和执行中就没有

标题可能不足以概括问题的背景。下面是描述:

快速编译过程 Swift编译器通过以下步骤编译Swift文件

根据,

IR生成(在lib/IRGen中实现)将SIL降低到LLVM IR,至少 这一点LLVM可以继续优化它并生成机器代码

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

查询编号2-Swift中的LLVM将LLVM IR直接更改为机器代码。这意味着我编译的可执行二进制文件有机器代码,而不是汇编代码。根据我的理解,机器代码不需要汇编语言所具有的任何特定调用约定,ABI完全是关于调用约定、内存布局表示等,通过这些约定定义了两个二进制文件之间的通信既然二进制可执行文件已经有了机器代码,那么ABI在图中的位置是什么呢?


那么,是我遗漏了什么,还是苹果把它保持得相当抽象呢?

关于ABI在其中的作用有一个很好的描述

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

ABI回答的问题如下:

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

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

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


组装在ABI稳定性中不起作用。汇编只是另一种未在Swift中使用的低级编程语言。

汇编和机器码的区别在于汇编是文本格式,机器码是二进制的。它与调用约定无关。还有,你从哪里知道汇编程序“大部分嵌入到操作系统中”?你看了吗?@sepp2k是的,我们同意机器代码与调用约定无关这一事实。所以,当iOS应用程序可执行二进制文件安装在操作系统中时,为什么需要ABI与操作系统中的Swift标准库通信呢。“大部分嵌入到操作系统中”,至少我可以保证iOS会发生这种情况。@Sulthan我确实经历过,但我试图直观地解释与iOS应用程序可执行二进制文件和iOS中嵌入的swift标准库二进制文件之间的通信相关的ABI概念。意味着如果iOS应用程序可执行文件包含机器代码,为什么您甚至需要ABI?@G.Abhisek函数声明是如何存储在机器代码中的?函数名、参数名、默认值、属性?结构的内存布局是什么样子的?如果Swift应用程序必须从标准库(运行时)调用函数,它必须知道这些东西是如何存储的。这就是运行时的ABI稳定性。库不仅仅是一组机器代码指令。