本文主要了解什么是Swift,有哪些优势。了解Swift编译流程。
主要内容:
- 了解Swift
- 编译流程
1. 了解Swift
Swift是Apple在2014年6月WWDC发布的全新编程语言,中文名和logo是“雨燕”。
Swift是一种高性能的系统编程语言。它拥有干净而现代的语法,提供了对现有C和Objective-C代码和框架的无缝访问,并且默认是内存安全的。
尽管受到Objective-C和其他语言的启发,Swift本身并不是c衍生语言。作为一门完整而独立的语言,Swift包下了流控制、数据结构和函数等核心特性,以及对象、协议、闭包和泛型等高级结构。Swift更多的使用模块,消除了对header的需要和它们带来的代码重复。初学者可以不用了解C或OC,直接学习Swift。
Swift的语法更加简洁,得益于编译器的强大,语法简洁功能又强大。同时Swift是一门类型安全的语言,在安全方面下了很大的功夫。
Swift提供了Playground进行代码预览,可以很方便的学习语法。
Swift和OC可以混编,更方便过渡。
Swift完全开源:https://github.com/apple/swift,主要采用C++编写
2. 编译流程
2.1 编译器架构
编译过程和OC基本一样,仅仅是前端编译器不一样。因此详细过程可以查看博客编译流程详细认识
编译器架构- 前端编译器swiftc将源代码生成语法树,再生成IL,之后输出为LLVM通用的IR。
- 优化器LLVM Optimizer进行各种优化,改善代码运行时间。再次输出IR
- 后端编译器LLVM Code Generator接收到IR,将代码映射到目标指令集,生成二进制代码。
可以看出来,LLVM的设计理念就是前后端分离。只要提供不同的前端编译器就可以兼容不同的语言。只要提供不同的后端编译器,就可以兼容不同的硬件架构。使用中间语言IR做到兼容。
2.2 编译详细过程
编译详细过程创建一个简单的Swift源文件,下面将编译过程执行一遍,具体的查看每一步的运行结果
import Foundation
let i = 1
let j = 2
i + j
2.2.1 生成语法树
swiftc -dump-ast main.swift
生成语法树
说明:
- 语法分析程序判断程序在结构上是否正确,它的任务是验证语法是否正确
- 在词法分析的基础上将单词序列组合成各类此法短语,如程序、语句、表达式 等等
- 然后将所有节点组成抽象语法树AST(Abstract Syntax Tree)
- 这里还会将警告报错显示出来,比如我只进行了运算但是没有赋值,所以会有 is unused的警告
- 大体分为三部分,第一部分是i的定义,第二部分是j的定义,第三部分是加法运算
- 加法运算可以看到是调用了一个函数类型为
(Int, Int) -> Int
的函数来执行的,而该函数在后面又进行说明是.+。参数传递的是i和j。 - 因此对语法树的简单分析可以看到就是针对所有的结构进行语法检查。最后形成一个抽象语法树
2.2.2 生成IL代码
swiftc -emit-sil main.swift
生成IL代码
说明:
- 这里生成的IL代码,和汇编很类似,这里仅仅简单了解,也没必要对每条语句进行分析。
- 大体上可以看到是在寄存器上对i和j进行存储,之后取出进行计算。
2.2.3 生成IR代码
swiftc -emit-ir main.swift -o main.ll
IR代码
说明:
- 执行后,会得到一个main.ll文件
- 在文件中就是IR代码。这里也是和汇编类似。
- 将语法树自顶向下遍历逐步翻译成LLVM IR。
- 拿到IR后,就可以让后端编译器执行,最后会变成二进制文件。
2.2.4 生成汇编代码
swiftc -emit-assembly main.swift -o main.s
汇编代码
说明:
- 这里为了简单,把加法运算删掉了。
- 只查看两个值的定义。通过movq给i和j分别赋值
- 关于汇编的认识后面文章会分析,这里仅简单的查看
2.2.5 生成二进制文件
swiftc -o main.out main.swift
二进制文件
说明:
- 对汇编文件进行汇编操作就得到了目标文件(.o文件)
- 汇编器将汇编代码转换为机器代码,最后输出目标文件(object file)
网友评论