前言
要了解三种语言的运行过程,我们先要知道什么是源代码、目标代码、机器码;什么是编译、解释以及什么是静态语言、动态语言。如有不对的地方,欢迎小伙伴们指出来,我会及时进行更正!也欢迎各位小伙伴在评论区进行讨论~
什么是源代码、目标代码、机器码?
源代码就是程序员直接编写出来的代码。
目标代码是源代码经过编译器或汇编器处理后生成的中间代码,它是由特定的指令集和格式组成,并不能直接在计算机上运行。
机器码是计算机可以直接执行的二进制指令。它是由0和1组成的二进制数,对应于计算机硬件的指令集。目标代码需要通过链接器将其与其他目标代码以及库文件等链接在一起,最终生成可以在计算机上运行的可执行文件,这时候才会将目标代码转化为机器码。
什么是编译、解释?
举个例子,小明想去书店买《哈利·波特》,有两种选择,一是买中文版的《哈利·波特》,另一种选择是买英文版(假设他爸妈为了方便他学习英语给他配了一个英语翻译老师)。
如果买了中文版,那他就不再需要原版的《哈利·波特》,而且可以一次性读完中文版,甚至也不需要英语老师进行解释,如果买了英文版,那这个时候英语翻译老师的工作就是一边阅读《哈利波特》的英文版的同时一边解释给小明听。
上述的例子中,出版《哈利·波特》中文版的翻译者就是编译器,而英语翻译老师就是解释器。所谓编译,就是将源代码一次性转换为目标代码,也就是一次性翻译,之后就不需要源代码。所谓解释,就是将源代码逐条转换为目标代码,同时逐条运行,运行时随翻译随执行,是需要源代码的!(不然英语翻译老师对照什么讲述呢?)。
什么是静态语言、动态语言?
静态语言就是使用编译器执行的编程语言,动态语言就是使用解释器执行的编程语言!
有了上面的知识基础,我们再来看看 C++、Java、python运行过程的对比!
C++的运行过程
- 编写C++源代码,保存为
.cpp
文件。 - 使用C++编译器(
gcc
、clang
等)将C++源代码编译成机器码,生成可执行文件。 - 运行生成的可执行文件。
Java的运行过程
- 编写Java源代码,保存为
.java
文件。 - 使用Java编译器(
javac
)编译Java源代码,生成字节码文件(.class
)。 - 使用Java虚拟机(Java Virtual Machine,JVM)加载字节码文件,并执行。
注:字节码文件不能直接执行,因为它包含了Java虚拟机(JVM)能够理解的指令和结构,而不是直接CPU可以执行的指令。因此,需要JVM作为中间层解析并执行这些字节码指令,她会将字节码翻译成可以执行的机器码!当然它也提供了其他很多功能,比如内存管理,垃圾回收、异常处理等,Java就是通过JVM提供的一致性接口才使Java程序具有跨平台性的!
为什么要有JVM,是不是多此一举? 别忘了,Java的诞生,本身就是为了解决不同平台上的差异性的~~
Python的运行过程
- 编写Python源代码,保存为
.py
文件。 - 使用Python解释器执行Python源代码,即时解释并执行。
三者的区别和联系
Java | C++ | python | |
语言设计和语法 | 静态类型语言 | 静态类型语言 | 动态类型语言 |
编译和解释 | 编译型语言 | 编译型语言 | 解释型语言 |
平台依赖性 | 通过JVM实现跨平台 | 针对不同平台需要不同编译器 | 不同平台 |
性能 | 次之 | 最高 | 较低 |
注:这个性能对比结果是因为C++在编译时会经过一系列优化,而Java和Python会在运行时进行一些额外的解释、优化等操作。