在可执行程序的上下文中,“二进制文件”和“可执行文件”之间的区别在哪里?

Rob*_*rtS 14 language-agnostic executable terminology binaryfiles

我经常看到术语“二进制”和“可执行文件”似乎可以互换用于同一事物。

不是用两个术语来描述完全相同的事物吗?编译后的可执行输出程序,我可以在终端上运行吗?

什么加强了我的假设,这两个东西应该是相同的bin,在应用程序的安装文件夹中提供一个文件夹(“bin”作为“binaries”的缩写)是一种常见的做法,以存储可执行文件用户可以运行的文件。


我已经阅读了ndisasm 手册中提到的二进制文件和可执行文件什么区别?但问题和他们的答案更侧重于 Clang 和 ndasm 各自的环境。

我还在软件工程论坛上阅读了https://softwareengineering.stackexchange.com/questions/121224/what-are-binaries的问题和答案,但这里也没有区分可执行文件和二进制文件;只有一般的“二进制”一词可以指代:

但是,在Computing 中, Binary 指的是:

[来源:https : //softwareengineering.stackexchange.com/a/121235/349225]

其中,在编译过程的输出程序的上下文中,二进制文件与可执行文件相同,以及:

的二进制文件被用作产生一组文件的编译后基本上对象代码运行的机器上。(和虚拟机/运行时在 Java/.NET 的情况下)

[来源:https : //softwareengineering.stackexchange.com/a/121234/349225 ]

在那里它被称为相同。


  • 在可执行程序的上下文中,“二进制文件”和“可执行文件”有什么区别?
  • 区别在哪里?

kay*_*ya3 27

可执行文件是可以执行的;您可以通过将文件本身的名称写入命令来在命令行上运行它。在 Unix 系统上,还必须设置文件的“可执行”标志。在 Windows 上,文件的扩展名必须是一组固定的可执行文件扩展名之一,包括.exe.

二进制文件是一个简单地以二进制(即,非文本)格式。二进制格式意味着文件的内容不应因特定于平台的原因而被转换(例如,从\nto替换换行符\r\n)。

二进制文件不一定是可执行的,例如编译为.dll.so形式的库是二进制文件但不是可执行文件。编译为.class.jarform 的Java 程序不是可执行文件,但可以使用 commandjava -jar program.jar而不是 command 运行./program.jar

可执行文件不一定是二进制文件,例如文本形式的 Python 脚本可以通过编写shebang 行 #!/usr/bin/python3并设置文件的可执行标志在 Unix 系统上执行。


MSa*_*ers 5

它有助于理解这里术语“二进制”的上下文。它起源于编译器,编译器获取程序的(基于文本的)源代码,并将该源代码转换为二进制而非基于文本的可执行形式。因此,在编译器的上下文中,“文本”和“源代码”是等效的,“二进制”和“可执行文件”也是等效的。另一方面,解释器不区分源代码和可执行代码。

随着时间的推移,中间表示的情况肯定会变得更加复杂,例如 Java JVM、.Net 的 CLI 或 Python 字节码所使用的中间表示。

  • @kaya3:嗯,.DLL 采用可移植可执行格式(PE),因此从某种意义上来说它是“可执行的”。更复杂的是,“GetBinaryType(filename)”将检查文件是否为 PE 格式,但对于 DLL,它返回 FALSE (0)。其中一种情况是名称与功能不匹配。 (3认同)
  • 值得注意的是,即使只是针对 C++,编译器的输出也不一定是可执行的,例如共享库可以编译为“.dll”或“.so”文件。如果我们考虑 C++ 以外的其他语言,那么例如 Typescript 编译器的输出是 Javascript 代码,它是文本而不是“源”代码。 (2认同)