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

Where is the difference between "binaries" and "executables" in the context of an executable program?

提问人:RobertS supports Monica Cellio 提问时间:1/20/2020 最后编辑:RobertS supports Monica Cellio 更新时间:6/23/2023 访问量:25548

问:

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

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

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


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

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

但是,在计算中,二进制是指:

  • 二进制文件,由人类可读文本以外的内容组成
  • 执行文件,一种二进制文件,其中包含供计算机执行的机器代码
  • 二进制代码,文本和数据的数字表示

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

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

二进制一词用作一组文件,这些文件是在编译在机器上运行的目标代码生成的。(以及 Java/.NET 的虚拟机/运行时)

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

它被提及的地方。


  • 在可执行程序的上下文中,“二进制文件”和“可执行文件”之间有什么区别?
  • 区别在哪里?
与语言无关的 可执行二进制 文件 术语

评论

13赞 Ctx 1/20/2020
binaries并且是具有一些重叠的不同集合。二进制文件是可执行文件。perl 脚本也可以是可执行文件,但不是二进制文件,mp3 文件是二进制文件,但不是可执行文件。executablesls
0赞 RobertS supports Monica Cellio 1/21/2020
@Ctx 那么,程序或脚本的输出永远是可执行文件,但不一定总是二进制文件?
1赞 Guy Coder 1/21/2020
我知道这会让你更加困惑,但也应该帮助你意识到什么时候给出了一个好的答案。请参见:MS-DOS exe2bin 换句话说,我们这些自 1970 年代以来一直在编程的人都知道历史原因。
0赞 aka.nice 1/22/2020
从计算机 POV 来看,每个文件都是二进制的。最相关的区别是文本文件与非文本(二进制)文件。文本文件包含以某种众所周知的二进制格式编码的字符...呃,现在有很多可能的编码!ASCII CP1250 UTF8 UTF16...区别在于旁观者的眼中(因此与上下文有关)。

答:

48赞 kaya3 1/20/2020 #1

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

二进制文件只是二进制(即非文本)格式的文件。二进制格式意味着不应出于特定于平台的原因(例如,将换行符从 to )转换为文件的内容。\n\r\n

二进制文件不一定是可执行的,例如,编译为或形成的库是二进制文件,但不是可执行文件。编译为或形成的 Java 程序不是可执行文件,但可以使用命令而不是命令来运行。.dll.so.class.jarjava -jar program.jar./program.jar

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

5赞 MSalters 1/20/2020 #2

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

随着时间的流逝,使用中间表示(例如Java JVM使用)肯定会变得更加复杂。Net 的 CLI 或 Python 字节码。

评论

2赞 kaya3 1/20/2020
值得注意的是,即使仅针对 C++,编译器的输出也不一定是可执行的,例如共享库可以编译为 or 文件。如果我们考虑 C++ 以外的其他语言,那么例如 Typescript 编译器的输出是 Javascript 代码,它是文本而不是“源代码”。.dll.so
2赞 MSalters 1/20/2020
@kaya3:嗯,.DLL是可移植可执行文件格式(PE),所以它在某种意义上是“可执行的”。为了让事情变得复杂,将检查文件是否为 PE 格式,但它返回 DLL 的 FALSE (0)。名称与功能不匹配的情况之一。GetBinaryType(filename)
1赞 Georgios Douzas 10/27/2022 #3

这取决于定义。所有文件都包含二进制代码,“工作”定义如下:

  • 二进制或文本文件

    • 文件的二进制代码对文本进行编码:文本文件

    • 文件的二进制代码不对文本进行编码:二进制文件

  • 可执行或不可执行文件

    • 可执行文件:可执行文件

    • 无法执行的文件:不可执行的文件

因此,二进制文件和可执行文件是正交属性,即任何文件都可以以独立的方式具有它们,也可以不具有它们。一些例子:

  • 二进制可执行文件:Windows中的.exe文件,MacOS中的.app文件(不是单个文件,而是捆绑包)等。
  • 文本可执行文件:Python 脚本、bash 脚本(需要相应的 interprenters)等
  • 二进制不可执行文件:PDF 文件、音频文件等
  • 不可执行的文本:C++ 源代码、Markdown 文件等
1赞 greim 6/23/2023 #4

这是很久以前就不再有意义的计算怪癖之一,但到那时已经在技术术语中得到了巩固。

编译语言一直具有文本的、人类可读的、不可执行的形式,它被编译成二进制的、非人类可读的、可执行的形式。

在解释型语言广泛使用之前,在二进制媒体文件格式被常规使用之前,可以理解为什么“二进制”会成为“二进制可执行编译器输出”的简写,以及为什么包含这些文件的目录被称为“bin”。

此外,可以理解为什么像 shell 或 python 脚本这样的可执行文本文件(尤其是当它们位于 bin 文件夹中时)有时被称为“二进制文件”。

TL;DR:“二进制”可以表示“不是文本文件”或“可执行文件”,或两者兼而有之。你必须使用上下文线索来整理混乱。