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