以下比較的基礎都是基于一種編程語言+一定的第三方或者自己編寫的網絡庫和底層進行的,Skynet稍微特殊,但總體比較合適放到比較中來
C#
開發效率:Windows下可以通過VisualStudio進行開發,其他平臺可以使用MonoDevelop,非常方便
運行效率:JIT的性能優化比較到位,能適應90%性能環境
部署便捷性:可以通過交叉編譯生成其他平臺的可執行文件,通過mono運行可執行文件
調試便捷性:VisualStudio和MonoDevelop調試均很方便, 還可遠程調試
上手度:對C系語言熟悉的幾天就可上手
熱更新:可以通過DLL方式進行
Web對接:可做,代碼比較啰嗦
崩潰處理:可通過try catch捕獲錯誤
網絡庫編寫難度:一般,需注意gc問題
第三方網絡庫及框架數量:一般
Golang
開發效率:高
運行效率:并發上非常有優勢,對CPU利用率比較高,原生運行無虛擬機
部署便捷性:一次編譯到處運行,無任何運行庫依賴
調試便捷性:實際操作中,單線程掛接調試器可行, 但變量顯示不正確,開發期基本采用日志方式進行查錯
上手度:語言簡單,特性少, 新手1周能貢獻代碼
熱更新:無法進行熱更新,語言無法編譯為DLL,也不支持DLL加載(linux平臺的.so加載忽略不計)
Web對接:非常方便, 代碼精簡
崩潰處理:崩潰后以命令行方式打印出棧,程序內可以捕獲任何崩潰錯誤并繼續運行
網絡庫編寫難度:簡單,比C socket更簡單
第三方網絡庫及框架數量:偏少
Skynet(lua+C)
開發效率:基于動態語言的開發初次寫比較快,后期維護和重構會耗費一定的時間在查錯上
運行效率:基于lua jit的運行效率還是能接受的
部署便捷性:方便, 只有底層修改需要重新編譯, 大部分時間只用更新lua文件
調試便捷性:不是很方便,基于日志方式進行查錯
上手度:lua語言特性有部分和C系語言有一定差異,基于Actor模型的思想學習,適應需要耗費一定的時間
熱更新:類似于Erlang,可精確到函數級的熱更新
Web對接:有一些http支持,通過社區慢慢進行完善
崩潰處理:lua天生可以捕獲錯誤
網絡庫編寫難度:自帶,無需編寫
第三方網絡庫及框架數量:通過社區慢慢完善
C++
開發效率:編譯慢,文件多,通用庫少
運行效率:native速度標桿
部署便捷性:編寫各類的make門檻較高
調試便捷性:可通過VisualStudio進行Windows平臺調試
上手度:2~3年經驗的熟手仍然會寫出崩潰和泄露代碼
熱更新:可通過DLL進行
Web對接:代碼啰嗦,第三方庫少
崩潰處理:Windows下可使用SEH捕獲段異常,其他平臺只能通過崩潰后進行coredump分析,容錯非常差
網絡庫編寫難度:基于asio編寫較為簡單,但總體看來難度不低
第三方網絡庫及框架數量:較多
以下是得分
從發文時的項目對這些語言使用率來說,Java,Erlang,C++編寫的服務器較多,Golang,JavaScript,C#是第二梯隊,Skynet由于上手不是很容易,所以僅有兩位數的團隊在使用,但總體表現還是比較出色的
對于老團隊, C++的服務器工具鏈和框架已經相對成熟, 完全沒必要更換新語言, 只是在對接sdk感覺困難時,可以嘗試Golang這些對web有優勢的語言進行混合語言開發
對于新團隊,開發效率,上手度和部署效率是優先選擇的,C#,Golang,JavaScript這些新興語言會讓你事半功倍
對于大規模無需選服的服務器, Skynet的actor模型對擴展會比較容易
對于大公司,好項目,上線后需要通過熱更新進行bug修補的,C#,C++,Erlang會是首選
但總的一點, 還是根據團隊熟悉度來選擇語言,貿然的使用新語言的風險也是很大的