c++, java, python

C++, Java, Python

从大一开始学C,C++,大二学Java,后来自学python,那时候感觉各个语言就是语法的不同,也没有去深究为什么会有语言的差异,知其然而不知其所以然。

这几日偶然看到几篇关于这方面的介绍,并且自己也需要重新拾起编程的知识,故此记录。

静态类型 && 动态类型

这个问题将会影响到大型项目的开发问题,在知乎上有个较热的讨论,是关于youtobe用python写,导致后期开发和维护的各种不便利,其中一个重要的原因就是变量类型的问题。
对于C++和Java而言,变量类型是由代码编写的时候由程序员决定的。

1
int a = 0;

而对于python而言,定义变量时并不决定类型,而在运行时才会决定。

1
a = 'qwe'

由外部输入的变量则类型更难确定。

这样会导致编译器难以进行检测,也会给程序员带来一些麻烦。

总结一下

c++,java是静态类型,变量类型在编译时确定。

python时动态类型,变量类型在运行时确定。

内存管理

自动垃圾回收

对于编写代码而言,会将内存分为堆区(heap)栈区(stack)

stack的内存较小, 不需要程序员操心,编译器在进行局部调用的时候为函数变量和参数分配的内存,通常在函数执行完后就释放。

1
int a = 1;

直接用int是用的stack上的内存。

heap的内存较大,可以选择由程序员手动操控(C、C++),也可以自动操控(java、python)

1
2
int *a = new int[10];
delete[] = a; //如果不delete会在程序中一直占据内存

对于java和python而言,有自动垃圾回收机制,大大降低了程序员开发的难度。

这里有个缺陷是,如果保持对变量的引用但实际并没有用到这个变量,则这个“垃圾”仍不能回收。

虚拟机

这里的虚拟机和vmware的虚拟机有所区别。

c++直接将代码编译为机器码,对于不同的环境可能需要重新编译

Java将代码编译为”.class”文件

python将代码编译为”.pyc”

对于”.class”文件,拷贝到windows和linux上,只要有java的环境都可以直接运行

对于采用虚拟机的语言,反编译会是非常容易的,而直接编译为机器码的语言,反编译会非常困难。

三者对比

c++的性能问题

c++这样复杂的设计,各种值传递,引用传递,拷贝构造和移动构造等等花里胡哨的手段,都只有一个目的:为了性能。

c++比java快不是java必须运行在虚拟机上,java有了JIT(Just-in-time compilation 即使编译)优化后,性能已经逐渐接近c++。

更重要的原因是,只有c++支持手动管理内存并指定数据传递方式,故而糟糕的c++代码真不一定比Java快。

且对于项目而言,瓶颈往往并不是语言,代码的设计,项目的设计,数据库的读写,更有可能成为项目的瓶颈,与之相比,开发起来更省事的Java或者python会是更好的选择。

其他区别

一些语法的区别,数据传递方式的区别相比上述不是那么的关键,这里不再赘述。

总结

总的来说,对于程序员,c++,python,java都是应该了解和熟悉的语言,了解一门语言不是了解其语法那么简单,其特性,标准库等都是需要时间去掌握的。

这篇文章是自己这两日看一些大佬科普的总结,限于自身,难免有些不全面,不到位的地方,后续自己逐渐在这条路上越走越远,有更深的见解时,再回来重头更新。


参考:

[翰者学堂B站][https://b23.tv/av67326568]

[王金戈知乎专栏《编程之美》][https://zhuanlan.zhihu.com/p/82895086]