编程语言(1)—概览
文章目录
简谈C、C++、JAVA、Go、Python、Rust编程语言
C语言的特点
- 原生的linux系统调用,linux系统就是C开发的,提供的系统调用是C语言函数接口。使用C语言开发的程序原生的可以利用操作系统提供的系统调用接口,执行进程管理、IO等操作。也正是由于C语言支持原生的系统调用,让C语言称为最好的linux系统二次开发语言。glibc,pthread等基础库都是C语言开发。
- 高自由度的指针来操纵内存。程序的指令、对象、数据本质就是排列的一段内存。通过操纵内存可以实现1. 数据零拷贝,高性能 2. 对象随意转型,随意引用对象的子变量 3. 函数类型指针。高灵活度提高了编写优秀C语言代码的难度。
- 原生支持嵌入汇编语言。使用汇编语言能直接操纵CPU和寄存器,能不经由系统调用写出高性能的指令,例如设置CPU屏蔽中断。
- C语言缺点也很明显,没有封装,标准库功能少。
C++语言的特点
- 兼容C语言,好处是具备C语言兼容系统调用、高性能指针等特点,缺点是C++实际没有禁止高自由度代码。兼容C语言的后果是, C++的一切规则都不是强制的规则,例如C++提供了智能指针,但程序员完全可以用写C的样子写C++,裸指针满天飞。C++空有一堆规范,但不要求强制遵守的规范很难起到效果。CppCoreGuidelines
- C++ 类支持public、protected、private封装,继承,以及基于虚函数的多态。C++利用类的虚函数表和实例的虚函数指针实现了多态。C++ 还利用namespace 实现简单的包隔离。
- 包管理工具几乎没有。C++有cmake,bazel等较通用的编译工具,但至今没有通用的包管理工具。这是影响C++开发效率的重要原因,编译运行一个C++项目总是要在模块依赖上耗费大量时间。
- 标准库功能少。C++标准库主要有数据结构和算法库(STL)、标准IO库(基本没人用)、线程和同步库、智能指针库。没有常用的网络库、高级并发库(线程池,异步IO)、字符串处理库、文件系统IO库。这同样增加了C++开发的难度,重复造轮子现象严重。
我不太推荐使用C++开发大型项目,即使C++项目有较高的编码规范要求,但开发期间如果项目周期缩短,“下周上线”、“能用就行”,那程序员会充分利用C++的“自由”,代码质量基本不能看了。对于把代码规范和安全交给程序员还是编译器的问题,我选择交给编译器。C++孱弱的包管理工具也让C++工程一旦开发完毕,后续的重构升级都很困难,“牵一发而动全身”。
JAVA语言的特点
- 语言层对C++进行了扬弃,取消了指针,不需要手动管理内存。提供了全面的基础库,java.lang提供了字符串和线程类,java.util提供了容器类,java.io和java.nio提供了文件IO类,java.net提供网络类, java.util.concurrent提供并发编程支持。JAVA的基础库全面而有效,JAVA基础库的重复造轮子现象远远少于C++。
- JAVA类函数默认所有实例方法都是虚函数,支持多态,final、static、private方法除外。但滥用虚函数会带来性能开销。
- 反射和spring框架提供了JAVA对象集中管理的能力,即所谓的控制反转。spring框架强制让程序员按照模块化,将不同的功能模块切分(AOP,面向切面编程)。JAVA程序员无须管理对象的创建(生命周期),专注于如何将分散在各个业务逻辑代码中相同的代码通过横向切割的方式抽取到一个独立的模块中。依赖框架的缺点也很明显,缺乏灵活性。
- 主要缺点是配置文件复杂,maven作为包管理工具配置比较复杂(可用gradle代替)。
Go语言的特点
- 语言实现对JAVA进行了扬弃,舍弃了public,protect, private封装只支持package封装,舍弃了继承用组合代替,扩展了并发库语言原生支持协程、广泛使用context、channel进行协程间通信,支持指针但不支持指针运算,重新定义了接口(只要struct实现了接口的所有方法,那就认为它实现了接口),采用默认规则(文件名以 _test.go 结尾的文件被认为是测试文件,以大写字母开头的标识符包外可见、小写包外不可见,提供 gofmt 工具统一代码格式)
- 包管理简单,大型项目只需要执行go build就可编译得到二进制文件,大大提高效率。
Python语言特点
- 对象定义简单, 例如{}定义map, []定义列表, ()定义元组,简单几行代码就可完成功能
- 自带丰富标准库和庞大扩展库,尤其是数据/向量处理和机器学习算法库,如numpy, pandas, tensorflow, Matplotlib,lxml,python在数据处理和机器学习方面找不到语言替代者。
- 语法灵活,可简单可复杂。典型例子是装饰器,装饰器是一种函数修饰,用以减少通用代码。但装饰器被滥用,会严重降低代码可读性。python 函数参数没有类型检查,这导致直接从代码层面难以确定程序正确性,程序往往只有运行后才能知道问题(哪怕是很小的问题),加剧了“能用就行”的代码开发心态,同时降低了代码可读和可维护性。
- 虽然Python2已停止维护,但还有不少老项目还在使用python2,由于可维护性差,这些老项目难以迁移到python3。
Rust 语言特点
- 变量在默认不可变,有利于编译优化和可读性。
- rust 语法上避免内存逃逸和多线程数据竞争。例如,rust 堆上变量等价于C++的unique_ptr, 复制等价于unique_ptr的移动语义,即对象所有权和转移,不会出现内存逃逸。同一作用域rust只允许一个可变引用、不允许可变引用与不可变引用同时存在,避免发生多指针写导致数据竞争。rust对于可变引用的限制是要避免多线程状态的数据安全问题,通过增加代码编写的限制和难度,来避免运行时可能的数据竞争问题。rust指针不受所有权限制,只能在unsafe块中使用
- 具有Cargo包管理器
- TODO
本文标题:编程语言(1)—概览
文章作者:Infinity
发布时间:2024-11-25
最后更新:2025-01-11
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!