swiftc-Swift编译器详解

参考 the-swift-compiler-for-beginners

编译Swift源文件

创建main.swift, 输入如下代码

print("Hello world!")
# 编译 main.swift, -o 设置生成的可执行程序名字
swiftc main.swift -o hello
# 执行hello可执行程序,输出"Hello world!"
./hello

-D

设置条件编译标志为true

#if(DEBUG)
    print("debug mode")
#endif
print("Hello world!")
# 设置条件编译DEBUG并执行程序
swiftc main.swift -D DEBUG && ./main

编译多个Swift文件

# point.swift
struct Point {
    let x: Int
    let y: Int
}
# main.swift
#if(DEBUG)
    print("debug mode")
#endif
let p = Point(x: 4, y: 20)

print("Hello world!", p.x, p.y)
swiftc point.swift main.swift -o point-app
# 输出Hello world! 4 20
./point-app

-v

添加 -v(verbose) 参数输出 swiftc 详细执行过程

swiftc point.swift main.swift -o point-app -v

image.png

  1. usr/bin/swift 分别编译 main.swift point.swift
  2. usr/bin/ld 链接两个目标文件.o, 生成可执行程序point-app

编译 – 前后端分离

图片[1]-swiftc-Swift编译器详解-五八三
不同语言使用不同的编译器前端, 方便扩展新语言

  • C -> Clang/GCC
  • Objective-C -> Clang
  • Swift -> swiftc
  • others….

生成统一的 LLVM IR文件

交给统一的编译器后端LLVM 编译成各个架构的可执行程序, 如ARM x86等

编译详细过程

image.png

  1. 语法分析生成抽象语法树(AST)

swiftc -dump-ast main.swift
image.png

  1. 生成中间层代码(SIL)

swiftc -emit-sil main.swift
image.png

  1. llvm中间表示层(IR)

swiftc -emit-ir main.swift
image.png

  1. 生成汇编代码

swiftc -emit-assembly main.swift
image.png
5. 生成目标文件 .o

swiftc main.swift -o main.o

swiftc point.swift -o point.o

  1. 链接生成可执行程序

ld main.o point.o -o main

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYmPK2sh' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片