Swift学习iOS

Swift’s use of SIL

2020-08-17  本文已影响0人  纯情_小火鸡

Swift 是一门静态语言,在 Swift 中声明的方法和属性静态编译期就确定了的,并且Swift具有更灵活的高级特性,协议,泛型,方法重载,值引用等,所以其与OC运行时动态消息派发不同,需要支持静态派发以及动态派发,目前的这些特性Clang并不能完全支持。

因此苹果另外实现了一套 Swift() 作为Swift的编译前端,由于其语言特性,反而有更多的优化空间。

其使用SIL作为前端中间表示层,与IR差异很大,大致体现在:

1. Clang vs Swift():

Clang

clang.png

Swift

swift.png

2. V-Table

常见的编译型语言的动态派发方式,编译器层使用一个表格结构来存储类型声明中的每一个函数指针。C++中称之为虚函数表VTable,也是其支持多态的基础。

在Swift中,拥有继承关系的Class采用此种方式,即每一个类会维护一个函数表,该表会记录该类中所有的函数指针:

  1. 由父类继承而来的方法执行地址。
  2. 如果子类重写父类方法,表中会保存被重载之后的函数。
  3. 子类新增的函数会加入到表的末尾。

然后在程序运行期间查表执行具体实现。

3. Protocol Witness Table

因为协议不一定具有继承关系,所以其创建了Protocol Witness Table。大致实现为:Swift会为每一个实现了该协议的对象生成一个大小一致的结构体,这个结构体被称为Existenial Container,它内部包含PWT,表中存储着一组函数的执行地址,而表中的每一个条目指向了符合该协议的类型信息。该结构体中还保留了三个字长的valueBuffer用来存储数据成员。

4. SIL

SIL是一种SSA形式的IR,具有高级语义信息,旨在实现Swift编程语言。 SIL适用于以下用例:

与LLVM IR相比,SIL是一种通常与目标无关的格式表示形式,可用于代码分发,但它也可以像LLVM一样表示特定于目标的概念。

在较高的层次上,Swift编译器遵循严格的管道架构:

5. SILGen

SILGen通过遍历经过类型检查的Swift AST来生成“原始SIL”。 SILGen发出的SIL形式具有以下特性:

这些属性通过后续保证的优化和诊断遍历得到解决,这些遍历始终针对原始SIL运行。

6. General Optimization Passes

SIL捕获特定语言的类型信息,从而可以实现在LLVM IR上难以执行的高级优化。

如下代码为swift实现代码在SIL下的展现形式:

sil_stage canonical 

import Swift 

//定义SIL函数使用的类型。

struct Point { 
  var x:Double 
  var y:Double 
} 

class Button { 
  func onClick()
  func onMouseDown()
  func onMouseUp()
} 

//声明一个Swift函数。主体被SIL忽略。
func taxicabNorm(_ a:Point)-> Double { 
  return a.x + a.y 
} 

//定义SIL函数。
//名称@_T5norms11taxicabNormfT1aV5norms5Point_Sd是 taxicabNorm Swift函数的错误名称。
sil @ _T5norms11taxicabNormfT1aV5norms5Point_Sd:$(Point)-> Double { 
bb0(%0:$ Point):
  // func Swift。+(Double,Double)-> Double 
  %1 = function_ref @ _Tsoi1pfTSdSd_Sd 
  %2 = struct_extract%0:$ Point,#Point.x 
  %3 = struct_extract%0:$ Point,#Point.y 
  %4 = apply%1(%2,%3):$(Double,Double)-> Double 
  return%4:Double 
} 

//定义SIL vtable。匹配动态分派的方法
//标识与其已知静态类类型的实现相匹配。
sil_vtable Button { 
  #Button.onClick!1:@ _TC5norms6Button7onClickfS0_FT_T_ 
  #Button.onMouseDown!1:@ _TC5norms6Button11onMouseDownfS0_FT_T_ 
  #Button.onMouseUp!1:@ _TC5norms6Button9onMouseUpfS0_FT_T_ 
}

7. Swift’s use of SIL 流程

Two Phases of SIL Passes.png
上一篇下一篇

猜你喜欢

热点阅读