Swift简介
在学习Swift之前,我们先来了解下什么是Swift
Swift是Apple
在2014年6月WWDC
发布的全新编程语言,中文名和LOGO是”雨燕“
Swift之父是Chris Lattner
,也是Clang
编译器的作者,LLVM
项目的主要发起人
Swift版本
Swift历时七年,从Swift 1.*
更新到Swift 5.*
,经历了多次重大改变,ABI
终于稳定
API(Application Programming Interface):应用程序编程接口
- 源代码和库之间的接口
ABI(Application Binary Interface):应用程序二进制接口
- 应用程序和操作系统之间的底层接口
- 涉及的内容有:目标文件格式、数据类型的大小/布局/对齐,函数调用约定等
Swift是完全开源的,下载地址:https://github.com/apple/swift
Swift编译原理
LLVM编译器
LLVM编译器一般分为前端和后端
- 前端:主要进行词法分析,生成语法树
- 后端:生成对应平台的二进制代码
编译流程
我们知道OC的前端是通过Clang
进行编译的,Swift的前端是通过swiftc
来编译的
不同语言的前端可能不同,但最终都会通过编译器的后端生成对应平台的二进制代码
整个编译流程如下图所示
- Swift Code:我们编写的Swift代码
- Swift AST:Swift语法树
- Raw Swift IL:Swift特有的中间代码
- Canonical Swift IL:更简洁的Swift特有的中间代码
- LLVM IR:LLVM的中间代码
- Assembly:汇编代码
- Executable:二进制代码
关于Swift编译流程的详细讲解可以参考以下网址:https://swift.org/swift-compiler/#compiler-architecture
swiftc
我们打开终端,输入swiftc -help
,会打印出相关指令,这也说明了swiftc
已经存在于Xcode中
我们可以在应用程序中找到Xcode
,然后右键显示包内容
,通过该路径找到swiftc
路径:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
swiftc的基本操作演练
下面我们可以通过一些swiftc
的一些基本操作来了解
1.我们先新建一个Swift的命令行项目
2.然后打开终端,cd
到main.swift
路径
3.然后我们输入swiftc -dump-ast main.swift
,来查看下生成的语法树
4.我们还可以输入swiftc -emit-sil main.swift
生成最简洁的SIL代码
5.我们还可以输入swiftc -emit-ir main.swift
生成LLVM IR中间代码
6.我们还可以输入swiftc -emit-assembly main.swift
生成汇编代码
Swift基础语法
Swift中打印输入:print("Hello World")
Swift中一句代码是可以省略分号的,但是如果多句代码写在一行,需要用分号隔开
Swift不用编写main函数
,会以全局范围内的首句可执行代码作为入口来执行
通过反汇编我们可以看到底层会执行main函数
常量和变量
常量:
1.用let
定义常量,常量只能赋值一次
不用特意指明类型,编译器会自动进行推断
let a: Int = 10
let b = 20
2.它的值不要求在编译过程中确定,但使用之前必须赋值一次
这样写确定了a的类型,之后再去赋值,也不会报错
let a: Int
a = 10
用函数给常量赋值也可以,函数是在运行时才会确定值的,所以只要保证使用之前赋值了就行
func getNumber() -> Int {
return 10
}
let a: Int
a = getNumber()
如果没有给a确定类型,也没有一开始定义的时候赋值,就会像下面这样报错
变量:
1.用var
定义变量
var b = 20
b = 30
2.常量、变量在初始化之前,都不能使用
注释
1.Swift中有单行注释和多行注释
注释之间嵌套也没有问题
// 单行注释
/*
多行注释
/*
多行注释
*/
/*
// 注释嵌套
*/
2.Playground
里的注释支持Markup
语法(同Markdown)
Markup
语法只在Playground
里有效,在项目中无效
//: # 一级标题
/*:
## 基础语法
*/
可以通过Editor -> Show Raw Markup
来预览
预览的效果如下
标识符
1.标识符(比如常量名、变量名、函数名)几乎可以使用任何字符
let
请发表评论