Swift编译器设备。 第一部分


Swift不仅是一种编程语言。 这是一个除编译器之外还包含许多其他组件的项目。 而且编译器本身并不是一个大而可怕的盒子,借助魔术,它会将您的代码转换为机器可以理解的一组指令。 也可以将其分解为组件。 如果您对哪个感兴趣,欢迎光临。


我不是编译器专家,也没有这方面的经验。 但是我想知道它是如何工作的,所以我开始研究Swift编译器。 由于该文章太大,因此我不得不将其分为4部分:


  • 组件概述
  • 解析源文件,
  • 迅捷的中间语言,
  • LLVM IR和代码生成。

斯威夫特


Swift已经超过两年了,是一个开源项目。 在这段时间里,社区增加了许多改进。 您可以在特殊站点以及论坛上关注它们。 您可以在那里讨论改善语言的建议或提出您的想法。 但是要做到这一点,您首先需要弄清楚项目的工作方式。


Swift标准库





Swift的主要部分当然是编译器和标准函数库。 它们是并行发展的,实际上彼此之间是密不可分的。


编译器是用C ++编写的,而stdlib的主要部分是在Swift中。 但是,其中使用的语言具有多个功能:


  • 通过内置模块的标准库可以直接访问编译器功能。 这使她可以访问低级语言表示形式和原始指针。
  • 标准库不使用专用访问修饰符。 而是,非公共实体名称以下划线开头。 在这里阅读更多。
  • 它使用“ 生成样板” (GYB)实用程序使用代码生成来减少标准库中代码的重复。

标准库通常与容器和有用的功能相关联,以简化开发人员的工作,但这只是其中一部分。 总共可以区分3个最有趣的组件:


  • 核心 具有所有协议,数据类型和功能的内核。 资料来源
  • 运行时 标准库和编译器之间的中间层。 他负责类型转换,语言的记忆,反射和其他动态功能。 用C ++和Objective-C编写。 资料来源
  • SDK叠加层。 对Foundation和其他系统框架的包装,使从Swift访问它们更加方便。 资料来源

其他子项目





除了编译器和标准库之外,公共领域中还有许多其他子项目。 下面列出了其中一些。


资料包


IDE支持框架 :索引编制,语法突出显示,代码完成等。


SourceKit-LSP


基于SourceKit的Swift LSP的实现 。 您可以在这里阅读有关内容。


迅捷包管理器


Swift上的项目的软件包管理器


基金会


Foundation库的端口 ,它是Apple第三方平台OS的核心之一。


libdispatch(gcd)


适用于第三方平台的GCD


XC测试


第三方平台的XCTest


本地数据库


具有Swift和REPL支持的LLDB


游乐场支持


项目包括两个框架-PlaygroundSupport和PlaygroundLogger。 它们分别提供与Xcode的交互和漂亮的数据显示。


llbuild


构建系统


陀螺仪


生成代码的实用程序


libcxx


标准C ++库的实现。


Swift编译器





从广义上讲,编译器是将代码从一种语言转换为另一种语言的程序。 但是编译常常是指将源代码转换为机器代码(或转换为其他低级表示形式),然后可以将其用于创建可执行文件。


编译器通常分为三部分:前端,中间层,后端。 第一个负责将源代码转换为中间表示形式,这对于编译器进行操作很方便。 Middlend执行优化,后端从优化的中间表示生成机器代码。


但是,在Swift中,优化是在前端和后端(大多数)中执行的。 因此,图中未示出中间步骤。


LLVM





Swift编译器使用LLVM作为后端。 LLVM是一个包含许多技术的大型项目。 它基于中间表示(IR)。 这是通用的中间代码表示形式,可以在LLVM支持的任何平台上转换为可执行代码。



如果出现新的体系结构,则足以在LLVM中添加从IR为该平台生成的机器代码。 之后,所有具有IR生成器的编译器都将支持该体系结构。


另一方面,要为新的编程语言创建编译器,只需在IR中编写源代码的翻译就足够了,并且LLVM将处理各种体系结构。


这种系统的另一个优点是LLVM可以优化中间表示,并且前端可以不参与优化。 这大大简化了编译器的开发。


IR具有三种类型的显示:


  • 内存中的对象树。 每个对象对应于源代码中的某个实体:函数,运算符,行,指针等。 该树是由IR生成阶段的前端创建的。
  • 文字检视。 可以将IR推断为低级源代码。 可以将其保存到文件并使用解释器执行。
  • 序列化的位格式“ bitcode”(不要与字节码混淆,例如在Java中使用的字节码)。 它可以用作后端的最终结果,并传输到链接器以在链接级别进行优化。 在这种情况下,链接器将转换为机器代码。

链接器是生成可执行文件的程序。 她的描述超出了本文的范围。


您可以在此处找到Swift中使用的LLVM版本的源代码,以及官方网站上的文档。


如您所见,Apple在开放访问上发布了许多有趣的项目。 在下一部分中,我将讨论解析源文件并生成AST。

Source: https://habr.com/ru/post/zh-CN438204/


All Articles