最近更新于 2024-05-05 14:19
编译型语言这里就以 C 和 C++ 为例,解释型语言的话以 Python 和 Java 为例。
对于 C/C++ 程序,文本代码需要先经由编译器翻译为机器码,生成二进制文件,也就是一般说的可执行文件(Windows 下扩展名为 .exe)。而 Python 一般就是直接执行文本代码,Python 解释器会现场编译文本文件并由解释器进行执行; Java 程序一般会先编译一下,将文本代码转为字节码,字节码文件需要放在 JVM(Java 虚拟机)上进行运行。
因为 C/C++ 代码是直接编译为了机器码,所以是可以直接执行的。在系统环境下,由系统执行,如果没有系统,也能直接在硬件上运行,就比如操作系统本身,或者单片机上运行的程序。这种可以裸机运行的特性也决定了对于硬件资源的利用率高,程序运行性能也高。
而 Python 执行的是文本代码文件,在执行前需要现场编译为字节码然后由解释器解释执行。Java 算是半编译半解释的,虽然先编译为了字节码,但是始终还是需要借助 JVM 来解释执行。其实 Python 实际在执行中可能会看到出现了一个 __pycache__ 文件夹,Python 程序”首次“执行的时候,会将代码编译为字节码,就会保存在里面缓存起来,下次执行可以直接读取字节码文件解释执行,这一点和 Java 挺相似的。只是解释执行相比于 C/C++ 程序的编译执行,性能上就低了。
编译执行和解释执行当然也各有优劣,编译执行的程序可以裸机执行,性能是高,但是不同硬件的机器码指令是不同的,程序不能直接通用。把 Windows 下的程序放到 Linux 下就不能运行了,需要分别针对不同的平台编译可执行文件。而解释型语言,各平台都有发行的解释环境,代码文件或者字节码文件可以直接放上去运行,跨平台型更好。另外解释型语言调试也比较方便,代码编写或者修改后直接就能运行,而编译型语言需要先编译为可执行程序,才能运行。
打个比方,小明只会说中文,有一天他要去美国旅行,于是就雇佣了一个会说中文和英语的翻译,小明就可以间接和美国人沟通了,假如又有一天,小明想要去法国旅行,于是他雇了一个会说中文和法语的翻译,小明又能间接和法国人交流了。对于解释型语言,就类似于小明只会说中文,但是各个平台都发行了解释执行的软件,就对应小明可以雇佣会不同语言的翻译。小明只需要会中文,翻译会其它语言就行。代码不需要系统和 CPU 直接看懂,有系统和 CPU 能执行的解释软件,再经由解释软件充当翻译完成代码的执行就可以了。
上面说的算是一般情况,实际上也有可以让 C/C++ 代码解释执行的方案,让 Java 编译成二进制文件执行的方案,可能不是官方维护者搞出来的,但是总拦不住脑洞大开的。我想,让 C 语言解释执行的话,解释器主要做到编译器的功能就行了,将提前编译改为现场编译+执行。比如 Tiny C Compiler(tcc)就支持解释执行 C 语言。让解释型语言编译执行不是说的像 Python pyinstaller (https://blog.iyatt.com/?p=390)那种,pyinstaller 的操作是把解释器和代码打包到一起生成的可执行程序,并不是生成可以直接执行的机器码。我看过一种方案的实现是先进行语言转换,比如将 Java 转为 C 语言代码的实现,再用 C 语言的编译器编译生成可执行文件,整个过程由一个程序来自动化完成。
如果有兴趣深入了解,可以自行搜索查阅。