[译] Swift 编译器

Posted 萌面大道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[译] Swift 编译器相关的知识,希望对你有一定的参考价值。

- by kingcos



作者
原文链接
Swift.org[1]
Swift Compiler[2]

Swift 主仓库[3]中包含了 Swift 编译器和标准库的源代码、相关组件,如 SourceKit(用于 IDE 集成),以及 Swift 回归测试套件和实现级别的文档。

Swift 驱动库[4]中包含了 Swift 编译器驱动(Driver)的新版实现,目的是替换现有编译器驱动,以增强可扩展性、可维护性以及鲁棒性(Robust)。

编译器架构

整体而言,Swift 编译器的主要职责在于将 Swift 源代码翻译为高效执行的机器码。但是 Swift 编译器的前端同样支持许多其它工具,包括与 IDE 集成的语法高亮、代码补全、以及其它提供便利的工具。本文对 Swift 编译器的主要组件提供了高阶描述:

解析(Parsing):解析器是一个简易的递归下降解析器(在 lib/Parse[5] 中实现),并带有完整手动编码的词法分析器。语义分析(Semantic Analysis):语义分析阶段(在 lib/Sema[6] 中实现)负责获取已解析的 AST(抽象语法树)并将其转换为格式正确且类型检查完备的 AST,以及在源代码中提示出现语义问题的警告或错误。语义分析包含类型推断,如果可以成功推导出类型,则表明此时从已经经过类型检查的最终 AST 生成代码是安全的。Clang 导入器(Clang Importer):Clang 导入器(在 lib/ClangImporter[7] 中实现)负责导入 Clang 模块,并将导出的 C 或 Objective-C API 映射到相应的 Swift API 中。最终导入的 AST 可以被语义分析引用。SIL 生成(SIL Generation):Swift 中间语言(Swift Intermediate Language,SIL)是一门高级且专用于 Swift 的中间语言,适用于对 Swift 代码的进一步分析和优化。SIL 生成阶段(在 lib/SILGen[8] 中实现)将经过类型检查的 AST 弱化为所谓的「原始」SIL。SIL 的设计在 docs/SIL.rst[9] 有所描述。SIL 保证转换(SIL Guaranteed Transformations):SIL 保证转换阶段(在 lib/SILOptimizer/Mandatory[10] 中实现)负责执行额外且影响程序正确性的数据流诊断(比如使用未初始化的变量)。这些转换的最终结果是「规范」SIL。SIL 优化(SIL Optimizations):SIL 优化阶段(在 lib/Analysis[11]lib/ARC[12]lib/LoopTransforms[13] 以及 lib/Transforms[14] 中实现)负责对程序执行额外的高级且专用于 Swift 的优化,包括(例如)自动引用计数优化、去虚拟化、以及通用的专业化。LLVM IR 生成(LLVM IR Generation):IR 生成阶段(在 lib/IRGen[15] 中实现)将 SIL 弱化为 LLVM LR,此时 LLVM 可以继续优化并生成机器码。


扩展内容

 ┌──────────┐ ┌─────────┐ ┌────────────┐ │Swift Code│────▶│Swift AST│────▶│Raw Swift IL│──┐ └──────────┘ └─────────┘ └────────────┘ │ ┌────────┐ ┌───────┐ ┌──────────────────┐ │┌──│Assembly│◀───│LLVM IR│◀───│Canonical Swift IL│◀─┘│ └────────┘ └───────┘ └──────────────────┘│ ┌──────────┐└─▶│Executable│ └──────────┘

References

[1] Swift.org: https://swift.org
[2] Swift Compiler: https://swift.org/swift-compiler
[3] Swift 主仓库: https://github.com/apple/swift
[4] Swift 驱动库: https://github.com/apple/swift-driver
[5] lib/Parse: https://github.com/apple/swift/tree/master/lib/Parse
[6] lib/Sema: https://github.com/apple/swift/tree/master/lib/Sema
[7] lib/ClangImporter: https://github.com/apple/swift/tree/master/lib/ClangImporter
[8] lib/SILGen: https://github.com/apple/swift/tree/master/lib/SILGen
[9] docs/SIL.rst: https://github.com/apple/swift/blob/master/docs/SIL.rst
[10] lib/SILOptimizer/Mandatory: https://github.com/apple/swift/tree/master/lib/SILOptimizer/Mandatory
[11] lib/Analysis: https://github.com/apple/swift/tree/master/lib/SILOptimizer/Analysis
[12] lib/ARC: https://github.com/apple/swift/tree/master/lib/SILOptimizer/ARC
[13] lib/LoopTransforms: https://github.com/apple/swift/tree/master/lib/SILOptimizer/LoopTransforms
[14] lib/Transforms: https://github.com/apple/swift/tree/master/lib/SILOptimizer/Transforms
[15] lib/IRGen: https://github.com/apple/swift/tree/master/lib/IRGen

以上是关于[译] Swift 编译器的主要内容,如果未能解决你的问题,请参考以下文章

GCC/MingW 在不同版本上编译

Swift 编程中的尾递归和蹦床译

[译] 官方 Swift API 设计规范

解释'空'C数组(int a = {};)

swift常用代码片段

swift 代码片段