致程序員,這門編程語言不輸 C/C++!
打開今日頭條,查看更多精彩圖片2018 年,開發者們有很多優秀的編程語言可供選擇,光是主流語言就有十幾種。本文介紹一個小眾但十分強大的語言Nim。
以下為譯文:
2018年後半年,開發者們有很多種編程語言可供選擇。光是主流語言就有十幾種,它們都非常優秀。但如果再探索一番,就會發現另外一些語言,如Elm、Elixir、PureScript和Reason——之後你就會發現Nim。
有一次我在UI開發庫中看到介紹說,「我們支持Go、Rust、Nim等多種語言。」真酷……等等,Nim是啥?出於好奇,我嘗試了一下。
通過幾個一次性例子、舊項目重寫等嘗試,我認真探索了這個語言究竟能幹什麼。結果,五個月之後,這門語言仍然在吸引著我。
1.快速介紹Nim
我們來做個簡單的命令行應用,作為本文後面的討論對象。首先要安裝Nim(https://nim-lang.org/install.html)獲得工具鏈。接下來先mkdir fun,然後cd fun,再創建一個文本文件wave.nim。
內容如下:
# this is wave.nim
const hand* = ""
創建另一個文件hello.com然後粘貼下面的代碼:
# this is hello.nim
import wave
echo "Hello World " & hand
然後開始編譯!
$ nim c hello.nim
在我的筆記本的Ubuntu上大約花了175ms。接下來運行:
$ ./hello
Hello World
這個二進位文件很快(2ms)、很小(107 kB),而且沒有依賴。
2.靈巧且強大的編譯器
我們給編譯器提供了入口點(hello.nim),它就自己通過源代碼找到了依賴(wave.nim)。如果同一個目錄下還有第三個文件,這個文件不會被包含進來,除非我們用import語句導入。
我們沒有寫main()函數,但也生成了可執行文件!
但Nim的強大不止於此。運行nim c --app:lib wave.nim可以生成動態鏈接庫,運行nim c --app:staticLib wave.nim還可以生成靜態庫。
Nim支持Windows、macOS和Linux,還支持一些其他平台,如樹莓派和任天堂Switch。設置好之後,交叉編譯也能做到,但與Go相比還差得多。說實話,目前我還沒見到在構建方面能超過Go的。
3.Nim可編譯成C、C++和Obj-C
Nim在可執行文件里塞了一堆函數和常量,包括文件輸入輸出、可配置的垃圾回收器,這些都帶來了額外開銷。
但這並不是老掉牙的垃圾回收器。其演算法有六種選擇,每次激活的時間預算也有供選擇。而且它並不像其他語言的垃圾回收器那樣「只要有需要」就運行,對於只用一次的腳本,你甚至可以關閉垃圾回收。
而且,我們編譯成了調試模式。調試模式包含強大的棧跟蹤和其他幫你調試的東西。試試用這個命令編譯:nim c -d:release hello.nim,尺寸變成89kB了。好點了吧?加上另一個編譯開關後還可以進一步用速度換尺寸。nim c -d:release --opt:size hello.nim,現在只有44kB了。是不是效果好多了?
但C編譯器更快!沒錯,因為Nim其實是編譯成C的!然後再用gcc或clang將C代碼編譯成二進位文件。還記得我們編譯時的命令是nim c hello.nim嗎?這裡的C代表的是編譯成C,而C是默認的後端語言。
此外,它還能編譯成C++和Obj-C,也能夠使用相應語言生態系統中的工具了(如代碼覆蓋和調試器等)。
4.所以Nim是個不錯的膠水語言?
當然,這是Nim的強項之一。
它能使用imgui、SDL、Redis等庫,能使用靜態庫,也能鏈接OpenSSL等動態庫。它的語言特性能處理名字修飾、命名空間、鏈接等,甚至可以在Nim中以字元串的形式輸入C代碼,編譯器也可以正確處理。還有個工具c2nim幫你實現自動轉換,實現跨平台或跨語言!
最不可思議的是它還能編譯成JavaScript:
$ nim js -d:release hello.nim
$ node nimcache/hello.js
Hello World
這樣就編譯成JavaScript了。
5.為什麼我沒聽說過Nim?
原因之一:
- Rust:由Mozilla資助;
- Swift:由蘋果資助;
- Go:由Google資助;
- TypeScript:由微軟資助;
- Kotlin:由Jetbrains資助;
- Nim:??
正確答案是,嗯,我也不知道。大公司和大型社區很有錢,雖然Nim沒有那麼大的資助,但也在受到越來越多的關注。我認為它的優秀之處在於,雖然是草根,但卻擁有不遜於主流語言的功能。
6.了解更多
下面是一大堆可以看看的URL,也可以自己去Google。
官方
- 網站:項目入口
- https://nim-lang.org/
- 源代碼:GitHub項目地址
- https://github.com/nim-lang/nim
- nimble:Nim包管理器
- https://github.com/nim-lang/nimble
- choosenim:工具鏈安裝
- https://github.com/dom96/choosenim
社區
- 論壇:非同步的討論組
- https://forum.nim-lang.org/
- Twitter:Nim的Twitter賬號
- https://twitter.com/nim_lang
- Reddit:subreddit社區
- https://www.reddit.com/r/nim/
- IRC:irc.freenode.net上的#nim
- https://irclogs.nim-lang.org/
學習
- 文檔:一大波文檔和教程
- https://nim-lang.org/documentation.html
- Nim實戰:Manning Press出版的一本書
- https://www.manning.com/books/nim-in-action
- 介紹視頻:Dominik Picheta的介紹
- https://www.youtube.com/watch?v=hzxr9_ZK9uY
發現
- nimble directory:nimble的Web前端
- https://nimble.directory/
- Awesome Nim:精選項目
- https://github.com/VPashkov/awesome-nim
- Github項目:開源項目,按照最近更新時間排序
- https://github.com/search?l=Nim&o=desc&q=nim&s=updated&type=Repositories
編輯器
- Vim插件:使用Vim編寫Nim
- https://github.com/zah/nim.vim
- VS Code插件:Visual Studio Code插件
- https://github.com/pragmagic/vscode-nim
寫一些應用
- Jester:寫Web訪問
- https://github.com/dom96/jester
- Karax:寫單頁應用
- https://github.com/pragmagic/karax
- NiGui:寫GTK+ 3 / Win32桌面應用
- https://github.com/trustable-code/NiGui
- Winim,wNim:寫Windows應用
- https://github.com/khchen/winim;https://github.com/khchen/winim
- objc:寫macOS應用(開發中)
- https://github.com/mjendrusch/objc
- android:寫安卓應用
- https://github.com/yglukhov/android
- Arranmancer:寫深度學習應用
- https://github.com/mratsim/Arraymancer
- serial.nim:寫串口應用
- https://github.com/euantorano/serial.nim
- libusb:寫USB應用
- https://github.com/nimious/libusb
- Ethereum 2.0:寫以太坊……額……之類的(我只能猜到這裡了)
- https://github.com/status-im/nimbus
這門語言很有意思,但更有趣的還有待你自己去發掘。
原文:https://totallywearingpants.com/posts/nim-underdog/
作者:Steve Kellock
譯者:彎月,責編:郭芮
※亞馬遜科學家將人工智慧助理日常化的夢想照進現實
※世界首個 AI 公園誕生;馬化騰:養活 QQ 最痛苦|極客頭條
TAG:CSDN |