为什么Swift的实现需要SIL
背景
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
学swift语言能干什么可以看到,SIL 将原本在 clang 中独⽴的静态分析和 IR ⽣成阶段整合了起来。
(通俗的说就是,clang 在实现的时候开发者们发现很多阶段是交织在⼀起,没有很好的独⽴开来,导致代码耦合度⾼,现在加⼊了⼀个中间层,来解决这种情况)
SIL 的特点
1. 能够完整的表达程序的语义。
2. 被设计⽤于代码⽣成和静态分析
3. 处于编译的流⽔线中,⽽不是独⽴与之外
4. 在源代码和 LLVM 之间架起了抽象的桥梁
引⽤
1. LLVM 介绍
2. Swift's High-Level IR: A Case Study
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论