編程語言的心智負擔

不少編程語言對比的文章,總喜歡比較各類編程語言的性能、語法、IO模型。本文將從心智負擔這個角度去比較下不一樣的編程語言和技術。因本人所擅長的編程語言有限,若有不對的地方,歡迎指正。php

內存越界

如:C語言、C++(C with class)
C/C++能夠直接操做內存,但編程必需要面對內存越界問題。發生內存越界後,程序會直接core dump,開發者須要使用gdb工具分析內存錯誤的緣由,若是內存越界是偶發的,好比因爲數據同步問題形成,數億次中會出現一次,解決起來很是困難,甚至須要頂級專家才能找到問題緣由。編程

心智負擔:10服務器

現代C++提供了STL庫包含大量容器,另外C++支持引用語法,再也不須要直接操做指針,下降了內存錯誤讀寫的風險。使用現代C++的編程風格能夠避免此問題。但因爲C++沒有徹底從語法層面移除指針,不夠完全。多線程

C/C++程序中常用預約義宏實現一些邏輯,致使可讀性變差。有些狀況下會嵌套屢次宏的使用,展開後變得極其難讀。心智負擔:6異步

所以在C/C++中建議使用enumstatic 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會致使整個進程或線程掛起。極端狀況下會出現全部進程/線程掛起,引發線上服務不可用。開發者須要格外注意設置IO操做的超時時間,避免慢請求帶來進程/線程阻塞。心智負擔:2

並且異步IOGo/Node.js/Swoole等無需擔憂此問題。心智負擔:0

彙總

圖片描述

相關文章
相關標籤/搜索