Translation - 起底 SourceKit

For more, please visit my GitHub repo: github.com/kingcos/Per…html

做者 發表時間 原文連接
JP Simard 20140706 www.jpsim.com/uncovering-…

爲了支持一門奇特的新編程語言(譯者注:即 Swift),漂亮的實時 IDE 特性,以及使人印象深入的跨語言協同性(譯者注:即 Swift 與 Obj-C),Apple 不得不開發一些新的底層工具。這裏咱們將專一於 SourceKit,Xcode 背後的功臣。ios

SourceKitSidekick 暫時披着披肩

什麼是 SourceKit?

SourceKit 是一套工具集,使得大多數 Swift 源代碼層面的操做特性得以支持,例如源代碼解析、語法高亮、排版(typesetting)、自動補全、跨語言頭文件生成,等等。git

架構

傳統上,Xcode 在運行時跑着其編譯器(Clang),即意味着編譯器將可能在任什麼時候候崩潰,IDE 一樣。github

Xcode 架構示意圖

更有甚者,Xcode 容易喚起編譯器進行成千上萬次解析、高亮、以及排版源代碼,全部這一切都在用戶鍵入「⌘ + B」以前。這是由於不像大多數編輯器(Vim/Sublime/...),Xcode 並不使用正則表達式解析源代碼,而是使用 Clang 強大的(也更加複雜的)解析器(parser)和標記器(tokenizer)。正則表達式

慶幸的是,Xcode 6 中的 Swift 移除了該特性1,合併全部源代碼操做特性至一個獨立的進程,並和 Xcode 經過 XPC 交流:sourcekitd。不管 Xcode 6 什麼時候加載任何 Swift 代碼,該 XPC 守護進程將被啓動。macos

若是每次出現如圖狀況時 Xcode 都會崩潰,生活將變得痛苦不堪

Xcode 如何使用 SourceKit

由於 SourceKit 是一個私有且無文檔的工具,咱們須要得到一些小點子來學習如何使用它。經過設定 SOURCEKIT_LOGGING2 環境變量,Xcode 將記錄 SourceKit 與 stdout 間的通訊,容許咱們觀察到它們的實時通訊。這就是如何發現本文中的許多命令。編程

統一符號解析

SourceKit 藉助 Clang 中稱做 USR(Unified Symbol Resolution,即統一符號解析)的特性,爲源代碼令牌(token,例如類,屬性,方法等)對應一個惟一標識符。這使得你可使用 「⌘ + 點擊」Xcode 編輯器中任何一處令牌,便可以導航至其定義處。USR 如今甚至更增強大了,能夠跨語言(Swift/Obj-C)統一一個表明。swift

運做中的 USR

爲了從一個 Swift 文件(以及其位置)中打印 USR,你能夠運行如下命令:xcode

$ xcrun swift-ide-test -print-usrs -source-filename=Musician.swift
10:7 s:C14swift_ide_test8Musician
14:9 s:vC14swift_ide_test8Musician4nameSS
19:9 s:vC14swift_ide_test8Musician9birthyearSu
33:5 s:FC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_
33:10 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4nameSS
33:24 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_9birthyearSu
34:9 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4selfS0_
34:21 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4nameSS
35:9 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_4selfS0_
35:26 s:vFC14swift_ide_test8MusiciancFMS0_FT4nameSS9birthyearSu_S0_L_9birthyearSu
複製代碼

Swift 頭文件生成

在 Swift 中使用「⌘ + 點擊」一個定義在 Obj-C 中令牌,Xcode 將會觸發生成一個類 Swift 頭文件。稱其爲類 Swift 是由於該生成的文件並不是有效的 Swift3,但至少顯示了等效於 Obj-C 令牌的 Swift 語法。bash

左:原始 Obj-C 頭文件,右:SourceKit 生成的類 Swift 版本

在命令行使用 SourceKit

主要有 3 個命令行工具容許和 SourceKit 交互:sourcekitd-testswift-ide-test,以及 swift

筆者編譯了一個帶有文檔的 Shell 腳本,其運行了許多有用的命令,例如:語法高亮,接口生成,AST 解析,還原(demangling)等。

該腳本可在 GitHub 中得到:GitHub Gist

第三方使用 SourceKit 的工具

由於 SourceKit 獨立於 Xcode 以外,使其能夠利用以構建從 Swift IDE 到文檔生成器等任何東西。

Jazzy♪♫

jazzy 是一個命令行工具,能夠爲你的 Swift 或 Obj-C 項目生成文檔。其利用 SourceKit 以得到從 Obj-C 定義令牌(例如類,屬性,方法等)的 Swift 語法。

SwiftEdit

SwiftEdit 是一款支持 Swift 文件語法高亮的概念型編輯器。

SourceKit 與你

咱們剛剛初探了使用 SourceKit 的可能。這些工具能夠作出來處理跨語言代碼覆蓋,或者提供支持 Swift 和 Obj-C 同時編輯的編輯器。但願本文能啓發你利用 SourceKit 開發一些什麼,並在這過程當中改善咱們的工具。

  • 注:
    1. Obj-C 在 Xcode 6(Beta 2)中徹底沒有使用 SourceKit,仍保留了 Xcode 傳統的運行中 Clang 架構。我預計在 Xcode 6 GM 前能有所改變。
    2. 爲了 SourceKit 打印日誌,使用如下命令啓動 Xcode export SOURCEKIT_LOGGING=3 && /Applications/Xcode6-Beta2.app/Contents/MacOS/Xcode
    3. 猜想:我預計一旦編程語言擁有訪問控制機制,私有 Swift 模塊暴露公有接口將使用類似的語法。

Reference

相關文章
相關標籤/搜索