2018年蘋果開源了自己的程式設計語言Swift,更厲害的是谷歌深度學習架構Tensorflow開始做Swift的接口了,這讓我似乎看到了Swift的光明前景。别的不說,單就MacOS和iOS上部署深度學習模型,就讓我很期待了。之前的深度學習模型可以采用蘋果出的SDK,但是模型有限,很難滿足各種需求,要将自己開發的深度學習模型放在MacOS和iOS上,需要用C/C++開發,然後混合編譯。現在Swift Tensorflow還在開源社群發展階段,不适合機器學習玩家。相信在不久的将來,我們在MacOS和iOS上開發就隻需要Swift一種語言就可以了,一顆賽艇……
1. 安裝Swift
廢話少說,先安裝,我的平台是Ubuntu 18.04,安裝Swift的版本是5.2.5。我平時是做深度學習算法的,現在在Ubuntu 18.04上面安裝的是tensorflow 2.3.0,cuda 10.1。
第一步,下載下傳Swift 5.2.5的壓縮包。
https://swift.org/download/swift.org
第二步,安裝依賴庫。雖然這裡需要gcc-5,python2.7,但我的是gcc-7.5.0, python 3.7,也沒啥問題。
apt-get
第三步,把解壓的Swift拷貝到/usr下。或者在.bashrc裡輸出一下Swift壓縮包的路徑到PATH變量。
第四步,測試一下,建立一個hello.swift,輸入以下代碼。
print
然後直接可以在指令行裡運作swift hello.swift,或者把它編譯成可執行檔案swiftc -o hello hello.swift。
2. VScode
VScode是微軟開源的一個代碼編輯器,是一個很好用的IDE。現在,我們把它改造成一個swift的IDE.
第一步,安裝npm和Node.js。下載下傳node.js 12.18.3,解壓後,cp到/usr目錄下。這可以覆寫原有的npm和node。
第二步,安裝VScode。官網下載下傳.deb檔案,sudo dpkg -i XXXX.deb即可。
第三步,在github上下載下傳sourcekit-lsp-master源代碼,并解壓。
https://github.com/apple/sourcekit-lspgithub.com
第四步,進入sourcekit-lsp-master/Editors/vscode目錄下,指令行輸入
npm run createDevPackage
搞到一半會報錯
Fetching vscode.d.ts from: https://raw.githubusercontent.com/Microsoft/vscode/431ef9da3cf88a7e164f9d33bf62695e07c6c2a9/src/vs/vscode.d.ts
Error installing vscode.d.ts: Error: connect ECONNREFUSED 0.0.0.0:443
原因是vscode的網址不是這個了。這時候,我們打開sourcekit-lsp-master/Editors/vscode/node_modules/vscode/bin/install檔案。将其中三處vscode.d.ts結尾的url位址,改為
https://github.com/microsoft/vscode/tree/master/src
将package.json的url改為
https://github.com/microsoft/vscode/package.json
然後重新運作
npm run createDevPackage
如果下載下傳不了vscode.d.ts,可以私信向我要。
運作結束後,會在sourcekit-lsp-master/Editors/vscode/out下生成vscode extension的檔案,在指令行輸入:
code --install-extension out/sourcekit-lsp-vscode-dev.vsix
搞定啦,趕緊在vscode裡import Foundation試試自動補全吧。
3. Debug
3.1 指令行調試。
在ubuntu上面debug swift,需要lldb,這個工具是随着swift Ubuntu發行檔案一起發行的,是以如果你安裝了swift就已經安裝了lldb。我們寫一個檔案main.swift,在指令行裡調試一個試試。
var
在指令行輸入
swiftc -g -o main main.swift
和gcc用法是不是很像?然後輸入
lldb main
就開始調試了。先輸入l看一下,附近周圍的代碼。
在第三行設個斷點
b 3
然後輸入r運作至斷點,輸入
p a
檢視變量a的值。然後輸入c,繼續運作至下一段點,因為我們就一個斷點,是以就把程式運作完了。輸入q退出。當然你也可以輸入指令全稱run(r), continue(c), list(l), breakpoint(b), print(p), quit(q)。是不是和gdb類似?
除了編輯單個檔案,我們還可以編譯Package,在你想建立Package的目錄下打開指令行,輸入
swift package init --type executable
然後就會生成一個模闆Package,在Source/swift下生成了一個main.swift的hello world檔案。我們在Package的根目錄下,輸入
swift build
就編譯了整個Package,然後生成一個./.build/debug/swift的可執行檔案。可以使用lldb ./.build/debug/swift進行調試,也可以使用swift run直接運作。
3.2 VScode中調試。
說一千道一萬,指令行調試肯定不如IDE裡調試友善。我們進一步改造VScode,讓它可以調試swift代碼。首先,要安裝CodeLLDB這個插件,直接在extension商店裡搜尋即可。CodeLLDB自帶了一個lldb,隻能用來調試C/C++程式,我們要把它設定成swift自帶的lldb。在extension裡找到CodeLLDB,然後點選齒輪按鈕,在設定裡有個lldb:library。
在這個對話框裡輸入/usr/lib/liblldb.so。如果你把swift沒有安裝在/根目錄下,做相應修改即可。
然後我們需要在項目根目錄下建立.vscode檔案夾,在.vscode裡面建立兩個json檔案,分别叫launch.json和tasks.json.
在launch.json裡輸入
在tasks.json中輸入
同理,如果我們沒有建立Package,隻是想編譯單個檔案,隻需要把launch.json中的"program"改成"${fileDirname}/${fileBasenameNoExtension}". ${fileDirname}就是編譯檔案的目錄。${fileBasenameNoExtension}就是要編譯的檔案無擴充名的檔案。例如main.swift的${fileBasenameNoExtension}就是main。
然後把task裡面的command換成swiftc,在後面加上一個"args"參數
"args"
這樣,我們在VScode執行Debug,就先會運作tasks.json指定的任務
swiftc -g main.swift -o ./main
随後會執行lauch.json中的任務
lldb main
然後我們就可以在VScode裡調試啦。
可以在左側的WATCH裡觀察變量,下方的DEBUG CONSOLE依然可以使用lldb指令。