nim與rust的特色比較
這兩個目前都是小衆語言,作了些時間的研究,寫了點東西有了點心得
類似點:
- 有衛生宏.區別與C++的(不衛生)宏
- 在類(struct或object)定義體以外定義函數
- 代碼沒有分紅頭與實現體.
例如ada的頭(ads)與實現(adb), C/C++的header(.h/.hpp)與定義(.c/.cc/*.cpp),java的接口定義與實現定義是分開的.而rust與nim是不分開的.
- 運用函數式編程.高階函數目前是新出現語言的標配了
固然rust用得更多些,也更方便些
- 內置異步執行功能(協程;好比goroutine/lua coroutine).
Rust:經過mio+tokio(事實上的標準), nim內置asyncdispatch+async系列庫,帶來更輕快的多任務能力
- 內置系統級線程,使用起來很方便
C/C++的線程使用起來真是一把淚.
- 變量/常量的類型定義與C/C++/JAVA不一樣,是後置的.這與scale/kotlin類似.
- 類型自動推導能力.
這功能在c++11/OCaml/haskell裏也有出現
- 可編譯成C或asm或js代碼
- 能編譯成wasm在瀏覽器裏執行
目前爲止,nim與瀏覽器結合的更緊密些
- 沒有GIL限制, 多線程能力不受限
- 有集成式的包(模塊)管理工具
nim:nimble; rust:cargo
用於初始化項目目錄,建立基本代碼,下載必需的模塊(包)等等功能
nimble起步晚些,功能上不完善點
不一樣之處:
- nim有GC, rust沒有.
nim聽說能夠不用GC,手動管理內存.目前還沒發現如何作到.
rust依賴ownship+lifetime+RAII類型的資源管理,受到編譯器的嚴密分析.
- rust編譯出來的可執行文件巨大,nim可執行文件至關小
- nim語法相似pascal與python的混合,rust接近c,有一小部分python+go的感受
- nim的OOP很主流, rust的OOP很另類要求作中層(框架級)設計的經驗必須豐富見多識廣.
rust概念艱深(不同凡響的ownship/borrow引出lifetime),入門門檻很高.另外方法重載(overload)用宏(macro)與模板(template)實現對習慣了其它語言的開發者也很難.最難的大概就是rust沒法繼承只能用相似接口(interface)的trait來組合實現多態.
PS:rust的宏系統還沒stable.目前正在從macro 1.1 向macro 2.0發展中.
- nim的後端略多些
有c, c++, js, llvm後端
- 社區
rust目前社區很大很活躍, nim 目前社區較小
- 成熟度
rust版本1.0以上,版本大約每半年小升級一次
nim版本仍然在0.19,還沒有正式達到1.0.
- FFI(外部接口)
rust能夠方便地與C標準接口結合(調用或者被調用), 與C++接口不行(C++自身的ABI比較亂)
nim特點:做爲一門正經的編譯語言,它能作到與C/C++/Object C結合是我目前爲止所知惟一.
PS:也就是說能夠作一個QT的adapter,從而能夠利用現有強大的QT作不少事...
其它總結:
- rust的[安全第一,裸金屬]理念,高性能,高入門難度使它看起來用於和C/C++同樣的基礎軟件/底層軟件場合,做爲C/C++的安全的升級版本很合適.
- nim,接近python的理念,pascal的語法,易用的自帶庫,容易與C或C++或object C結合的能力,看起來是python的升級版本很合適.非大型的快速開發一樣適用nim,作原型開發/輔助工具/數據ETL處理/文本處理/網絡爬蟲之類.
(自認爲)第五浪潮編程語言劃分
並非純以時間線爲劃分標準
第一批以fortran/cobol/ada/pascal/c,特色:純過程,編譯語言,運用於數值計算,事務處理與基礎軟件.ps:ada比較不一樣
第二批以C++/object pascal,特色:以繼承爲特色的OOP的流派,編譯語言,運用於框架/遊戲/GUI軟件
第三批以java/.net,特色:設計,語法與第二批類似但引入了中間碼與VM運行期,運用於web/web2.0
第四批以perl/python/php/ruby爲表明, 特色:腳本化,開發快速,框架簡單,腳手架完善.運用於運維,文本處理,數據ETL,非高併發大流量web/web2.0. ps:python有AI的偏向
第五批以scale/kotlin/swift/rust/nim爲表明,特色:(除rust外)在原有OOP的pattern大量結合了lisp/ML/haskell函數編程語言的函數式編程方法;(scale除外)既能以native方式直接運行也能以JS,wasm,中間碼爲後端運行;rust引入了OOP的另外一流派,而徹底拋棄了以繼承爲特徵的主流OOP,而用了以組合(trait)爲中心的OOP.php
rust概念艱深,不同凡響的ownship/borrow引出lifetime,入門門檻很高.另外方法重載(overload)用宏(macro)與模板(template)實現對習慣了其它語言的開發者也很難.最難的大概就是rust沒法繼承只能用相似接口(interface)的trait來組合實現多態