编译后的软件是否包含二进制0和1?

编译后的软件是否包含二进制0和1?

我知道,软件或应用程序编译后,其代码会转换为机器语言。

编译后的软件是否包含二进制的0和1?

一个软件编译之后会发生什么?代码是不是会转化成二进制的0和1?它的源代码究竟发生了什么?如此庞大的0和1是如何在计算机中存储的?

答案1

是的。计算机上的每一条信息都是由位组成的(在 PC 上,每个字节通常为 8 位,而有些系统将字节定义为具有不同数量的位)。虽然从技术上讲,源代码是以二进制形式存储的,但可以使用各种方法将其识别为“文本”。

二进制是用来描述数据(1 和 0)的二进制表示法的符号。本文档详细解释了这种符号,您可能会感兴趣:

  二进制代码
  http://en.wikipedia.org/wiki/binary_code

编译后,生成的二进制数据通常表示一系列指令(又称字节码序列),处理器可以理解这些指令并据此采取行动。有大量指令可以执行数学运算、修改内存内容、与外设通信以及处理许多其他事情。

高级语言,比如C、Pascal、Perl等,都可以被编译成二进制代码,然后由CPU直接运行,这种二进制代码通常被称为“机器语言”。

汇编源代码(不被视为“高级语言”)是最接近机器语言的源代码形式,但也需要编译为二进制代码才能让 CPU 正确处理。

当运行解释代码时(例如使用脚本),解释器会在遇到每行或每节时对其进行即时编译,因此运行速度往往比二进制代码慢得多。BASIC(例如 20 世纪 80 年代和 90 年代初期 DOS 时代的 GW-BASIC)虽然不被称为脚本语言,但也被解释(包括循环 - 没有缓存,每行都被不断地重新解释)。

答案2

计算机上的一切都是由字节组成的。由于字节是一组(通常为 8 个)1 和 0,因此计算机中的一切都是 1 和 0。

程序是一系列指令。

CPU 的工作方式是从 RAM 中获取字节,并根据该字节的值执行操作。这些字节流构成一个程序。在这种情况下,字节称为操作码,代表基本操作。

编译是一个多阶段过程,本质上是将源代码文本“转换”或“翻译”为操作码流。原始源代码不会发生任何变化。

编译器本身就是程序,其工作是读取源代码文本并转换为机器语言。任何编译器操作的核心都是一个称为解析器扫描每行文本的每个字符(字节),将其分成单词和运算符(即代币),并根据特定单词的存在及其顺序来确定要生成的机器语言操作码。

程序很少从头到尾执行。通常决策(即条件语句)是根据程序收集的数据做出的,程序可能会跳过(又名或者分支) 到其自身的不同部分。或者,程序的各个部分可以写成子程序或者功能并可能被重复使用或称为在整个程序中。因此,大多数编译器必须对源代码进行两次或更多次检查,才能找出所有“跳转”的最终结果。这称为链接

之所以能够存储大量的 0 和 1,主要是因为芯片制造技术的进步,以及 CPU 可以访问 2 的次方个数的 RAM 容量。地址线是的。32 位 CPU 通常至少有 32 条地址线,因此有 2^32 或 4GB 的 RAM。内存并不总是这么便宜或充足。70 年代末/80 年代初的计算机广告显示,4KB 的 RAM 价格为 500 美元或更高,而且越早购买就越贵。

答案3

正如其他答案所说,是的,计算机以二进制方式存储和处理数据和指令,因此它们,或者更确切地说,它们的最基本元素(晶体管等)用两种状态进行计算,即开/关、低/高或 0 和 1。

但是还有(或者曾经有过)其他方法!有模拟计算机,与数字计算机相反,其中数字意味着您可以指出离散和特定的值(数字 <-> 手指)。在模拟计算机中,您不能,没有具有不同性质的值,一切都介于两者之间(如整数和实数)。但没有编译成机器代码的“程序”。有决定“程序”的机械/电子元件

更有趣的是:有些数字计算机不是操作二进制但是三元组

http://en.wikipedia.org/wiki/Setun

http://en.wikipedia.org/wiki/Ternary_computer

在这些计算机中,有三种状态,-1/0/1。甚至还有编译成机器码的程序。所以,结论是:也许吧。编译软件可能还包含三个数字标识符,-1、0 和 1;)

答案4

虽然答案“是”是正确的,但答案“否”更为正确。

信息以电荷形式存储(如前所述):onoff或 和positivenegativehighlowlowhigh有些系统使用电流而不是电荷。但总的来说,有两种电状态。

为了让事情变得简单,人们将其抽象为 0 和 1,这样他们就不需要知道硬件是如何做到的,而且代码更具可移植性。

后来又添加了更多的抽象层:汇编程序、字符代码(ASCII 等),然后……

所以

if (a==b)
{
}

可能变成

ld r1 a
ld r0 b
cmp r1,r0
br.z %endif1
%endif1

现在您可能听说cmp r1,r2被转换为0110110111001010,但这并不完全正确。因为0110110111001010是 16 个字符的序列(至少 16 个字节未压缩),代表 2 个字节的数据。但这样说是错误的吗?好吧,就像我说我晚餐吃了意大利面条是错误的一样。我 s p a g h e t t i 晚餐没有吃一串字符。我无法向您展示我吃了什么。我可以展示一张图片,但我没有吃图片。所以请记住 s01s 只是对实际发生的事情的一种表示。当我说我在天空中看到 1 个月亮时,这1代表完全不同的东西。当我说当心字符1l和字符0O可能会混淆时,这些1s 和0s 又是不同的东西。

相关内容