浅谈后端语言优缺点

兄弟连教育在前不久,回答了一个关于后端语言选型的问题,那么后端语言都有哪些,存在什么样的优缺点?因此兄弟连与大家分享一下心得。

语言优缺点

C/C++

C 语言虽然是非常贴近操作系统的语言,能和操作系统API很好的交互,但是C语言并没有现代化工程开发所需要的面向对象功能,当然也缺乏泛型之类的功能,如果以CGI的形式开发,那么缺点非常明显,这也是第二代后端平台兴起的原因。

C++ 具有现代化工程开发所需要的各种功能,但是它同样有缺点:

缺乏字符串处理,Web开发最主要的就是字符串的处理,所有的一切几乎都要和字符串打交道,但是C++最差的就是字符串处理,只有std::string这个标准库提供的字符串类。用过的基本都知道,这是所有语言中最差的字符串类,缺乏方便的UTF-8支持,缺乏正则表达式匹配,几乎什么都缺。

缺乏 Web标准的支持,我这里说的标准是指语言层面上对HTTP协议的支持。Web是基于HTTP协议和TCP协议产生的,TCP协议控制了如何传输,HTTP协议定义了浏览器和服务端如何通信。而C++极度缺乏这方面的支持,如果需要做非CGI开发,只能自己手工处理Socket通信。

缺乏 HTTP框架和业务代码之间的交互标准,框架就算完成了HTTP通信部分,也没有一个标准规定框架如何和业务代码交互。不过,实际上C++框架是实现自己的交互流程。但是缺乏规范则是框架稀少的原因。

这三点主要的缺点非常明显的,所以社区都没兴趣给写基于 C++的Web框架,就算有也是小打小闹。

Java

Java 的效率相对于C/C++这种手动管理内存的语言来说是低的,哪怕使用了引用计数,C/C++也能把Java甩出N条街。但是Java相对于其他脚本语言来说优势非常明显

强类型、编译型语言,这点就使得 Java在效率远超动态类型语言,而且在编译时就能发现bug,不需要等到运行时再去调试,现在的很多IDE也能做静态语言分析,不需要编译就能发现语法错误,这就能提升效率。

Java SE 规范,这就让Java能像C/C++一样贴近操作系统,自由处理网络相关、IO相关的内容,功能很强大。

Java EE 规范,完善的规范使得Java后端发展有了很好的规范基础,统一的环境。规范让框架和业务代码有了交互的标准(Servlet脱胎于Applet,结果Applet没什么卵用,反而Servlet得到了极大的发展)。

Java 有着最完善的生态链,无论是框架还是编译工具链,模块系统做的非常棒,现代工程所需的各种设计模式都有着很好的实践。除了Java以外,JVM上面还有着更多的语言可以选择。

当然,Java本身也有很多缺点:

编译型语言开发效率慢

想要上手开发业务容易,但是想要真正懂得 Servlet和框架如何运行就难了。

语言本身也存在着很多缺点,比如将 C那里继承过来的类型又重新封装了一次,一些新颖的技术没能第一时间引入,比如Lambda这样的到了1.8才引入,甚至有人说说,Java什么都好,除了语言本身。但是它至少比市面上其他语言更能接受。

本身的规范和不够灵活也导致了代码本身很难优化,好的代码和差的代码在一套规则的束缚下实际上性能并没有多少差距,更多的优化被交给了 JVM

PHP

PHP 作为一门脚本语言,本身运行效率确实不是很高,但是在PHP7平台上,PHP培训已经算是脚本语言中比较高的了,而且在现有的硬件平台上,PHP本身的效率基本不会成为瓶颈。它作为一门脚本语言也有着很多优势:

天生的模板语言,不需要学习其他的模板语言,提升了开发效率,也提升了运行效率。(比如 CodeIgniter,就大部分框架来说,使用PHP作为模板语言能提升效率,但是像Laravel这种能对模板编译缓存的另算)

上手容易,生态链也很不错,LAMP、LNMP这样部署的技术可以说是烂大街了,基本没有学习成本

缺点:

解释型语言,不能常驻内存,巨大的缺陷。

缺乏好用的包管理和命名空间,也缺乏好用的模块系统(Composer另说)

Node.js

Node.js 作为目前比较火热的语言,确实有它的独到之处,这里先列举它的优点:

事件循环 +异步IO,这让它在高并发的情况下能大显身手。

JavaScript 易上手,有着活跃的社区和很多的第三方库

常驻内存简直不要太好

可用的模块系统

天生跟 Docker有缘

前端使用 JavaScript,学习Node.js能做到全栈开发

缺点:

也是 JavaScript,JavaScript是基于原型的语言,从严格上来说并没有真正面向对象,这样也让JavaScript在编写业务代码的时候极为困难。

混乱的语言规范,现在并行着 ES5、ES6、ES7,需要Babel这样的工具帮忙

在服务端上只存在 CommonJS模块系统,但是在规范上来说则有很多,准确来说这并不是一个很大的问题,可以忽略

ES5 愚蠢的回调产生的回调地狱,但是ES6解决了这个问题,准确来说也不是什么大问题。

Swoole

Swoole 跟Node.js很相似,相比Node.js它在语言层面上比JavaScript更加规范好用。但是它存在两个缺点:

文档!文档!文档!重要的事情说三遍。

单纯的 Swoole扩展基本不能用,必须依赖Swoole框架,所以。。。文档!文档!文档!问题还是文档

后端语言除了java_浅谈后端语言优缺点相关推荐

  1. 关于c语言的教学方法,浅谈C语言实例教学方法

    摘要:分析C语言程序设计课程的特点:探讨如何在C语言程序设计实验教学中采用科学的实验教学手段,培养学生的学习兴趣,提高学生用C语言解决实际问题的综合能力:对C语言程序设计实验教学提出一些可行的探索方法 ...

  2. c语言函数调用参数调用的太少,浅谈C语言函数调用参数压栈的相关问题

    参数入栈的顺序 以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左.参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入 ...

  3. c程序语言的常量变量和标识符,浅谈C语言中的常量与变量.pdf

    课程教育研究 CourseEducationResearch 2014年4月 上旬刊 教学.信息 浅谈C语言中的常量与变量 刘 星 (青 岛工学院商学院 山东 青岛 266300) [摘要]在任何一种 ...

  4. c语言 去掉双引号_技术分享|浅谈C语言陷阱和缺陷

    良好的软件架构.清晰的代码结构.掌握硬件.深入理解C语言是防错的要点,人的思维和经验积累对软件可靠性有很大影响.C语言诡异且有种种陷阱和缺陷,需要程序员多年历练才能达到较为完善的地步.软件的质量是由程 ...

  5. c语言结构共用体的作用,浅谈C语言共用体和与结构体的区别

    共用体与结构体的区别 共用体: 使用union 关键字 共用体内存长度是内部最长的数据类型的长度. 共用体的地址和内部各成员变量的地址都是同一个地址 结构体大小: 结构体内部的成员,大小等于最后一个成 ...

  6. 浅谈go语言交叉编译

    浅谈go语言交叉编译 基础 cgo cgo设置编译和链接参数 静态库和动态库 静态库 动态库 静态编译 cgo的内部连接和外部连接 internal linking external linking ...

  7. 分三种情况C语言编程,浅谈C语言教学的现状及几点建议.doc

    浅谈C语言教学的现状及几点建议 浅谈C语言教学的现状及几点建议 摘 要 针对C语言教学中存在的问题提出建议,以期对C语言教学有一定帮助. 关键词 C语言:课程设置:创新能力 中图分类号:G642 文献 ...

  8. c语言乐学编程作业答案,信息乐学|浅谈C语言

    原标题:信息乐学|浅谈C语言 一大波C语言的干货正在靠近 刚刚成为大学生的小萌新们,经过两个多月的学习,你们对大学的多彩生活是否还满意?全新的学习方式你们是否还适应?然而,新鲜劲还没过,第一件让你们头 ...

  9. 浅谈C语言内存(栈)

    浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...

最新文章

  1. Ubuntu 修改时区和时间
  2. wordpress中安装插件需要ftp服务怎么破
  3. 使用Grunt构建任务管理脚本(转)
  4. python初学者代码示例_python实现手势识别的示例(入门)
  5. C++----练习--string输入输出
  6. win10个人壁纸默认保存位置
  7. oracle小黑书,通读《C++ primer plus》—浅谈数组
  8. 硬盘(U盘)被误格式化(删除),重要的文件如何恢复?
  9. PMP第六版 十五至尊图
  10. SECS/GEM 基本概念介绍
  11. JS设计模式-单例模式
  12. java中的g1_G1GC 概念与性能调优
  13. 龙芯3U板卡学习资料第706篇: GEC-2K1000 龙芯3U板卡
  14. 计算关联系数matlab,matlab相关系数计算公式
  15. MATLAB强化学习-appdesigner使用
  16. ios SDWebImage 加载图片流程
  17. 魔兽争霸3地图(WarIII Maps):妖皇传说
  18. 单片机tcp ip协议c语言,单片机上简单TCPIP协议的实现.PDF
  19. Mybatis java.lang.ExceptionInInitializerError at xxx.test (已解决)
  20. 陈晨博士|可见光通信LiFi技术简介

热门文章

  1. STM32 Free RTOS实战
  2. C++ CRC16计算方法
  3. jmeter 性能测试 --- 并发、负载、压力
  4. 财务会计6---股东权益项
  5. 导航,头部,CSS基础.
  6. 2017幼儿园计算机培训,2017幼儿园
  7. LVS负载均衡内功心法+外功招式
  8. 每日学术速递2.17
  9. Caffe图片特征提取(Python/C++)
  10. 考研数据结构之线性表(1.7)——练习题之A和B两个顺序表中相同元素组成一个新的从大到小的有序顺序表C的算法(C表示)