如何阅读 Swift 标准库中的源码
在进行完 GYP 预处理后,阅读 Swift 标准库源码的 如果你想要开始阅读 Swift 源码,那它的标准库应该是首先开始阅读的地方。标准库中的代码是和每一个使用 Swift 的开发者都息息相关的,如果你也曾经对某个 API 的表现和性能有过怀疑,那么直接阅读对应的源码会是解决问题最快的方式。 标准库也是 Swift 项目中最容易接触的地方。其中一点理由是,它由 Swift 写的,而不是 C++。因为你每天都用它,所以对它的 API 也非常熟悉。这就意味着,在源码中找到你想要的那段代码不是特别困难。如果你只是没有目标随便看看,那么在源码中你可能会发现一或者这两块金子。 在哪里能找到标准库的源码?标准库的代码在
我们不希望看到 太多的 GYB,而更想要 Swift 代码,因为它更具有表达性,但是现在,我们不得不面对它们的混和。 处理 GYB如果你只想要阅读源码(而不是向 Swift 贡献代码),GYB 则弊大于利。那么怎么来预处理这些文件呢?你可以直接运行 更新: Toni Suter 指出 bash #!/bin/bash for f in `ls *.gyb` do echo "Processing $f" name=${f%.gyb} ../../../utils/gyb -D CMAKE_SIZEOF_VOID_P=8 -o $name $f --line-directive "" done 它会把所有的 从源码编译 Swift环境的搭建可以阅读 Swift 仓库中的 readme。 如果在 Mac 机器上,按照下面的步骤进行操作(使用 Homebrew 安装各种依赖),但是别忘记检查这些步骤的正确性: bash # Install build tools brew install cmake ninja # Create base directory mkdir swift-source cd swift-source # Clone Swift git clone https://github.com/apple/swift.git # Clone dependencies (LLVM,Clang,etc.) ./swift/utils/update-checkout --clone 最后一句命令会把 build Swift 需要的其它部分的 repo 给 clone 下来,比如 LLVM,Clang,LLDB 等等。就像对于 Linux 的 Foundation 和 libdispatch 模块一样。在这一步过后,你的 bash du -h -d 1 250M ./clang 4,7M ./cmark 47M ./compiler-rt 15M ./llbuild 197M ./lldb 523M ./llvm 221M ./swift 26M ./swift-corelibs-foundation 7,8M ./swift-corelibs-libdispatch 1,1M ./swift-corelibs-xctest 316K ./swift-integration-tests 960K ./swift-xcode-playground-support 7,0M ./swiftpm 1,3G . 现在就可以开始运行 build 脚本了,它会先开始 build LLVM,然后构建 Swift: bash ./swift/utils/build-script -x -R 参数是很重要的:
Orienting yourself当 build 构建完成后,你可以在 不幸的是,在 Xcode 中使用 Open Quickly (??O) 打不开特定的 API. 我通常使用 Find in Project (??F) 来进行导航。如果你使用只出现在函数定义时的字符串来搜索,那就很容易搜索到了。比如要搜索 你也可以运行 更新如果你想在以后更新本地的 clone,重新运行 bash ./swift/utils/update-checkout ./swift/utils/build-script -x -R 这些都是增量编译,比第一次要快得多。 切换到指定的版本如果你想要验证一个在生产环境中已经使用的 Swift 特定版本 API 的表现,你就需要查看那个版本的 Swift 代码,而不是当前 master 分支。但是简单地切换分支并不能解决问题,因为如果一些依赖的版本对不上的话,编译是会失败的。
bash # Either ./swift/utils/update-checkout --tag swift-3.0-RELEASE # or ./swift/utils/update-checkout --scheme swift-3.0-branch swift-3.0-RELEASE tag 和 swift-3.0-branch branch 的区别是,tag 相当于一个 mailstone,代表 Swift 的某个特定的 release 分支。然而分支是会伴随着 bug 修复和功能改进不断更新的。现在来看,在官方 release Xcode 8.1 的 Swift 3.0.1 时,swift-3.0-branch 分支已经包含了一些 Swift 3.0.2 中的修复。 不幸的是,我发现
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |