资讯专栏INFORMATION COLUMN

编程语言的心智负担

zhangke3016 / 1726人阅读

摘要:心智负担因此在中建议使用或函数代替宏。心智负担等编程语言,默认整数为有符号,降低了心智负担。而动态弱类型语言可能会因为重构或其他维护操作产生运行时错误,增加了心智负担。心智负担而且异步的等无需担心此问题。

很多编程语言对比的文章,总喜欢比较各种编程语言的性能、语法、IO模型。本文将从心智负担这个角度去比较下不同的编程语言和技术。因本人所擅长的编程语言有限,如有不对的地方,欢迎指正。

内存越界

如: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成对使用。申请的内存忘记释放,就会出现内存泄漏。心智负担:8

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

汇总

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29823.html

相关文章

  • 一位神经科学家对神经科学愿景与隐忧

    摘要:多种学科为神经科学做出贡献。对正常的心智功能如学习和记忆,以及异常功能如抑郁精神分裂和阿尔茨海默病,遗传学鉴定了与之相关的基因。 大脑的未来,在作者的描述之下,真是一个令人兴奋又令人担忧的未来。——蒲慕明我是一个神经科学家,也就是说,我在研究脑如何工作。就像其他许多神经科学家一样,我做这门学问,是因为我相信在分子、细胞和系统层次探索脑如何工作,我们可以对思维如何运作有些理解。对我来说,这是一...

    baukh789 评论0 收藏0
  • iOS知识梳理 - 关于Objective-C

    摘要:内存管理内存管理大体上有三类,开发者手动维护基于引用计数并提供一些机制解决循环引用自动垃圾收集。属于基于引用计数并提供一些机制解决循环引用的。我们知道,朴素的引用计数存在的问题是无法识别循环引用。同属这一流派的还有个的所有权机制。 作为早期的面向对象语言,且直到现在仍然为人们所熟知,Objective-C显然有其独到之处。这里对Objective-C的特点进行简单阐述。 动态?静态? ...

    megatron 评论0 收藏0
  • Objective-C内存管理(1)——内存管理概述

    摘要:基于某些机制实现半自动管理这里的某些机制其实通常就是引用计数。早年,选择的是退一步,完全让程序员来管理引用计数的加减,称为,显然管理成本偏高。 概述 应用程序开发中,内存管理是个重要的话题。简单而言,语言层面的内存管理基本有三类: 1. 纯粹的手动管理 如C和曾经的C++。 char *some_string = malloc(BUFFER_SIZE); // do something...

    zzbo 评论0 收藏0
  • 什么是好API设计?

    摘要:什么是我们只要是在进行编程我们就需要不停的设计。不易误用这一点很重要,要减少使用者的心智负担。尽量少的外部依赖减少使用者的成本。良好的命名尽量做到自描述。 什么是API? 我们只要是在进行编程我们就需要不停的设计API。 API简单来讲可以是一个调用的函数,一个接口。 抽象来说,接口是一个内聚系统暴漏给外部的一切信息,包含但不限于: 调用方式:比如通过lib库或者http接口等。 调...

    mudiyouyou 评论0 收藏0
  • 优秀工程师必备三大思维,你拥有哪些?

    摘要:本文整理自阿里巴巴高级技术专家至简在团队内部的个人分享,希望通过对工程师思维的分析和解读,让大家能正确对待那些在现实工作中看上去与本职岗位无关,却对团队效能影响极大的一些点和一些事。 showImg(https://segmentfault.com/img/remote/1460000017361737); 阿里妹导读:不同岗位、不同职责的技术人对工程师思维的深度要求是不一样的,但从多...

    Chaz 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<