25th
为什么程序无法同时在 Linux 和 Windows 下运行?
程序要想运行,必须从外部存储(比如硬盘)加载到内存中,保存在外部存储中的程序叫做「可执行文件」,把可执行文件加载到内存中的过程称为装载,是由装载器实现的。Linux 下的可执行文件使用的是一种叫 ELF(Execuatable and Linkable File Format)的文件格式,中文名叫「可执行与可链接文件格式」,Windows 下的可执行文件使用的是一种叫做 PE(Portable Executable Format)的文件格式。Linux 下的装载器只能解析 ELF 格式,而 Windows 下的装载器只能解析 PE 格式,所以同一个程序无法同时在 Linux 和 Windows 上直接运行。
不能直接运行,但是有间接的方式。比如 Java,通过实现不同平台上的 JVM,然后即时翻译 javac 生成的字节码来做到跨平台。使得程序员无需关心操作系统的差别,做到一次编译,处处运行。
再比如 Linux 下著名的开源项目 Wine,就是通过兼容 PE 格式的装载器,使得我们能直接在 Linux 下运行 Windows 程序的,当然,因为很多程序还依赖各种操作系统本身提供的动态链接库,系统调用等等,需要 Wine 提供对应的实现,兼容格式只是万里长征第一步。而现在微软的 Windows 里面也提供了 WSL(Windows Subsystem for Linux),是在 Windows 下运行的一个 Linux 子系统(有点类似于虚拟机,但是比虚拟机轻量级地多),可以解析和加载 ELF 格式的文件。
Last updated
Was this helpful?