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 | int *a = new int[10]; |
对于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]