编程语言的心智负担

不少编程语言对比的文章,总喜欢比较各类编程语言的性能、语法、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

汇总

图片描述

相关文章
相关标签/搜索