美文网首页
为什么 Swift 的实现需要 SIL

为什么 Swift 的实现需要 SIL

作者: ampire_dan | 来源:发表于2019-06-01 20:38 被阅读0次

背景

Swift 语言的实现借助了 LLVM,Swift 和 LLVM 的发明人 Chris Lattner,曾说过,Swift 语言就是 LLVM 的巨大语法糖。LLVM 定义了一种中间语言。所有经过前端编译的语言,在经过词法分析、语法分析、语义分析之后,LLVM 会帮助其生成对应的 LLVM 中间语言,然后这些中间语言表示的程序就可以进行各种优化处理,然后转换成不同平台的汇编语言。 LLVM 的出现可以说让发明一门语言的难度大幅减少了。关于 LLVM 更多介绍可以查看 Chris 自己的文章 ,见引用1。

Swift 语言在编译的时候会转换成 Swift 中间语言(Swift Intermediate Language,简称 SIL)。那么在已经有 LLVM IR (中间语言)的情况下,为什么不是直接转换成 LLVM 中间语言呢?而是多了一步先是转换成 SIL 然后才转换到 LLVM IR?

前言

具体内容可以查看 Youtube LLVM 官方视频的介绍(见引用2),以下内容是对该视频内容前半部分的总结,同时包含了一些作者自己的理解。(视频的后半部分是 Chris 举了几个例子来描述 SIL 是如何工作的。对于编译感兴趣的可以看看,能学到很多)

为什么需要 SIL

从 clang 中吸取的教训

类 c 语言的编译过程如下:


image.png

但是在实际编译的代码实现中是这样的:

image.png

很容易就能看出来这两张图想要表达的意思,在第二张图中,语法分析和语义分析之间很乱,然后语义分析生成 的 AST‘ 在转换成 IR 的时候也是相当的曲折,同时 AST‘ 也承担了支持代码的静态分析的前置责任。在静态分析和生成 IR 这两者之间其实有很多重复的逻辑。

总结一下:

  1. 源代码和 LLVM IR 之间有一个巨大的抽象层(但是这个抽象层在 clang 里面实现的并不完美)
  2. IR 对于源代码级别的静态分析不够友好
  3. clang 的静态分析实现(CFG)不够好同时,和 IR 有很多重复。

Swift 的特点

Swift 是一门高级的语言,很多语言的特性是靠语言自身实现的(比如 Swift 的 Int 这些就是 Swift 语言实现的),并且 Swift 的范型基于 Protocol。Swift 也是一门安全的语言,很多不安全的操作,比如未初始化的变量,死代码等等需要在尽早的阶段就能发现(意味则代码的静态分析很重要)。

以下是 Swift 的编译过程:

image.png

可以看到,SIL 将原本在 clang 中独立的静态分析和 IR 生成阶段整合了起来。

(通俗的说就是,clang 在实现的时候开发者们发现很多阶段是交织在一起,没有很好的独立开来,导致代码耦合度高,现在加入了一个中间层,来解决这种情况)

SIL 的特点

  1. 能够完整的表达程序的语义。
  2. 被设计用于代码生成和静态分析
  3. 处于编译的流水线中,而不是独立与之外
  4. 在源代码和 LLVM 之间架起了抽象的桥梁

引用

  1. LLVM 介绍
  2. Swift's High-Level IR: A Case Study

相关文章

  • 为什么 Swift 的实现需要 SIL

    背景 Swift 语言的实现借助了 LLVM,Swift 和 LLVM 的发明人 Chris Lattner,曾说...

  • Swift类、对象、属性

    Swift编译简介 SIL介绍 SIL是Swift Intermediate Language的简写,SIL会对S...

  • SIL optimizer - string append 优化

    简单介绍 这是最近Swift开发人员对Swift String进行的一个优化,PR地址SIL optimizer:...

  • SIL程序员手册

    介绍 本文用来向开发者提供关于SIL实现的信息.关于SIL正式在官方声明可以查看SIL详解.本文为关于内部实行的指...

  • swift-获取sil、ast编译中间产物文件

    获取sil文件 从swift文件到可执行文件.o的整个编译过程。 swift编译过程参考[https://trin...

  • 逃逸闭包、非逃逸闭包

    在开始逃逸闭包与非逃逸闭包之前,先普及一个知识点,即如果编译成SIL文件: 编译成SIL文件: swift使用的编...

  • Swift’s use of SIL

    Swift 是一门静态语言,在 Swift 中声明的方法和属性静态编译期就确定了的,并且Swift具有更灵活的高级...

  • swift底层 - 初识SIL

    历时5年发展,从Swift1.x发展到了Swift5.x版本,ABI终于稳定了 ABI(Application B...

  • Swift day-1

    生成语法树:swiftc-dump-ast main.swift 生成最简洁的SIL代码:swiftc -emit...

  • Swift-面向协议编程

    Swift协议里的方法可以实现 OC只能声明方法所以Swift才能实现面向协议编程 需要这个功能的,只需要遵守这...

网友评论

      本文标题:为什么 Swift 的实现需要 SIL

      本文链接:https://www.haomeiwen.com/subject/oloatctx.html