C++|编程语言优劣,零基础转行如何选择编程语言( 二 )



C++支持强制类型转换 , 如果转换前后的内存结构不一样 , 很有可能导致各种隐性问题 。 还有Java之类非原生语言的异常处理都是语言自定义的异常 , 而C和C++中的异常很多都是操作系统层的异常 。
Windows下一个简单的try catch , 你觉得可以抓到try中所有的异常 , 但是由于异常处理函数的指针保存在栈上 , 这时一个栈溢出可能直接导致异常处理函数指针被覆盖 , 异常会出现在你意想不到的地方 。 微软有大神曾说过 , 想你的代码后续可维护就删掉代码中所有的try catch 。
又由于语言非常底层 , 当程序出现底层崩溃的时候 , 想解决掉这个崩溃往往要读一些汇编 , 这时候如果使用了大量的模板 , 比如stl和boost , 那生成的汇编几乎完全不可读 。 看过stl代码的人应该都知道这玩意儿写的有多晦涩 , 就导致了你想用一个C++库 , 如果不了解这个库的实现原理 , 那大概率会出错 。
C++的复杂度又让你很难真的理解那个库的原理 , 结论就是C++强大 , 但是必须用的人也强大 。 C++直到现在还在疯狂的增加特性 , 我用了四五年我自己都不敢说自己会玩C++ , 能用其他语言就优先考虑其他的 , 把C++作为最后的选项 , 不建议新手学 , 除非你的目标领域必须使用 。
Rust
Rust是为了解决C和C++的各种问题而出现的语言 , 性能接近C++ , 通过所有权限 , 不用垃圾回收就解决了生命周期管理 。 有包括管理 , 又有极其严格的编译期检查 , 能编译通过的代码就不会有大问题 , 编译器直接把水平不够的新手挡在了门外 , 通过解决出问题的人是方式 , 从根本上解决了C++的问题 。

我第一次用rust写个小程序就跟编译器较了一天的劲 。 它的缺点就是学习难度太大 , 语言太小众 , 库太少 , 很多轮子都要自己造 。 但是随着微软之类的大厂使用 , 相信之后发展会比较好 , 新项目如果需要C或者C++可以有限考虑rust 。
Java
我现在主要也是一个Java程序员 , 对于Java这个语言我并没有什么很特别的感觉 , 配套设施完善 , 什么都能干 , 体验非常赞 , 就是内存占用有点难看 。 想搞安卓考法的必修 , 阿里有大量的服务器项目使用Java 。

唯一想吐槽的是gradle这个构建系统 , 版本问题搞得很头疼 。
JavaScript
js是前端的必修课 , 没得选 , 然而node让js也万能了 。 用node做过后端项目后 , 感觉动态类型语言还是不太适合 , 由此带来的低级错误很多 , 虽然可以用typescript解决 , 但是最终还要编译成js , 无法直接调试 。 由于没有原生的多线程支持 , 利用cpu也智能通过开多个进程的方式 。 小项目的后端做着玩还可以 , 大点的还是考虑Java或者是go吧 。
Lua

Lua是极其轻量的语言 , 语言特性接近js , runtime非常小 。 作为一个脚本语言 , 性能出色 , 内存占用低 , 很适合各种嵌入式设备或者插件系统 。
Go

这玩意儿一定是谷歌为了解决自己后端项目中遇到的问题而开发的语言 , 各种特性直戳痛处 。 语法简单 , 规范严格 , 这就让不管什么水平的开发写出来的代码差距都不会太大 。

静态类型 , 没有默认参数 , 没有异常处理 , 可以降低犯低级错误的概率 。 编译成原生代码 , 可内嵌C代码 , 原生支持协程和多线程 , 可以保证性能 , 支持跨平台编译 , 输出单文件方便部署 , 这些优点带来的问题是Go的指向性太强 , 只适合做高并发api类的后端服务 。
想用Go开发其他任何领域都会觉得特别别扭 , 类似C的语法过于简单 , 又没有泛型 , 导致很多功能都显得很啰嗦 。 但由于Go解决了部署问题 , 跨平台问题 , 降低了研发人员的水平要求 , 降低了犯错误的概率 。
关于这些语言的性能没有绝对的排序 , 但根据我做项目带团队和面试的经验 , 绝大多数的程序员的水平都还碰不到语言的性能瓶颈 。 一般来说对语言的理解以及多线程 , 算法 , 网络 , 数据库 , 缓存 。 硬件甚至业务的理解都比语言的性功能影响更大 。


推荐阅读