慕课君

V1

2022/09/29阅读:20主题:极简黑

GO、Java、C/C++、Python,这些编程语言谁才是王者?

最近我加入了一个使用Go语言的项目组。由于此前对Go语言的了解还停留在理论认识的阶段,没有大型项目的经验,加入这个项目组让我算是真正体验了一把Go语言,职业技能树也更加丰富了起来。

Go语言的很多语言特性让人耳目一新,而最让我感到震撼的莫过于Go语言服务开发流程的简单便捷,通过Go Build出来的二进制文件,发布到服务器后,直接就可以运行。

相比C/C++语言出来的二进制文件来说,无需管理一大堆依赖、处理各种动态库、静态库等等的问题,且C/C++语言的开发流程,如果是和性能平台相关的程序,光是开发环境、编译环境就能够折腾个人几天,相比之下,Go语言的开发流程让人感觉舒服。

当然了,我也不是无脑鼓吹Go语言,在Go语言的使用过程中也有一些不解和疑惑,为此也专门横向地对比了一下自己熟悉的语言:Java、C/C++、Python,主要是后台的语言。

开发环境

就开发环境而言,Go语言是最让人省心的;当然Java也很省心,只需要在本地和生产环境分别安装了JDK,其他基本和Go类似了,Java由于JVM中间层可以随处运行,Go的二进制可能需要根据二进制平台重新编译,但是现在主流的平台基本都已经统一了Linux版本,所以Go语言二进制我目前是没有遇到需要分别编译的情况。

C/C++、Python的开发环境就有点一言难尽了,先说Python,虽然Python使用简单,但是长久依赖历史版本2.x和3.x相互不兼容以及各种依赖包的问题,也是让很多开发者感到困扰,虽然有pyenv等环境治理的工具,为混乱的环境治理隔离出一片宁静之地。但是,只能说没有对比就没有伤害。

再说C/C++,由于是和平台强相关的语言,所以就链接库、路径、符号表等等,都和底层操作系统的关联更加密切一些,对开发者的要求也相对更高,但即使是优秀的开发者,也时常得被C/C++搞得焦头烂额,特别是涉及对别人的依赖的时候,由于编译时的平台、依赖等等,部分函数的符号信息不一致、菱形依赖等问题是最难搞定的,大型的C/C++项目需要强大的专业的团队进行环境治理。

运行性能

性能这个老生常谈了,其实就现在的开发而言,服务对性能的要求已经没有前辈们的那个时代那么高了,此前看过小时候玩的那些马里奥、魂斗罗等的游戏的实现,看他们是如何把图片素材、逻辑压缩到128k、64k的卡带内存里面,真的是精益求精。

今天就服务而言,即使对于大流量的服务,往往在追求极致性能和成本之间,更多的会选择扩服务、加机器来支撑起相关容量的服务;当然,不是说性能不重要,而是说在今天,性能的问题已经可以从更高的维度或者说从更多的维度解决了。

就具体语言的性能,没有对C/C++、Go语言的进行过压测,但从原理上来说,两者相差应该不大,而对于Java、Python,两者都有虚拟机,但是Python是解释型语言,Java虽然是由中间层,但是也有JIT技术的加持,性能也是更上一个台阶,但Java的GC问题和Stop The World的机制,也使得一些服务不会选择Java。

横向对比来说,各种语言就开发环境、运行性能而言,都有他们的特点,也各有长处、各有短板。这也使得这些语言在不同场景下,会有不同的使用频率。

Java、Python、Go、C/C++这几门语言,主要的应用都在后端开发这里,虽然后端开发是一个比较明确的方向,但也依然可以有很多细分的领域,不同领域常使用的语言也依然有很大的差别。

对于不同的岗位,写之前专门看了慕课网的首页,慕课网首页做了非常详细的划分,这个分类对当前行业的划分也是非常准确的。

上面提到的Java、Python、Go、C/C++这几门语言,主要的应用也都在后端开发这里,虽然后端开发是一个比较明确的方向,但是在后端开发里,也依然可以有很多细分的领域,不同领域常使用的语言也依然有很大的差别。

Web后台

最常见的,也是大学时期常做的后端开发的工作,大部分都是Web开发,也即是面向数据库增删改查,编写接口的业务逻辑,向上承接前端(Web、安卓、iOS、H5等)的请求,完成数据组装并返回,兼顾性能的考虑,加入缓存层、分库分表等设计。

在Web后台,Java、Python都是常使用的语言,其中尤以Java见长,这与Java的生态相关,Java以及Web生态的Spring Boot、MyBatis等,已经成为中小企业Web开发必不可少的技术栈,在企业招聘岗位当中,对Java这一类的技术要求也是最多的。

其次是Python,虽然Python有丰富的Web框架支持:Flask、Tornado、Django等等,但做小网站还行,用Python做大型项目的不多,早年Python Web技术的经典案件——知乎,因为性能,一些核心的服务,也已经改成Go。Python的Web多见于一些访问量不大的网站,比如一些运营平台、活动平台等。

微服务

微服务是近几年火起来的概念,随着云技术的不断成熟,现在都提倡把大服务拆成微服务,通过服务注册、服务发现来完成调用链关系,兼顾云的动态伸缩来实现无状态服务的扩容缩容,也已经是比较成熟的技术了。

在微服务里面,Java也是用得比较多的,Spring Cloud已经为微服务环境提供了非常多的功能齐全的工具,上手便捷,开箱即用;但由于JVM进程本身的消耗,在一些使用微服务架构里面的关键模块,为了减少资源的使用和调度的成本,依然会使用C/C++来实现,通过通用协议对外提供服务。

微服务在这里提及,和Web后台这些不完全是并列的关系,微服务是架构,本身是不含逻辑的,Web后台也可以通过微服务架构来实现,因而在这需要强调下,这里主要是针对微服务生态提到Java Spring Cloud,Java提供了比较完备的微服务生态。

中间件

中间件是一个比较大的概念,在这里把与业务无关的服务统一视为中间件服务,常见的比如消息中间件。

中间件的开发工作在大厂也都被认为是后台开发;对于中间件,Java也是最常见的语言,Go语言也比较常见;其实中间件的存在主要依托于生态环境,一个开发的生态环境只有足够的复杂,也才需要中间件的存在,所以这也解释了为什么Java、Go才是最常见的语言。

存储服务

存储服务,如数据库、文件系统、kv存储等,主要是使用C/C++。

因为存储服务和操作系统、硬件设备是强相关的,所以这项工作也只有C/C++容易胜任;在存储服务的实现过程,大量的系统调用、系统参数调优,在实际开发的时候还需要看相关的内核源码,所以天然C/C++是最适合的;当然了,也有使用Go语言的也有一些,这主要是在开发效率和性能之间做的取舍。

云基础设施

云基础设施到今天基本是Go的天下了,依托kubernetes,今天非常多的云基础设施使用的都是Go语言,在资源调度、资源隔离等方面,Go都有非常成熟的使用。要说资源调度,本来Go语言就没多少年,现在的云基础设施为什么会成为Go的天下?

在早年Google Big Table论文大行其道的时代,Hadoop、Yarn是进行大数据平台资源管理调度的核心,不过那个时候也只有大数据平台平台需要这么多的资源,那时候的容器都是交给yarn托管的;后来docker技术出现、成熟,再到容器编排、kubernetes,Go语言也成功夺位,成为云基础设施里面最常使用的语言。所以,今天我们看到的腾讯云、阿里云这么丰富封装对外的产品,在它们的背后,都一定有Go语言与其相关的服务在支撑着。

工具平台

工具平台多指测试、运维等的平台,在实际场景中也有着非常核心的作用,对于这种工具平台,不要求很高的性能,但是一般会有很多临时性的需求,整体的规划也更模糊一些,对于这种场景,Python这种短平快的语言就很排得上用场,所以Python多见于这些工具平台的实现里面。

最后,关于编程语言,除了语言本身的生态,团队的技术栈也是影响你选择语言的重要原因,在有选择的情况下,还是需要根据大的生态做出更好的选择,对的语言做对的事情,事半功倍。

作者:咚咚呛

简介:

全栈工程师,目前就职于BAT的大数据部门,超过4年的技术研发经验,熟悉java、python研发,担任过多个系统研发主程,目前专注于分布式系统研发,在高并发、分布式系统有丰富的经验

- END -

分类:

后端

标签:

后端

作者介绍

慕课君
V1