不少編程語言對比的文章,總喜歡比較各類編程語言的性能、語法、IO模型。本文將從心智負擔這個角度去比較下不一樣的編程語言和技術。因本人所擅長的編程語言有限,若有不對的地方,歡迎指正。php
如:C語言、C++(C with class)C/C++
能夠直接操做內存,但編程必需要面對內存越界問題。發生內存越界後,程序會直接core dump
,開發者須要使用gdb
工具分析內存錯誤的緣由,若是內存越界是偶發的,好比因爲數據同步問題形成,數億次中會出現一次,解決起來很是困難,甚至須要頂級專家才能找到問題緣由。編程
心智負擔:10服務器
現代C++
提供了STL
庫包含大量容器,另外C++
支持引用語法,再也不須要直接操做指針,下降了內存錯誤讀寫的風險。使用現代C++
的編程風格能夠避免此問題。但因爲C++
沒有徹底從語法層面移除指針,不夠完全。多線程
C/C++
程序中常用預約義宏實現一些邏輯,致使可讀性變差。有些狀況下會嵌套屢次宏的使用,展開後變得極其難讀。心智負擔:6異步
所以在C/C++
中建議使用enum
或static inline
函數代替宏。編程語言
如:C語言、C++函數
C/C++
語言,須要手工管理內存,malloc/new
申請的內存要與free/delete
成對使用。申請的內存忘記釋放,就會出現內存泄漏。心智負擔:8php-fpm
Java/PHP/Go
等有GC
的編程語言,不須要手工管理內存,不會由於代碼錯誤引發內存泄漏。心智負擔:0工具
C/C++/GO
等編程語言,提供了有符號、無符號整型和浮點型,8/16/32/64
不一樣尺寸的整型。編程時須要額外處理,避免數值溢出。心智負擔:6性能
PHP/Java
等編程語言,默認整數爲有符號int64
,下降了心智負擔。通常業務項目中很難有超過2^63
的數字,不會遇到問題。但若是是作科學計算,int64
就難以知足需求了。在PHP
中超過2^63
底層會轉爲浮點型,計算將丟失精度。心智負擔:1
而Python
整數是不限長度的,能夠作任意位數的數值計算。心智負擔:0
Java
是靜態強類型編程語言,所以在編程中存在類型約束,某些狀況下可能不是特別方便。如JSON
序列化。不一樣類型的變量互相操做時可能須要進行顯式類型轉換。心智負擔:2
PHP/JS
是動態弱類型編程語言,底層自動進行隱式類型轉換。編程更方便。心智負擔:0。
在大型項目,或對已有系統進行代碼重構,以及項目代碼更換開發者時,弱類型動態語言會帶來可維護性的難題。Java/Go/C++
這樣的靜態強類型編程語言在編譯期就能夠發現問題。而動態、弱類型語言可能會由於重構或其餘維護操做產生運行時錯誤,增長了心智負擔。心智負擔:5
Java/C++/Go
提供了多線程並行編程、無鎖編程,在編程中會存在數據同步問題。所以須要對臨界資源進行加鎖。而錯誤的鎖操做又會帶來,死鎖和熱點爭搶問題。須要開發者具有極高的素質,不然難以作到正確無誤並性能良好,這可能須要耗費大量心智。心智負擔:10
除PHP(php-fpm)
以外的其餘編程語言和技術(包括PHP + Swoole
),在服務器端程序中均爲長生命週期。對全局/靜態變量操做可能會致使內存或資源句柄泄漏。編程時須要注意。心智負擔:3
而PHP(php-fpm)
是短生命週期的,在請求結束後會當即釋放全部內存和句柄,無需擔憂泄漏。心智負擔:0
同步阻塞IO
模型的編程語言和技術,在遇到某個慢IO
會致使整個進程或線程掛起。極端狀況下會出現全部進程/線程掛起,引發線上服務不可用。開發者須要格外注意設置IO
操做的超時時間,避免慢請求帶來進程/線程阻塞。心智負擔:2
並且異步IO
的Go/Node.js/Swoole
等無需擔憂此問題。心智負擔:0