因为个人工作习惯的关系,对于命令行的喜爱甚于GUI,所以安装了Xcode 6 Beta 版后,一直想看看Swift 在命令行下该怎么编译,运行和调试。
没有找到特别相关的文档,所以就自己动手在Xcode 的安装目录下找了一下,做了一些尝试。
1. 运行Swift
新的Xcode 提供了一个Swift的程序,可以编译Swift 代码,也可以进入交互性的编程模式(REPL)
/Applications/Xcode6-Beta.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift
可以把上述目录加入PATH,这样你就可以直接运行swift了。
但是如果还安装了其他Xcode 版本,比较好的方式是设置Xcode命令行路径, 避免所用的其他命令行工具版本不一致。
sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer
然后就可以运行swift如下:
xcrun swift
Welcome to Swift! Type :help for assistance.
1> let str = "Hello Swift!"
str: String = "Hello Swift!"
2> println (str)
Hello Swift!
3> :quit
2. 编译Swift 程序
一个简单的swift 程序:
sample.swift:
let str = "Hello Swift!"
println(str)
在命令行编译Swift程序
xcrun swift -emit-executable -sdk $(xcrun --show-sdk-path --sdk macosx) sample.swift
swift 命令行有几个有意思的参数,除了-emit-executable用来生成可执行文件,还可以生成library,甚至生成LLVM IR (Intermediate Representation)。 如果你对LLVM IR熟悉的话,可以研究一下。
这样的话, 就生成一个sample 的可执行文件:
./sample
Hello Swift!
3. 调试Swift 程序
Xcode 提供了LLDB作为swift 的调试器。 如果想进行源代码级的调戏,请重新编译swift 程序,并带上-g参数,这样目标文件中才有相关的调试信息。xcrun swift -emit-executable -sdk $(xcrun --show-sdk-path --sdk macosx) -g sample.swift
然后运行调试器
lldb sample
(lldb) l => list the source code
1
2 let str = "Hello Swift!"
3 println(str)
(lldb) b 3 => set breakpoint at line 3
Breakpoint 1: where = sample`top_level_code + 57 at sample.swift:3, address = 0x0000000100001589
(lldb) r => run the program
Process 3003 launched: '/Users/andy/coderepo/swift/sample' (x86_64)
Process 3003 stopped
* thread #1: tid = 0x8019, 0x0000000100001589 sample`top_level_code + 57 at sample.swift:3, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100001589 sample`top_level_code + 57 at sample.swift:3
1
2 let str = "Hello Swift!"
-> 3 println(str)
(lldb) po str => print str variable
"Hello Swift!"
LLDB的命令和GDB基本一样,所以上手应该不难。
另外一个要注意的是老版本的LLDB并不支持Swift语言,如果发现没办法看到Swift 的源代码,或者查看变量有问题,请检查一下用的LLDB是不是正确。 一个简单的方法是用ps看运行的LLDB是不是Xcode6 Beta 目录下的:
ps -ef | grep lldb
501 3047 447 0 11:13PM ttys000 0:00.20 /Applications/Xcode6-Beta.app/Contents/Developer/usr/bin/lldb sample