机器语言、二进制代码和二进制文件的区别

31
我正在学习编程,在许多资料中我看到了“机器语言”、“二进制代码”和“二进制文件”这些概念。对我来说,这三者之间的区别不太清楚,因为据我理解,机器语言是计算机可以理解的原始语言,即由0和1组成的序列。
现在,如果机器语言是由0和1组成的序列,而二进制代码也是由0和1组成的序列,那么 机器语言=二进制代码 吗?
那么二进制文件是什么?真正的二进制文件是什么?对我来说,“二进制文件”这个词意味着一个由二进制代码组成的文件。例如,如果我的文件是:
010010101010010
010010100110100
010101100111010
010101010101011
010101010100101
010101010010111

这会是一个二进制文件吗?如果我谷歌“二进制文件”,并查看维基百科,我看到这个二进制文件的示例图片使我感到困惑(它不是二进制的?....)

Hex image

我的困惑出在哪里?我是否混淆了文件编码或其他的东西?如果我要求别人向我展示什么是机器语言、二进制代码和二进制文件,他们会是什么?=)我想这种区别对我来说太抽象了。

谢谢任何帮助! =)

更新:

例如,在Python中,有一句话在文件I/O 教程中,我不明白:以二进制格式只读打开文件。读取二进制格式的文件意味着什么?

4个回答

32

机器码和二进制是相同的——一个以2为底数的数字系统,只有1或0。但是机器码也可以用十六进制(hexadecimal)格式表示——一个以16为底数的数字系统。二进制系统和十六进制密切相关,很容易从二进制转换为十六进制,并且从十六进制转换回二进制。而且因为十六进制比二进制更易读更实用,所以经常被使用和显示。例如,在你问题中上面的图片中——使用的就是十六进制数!

假设你有二进制序列1001111000001010——它可以通过分组成块(每个块包含四位)轻松地转换为十六进制。

 1001 1110 0000 1010 => 9  14 0 10 which in hex becomes: 9E0A. 

可以认为9E0A比二进制更易读,而图像中看到的是十六进制。


2
现代计算机是用十六进制、二进制或它们的组合以及其他方式来编写的吗? - Honinbo Shusaku

11

对于我所寻找的信息,我感到有些惊讶,回过头看,我猜这个帖子的标题并不完全适合OP所问的问题。

你们都说“机器码是一堆数字”。

当然,“CODE”就是一堆数字,但人们想知道的是(我猜) “实际上发生了什么?”

在编程方面,我只是一个新手,但我足够理解并且很自信可以“粗略地”回答这个问题。

对于实际电路来说,机器码不是数字或值。 机器码是一堆电压门,它们要么打开要么关闭,根据它们连接的内容,某种灯在某个特定时间会闪动等等。

我猜“机器码”规定了特定电信号的路径和时间,以达到其整体目标。

因此,对于010101,3个电压门是关闭的(0),3个是打开的(1)。

我知道我接近正确的答案,但我也知道它要复杂得多——因为我能想象我不知道的东西。

010101 对于一个简单电路来说是易于理解的指令,但我无法开始理解复杂电脑是如何处理所有信息的。

所以我想我们来分解一下?

x位处理器告诉我们处理器可以同时处理多少位。

一个比特要么是1,要么是0, "开"或 "关"

因此,32位处理器可以同时处理这么多位,“10101010 10101010 10101010 10101010”。

处理器是“集成电路”,就像一个紧凑的电路板,包含电阻器/电容器/晶体管和一些内存。我不确定处理器是否有电阻器,但我知道通常会在电路板上实际处理器周围找到很多电阻器。

无论如何,晶体管是一个开关,所以如果它接收到1,它会向一个方向发送电流,如果它接收到0,它会向另一个方向发送电流...(或者类似于这样)

因此,我想像对于机器码来说...处理器接收到的代码段会改变电压通道,从而向计算机的另一部分发送信号(为什么你认为处理器有那么多引脚?),可能是更专门用于特定任务的另一个集成电路。然后该集成电路接收到一块代码,例如2到4位的01或1100之类的代码,进一步定义了信号最终目的地的位置,可能直接返回到处理器,或者可能发往某些输出设备。

机器码是将电路连接到灯泡并进行切换的非常有效的方法,然后将该灯泡从电路中取出并将电路切换到不同的灯泡中。

计算机中的存储器非常必要,否则要使计算机执行任何任务,您需要逐个输入所有信息(以机器码的形式)。相反,所有的1和0都存储在某个存储设备中,可以是带有磁头针的旋转硬盘,根据磁盘的电荷来“读取”1或0,也可以是使用一系列晶体管的闪存器件,发送电压会引出1和0(我不完全了解闪存如何工作)。

幸运的是,有人想出了一种不同的编程基数系统(十六进制),以及将这些数字(翻译)编译回二进制的方法。然后所有软件程序都从那里衍生而来。

键盘上的每个键创建一个特定的二进制信号,将一些开关打开或关闭,并使用特定的电压,以便在屏幕上的特定单个像素上运行电流,从而创建"1"或"0"或"F"或本帖子中的所有字符。

因此,我想知道,程序如何“编程”,或者说如何让计算机“执行”某些操作...或者说编译器如何编译与二进制不同的代码程序呢?

由于我现在非常疲惫(所以不会尝试),而且几乎所有在计算机上进行的操作都是由某些程序完成的,因此现在很难思考。任务管理器中有正在运行的程序(进程)。它们使您的计算机屏幕保持您习惯的外观,并允许屏幕像对待真实物体一样被操纵。(它们并不是真实物体,只是图片,甚至您的鼠标指针也是如此)。 (好了,我结束了。已经足够编辑和延长我的思路,该睡觉了)
另外,我真正无法理解的是计算机是如何“读取”0的。 似乎“0”不能是“缺少电压”,而必须是其他类型的信号, 其中1伏特= 1,0.5伏特= 0。电路中电流之间的可区分差异仍将发送信号,但可能是打开和关闭特定电路之间的差异。
如果我在任何方面接近正确,那么向全世界的计算机工程师致敬,其复杂性令人垂涎欲滴。我希望有一天能够了解科技的方方面面。现在,我只是试图学习Arduino。
最后......我一直在想的是......今天的计算机是否可能在没有另一台计算机的帮助下进行编程?

9
机器语言是一种低级编程语言,通常完全由数字组成。因为它们只是数字,所以可以用二进制、八进制、十进制、十六进制或其他任何方式查看。Dave4723 在他的回答中给出了更详细的解释。
二进制代码不是一个非常明确定义的技术术语,但它可能意味着任何由1和0序列表示的信息,或者它可能意味着机器语言中的代码,也可能因上下文而异。
从技术上讲,所有文件都以二进制形式存储,我们通常不查看文件的二进制内容。然而,“二进制文件”一词通常用于指任何非文本文件;例如.exe、.png等。

@TheGuywithTheHat 现代计算机是用十六进制或二进制或它们的组合以及其他方式编写的吗? - Honinbo Shusaku
@Abdul,对于计算机来说,十六进制和二进制是一样的,唯一的区别在于人类如何看待它们。然而,现在几乎没有人再使用机器语言进行编程了;计算机是用高级语言(比如C++)和可能的汇编语言“编写”的。 - The Guy with The Hat
1
@Abdul,计算机硬件以二进制方式运行。 - The Guy with The Hat
@TheGuywithTheHat,所以我在想,最终所有的东西都会被转化成二进制代码,即使它已经是机器语言(因为机器语言也可以是十六进制)?这就是让我困惑的地方,如果机器语言只能读取0和1,那么它怎么可能包含十六进制呢? - Honinbo Shusaku
1
@Abdul 是的,最终所有东西都会被转化为二进制。然而,十六进制基本上只是另一种视觉上表示二进制的方式。可以这样想:100110100104d2之间有什么区别?实际上没有任何区别;它们都代表数字1234。唯一的区别在于人类如何看待它。 - The Guy with The Hat
显示剩余2条评论

6
你需要理解计算机的基本原理,这将帮助你更好地理解...因此,我建议你阅读像冯·诺依曼体系结构这样的内容。
简单来说,在一个非常简单的计算机中,你只有一个内存,就像一个数组一样,其中包含处理器的指令,数据和所有内容都是二进制数。
你的程序从内存的某个特定位置开始,并读取第一个数字...
因此,这里有一个转折:这些数字可以是指令或数据。处理器读取这些数字并将其解释为指令。
例如:起始地址是0
在0中,有一个指令,如“从地址120读取值到ALU(数学单元)”。
然后它步入地址1
“从地址121中读取值到ALU”
然后它步入地址2
“减去ALU中的数字”
然后它步入地址3
“如果ALU-值小于零,请转到地址10”
它没有小于零,所以它步入地址4
“转到地址20”
你看到这是一个基本的if(a < b)
你可以将这些指令写成数字,并由处理器运行,但由于没有人想做这项工作(这就是60年代使用穿孔卡片的情况),所以汇编语言应运而生...看起来像:
add 10,11,20 //从地址10和11加载变量;运行添加并存储到地址20
总之:
汇编语言(处理器指令)可以称为二进制,因为它以纯数字存储
但其他一切也可以是二进制文件。
实际上,如果您有一个简单的.exe文件,则两者都是如此...如果您在其中有像a = 10和b = 20这样的变量,则这些值可以存储在if语句和for循环之间的某个地方...这取决于编译器将其放在哪里
但是,如果您有一个复杂的3D模型,则可以将其存储在一个不含可执行代码的单独文件中...
希望这能帮助你更好地理解。

1
二进制文件通常被称为像 3D 模型或图片一样的文件,它只是以数字的形式存储... 如果您不了解其结构,则会迷失方向(用文本编辑器打开 MP3 文件就能看到这一点)。当您听到代码时,它主要意味着存在指令... - Dave4723

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接