首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算机如何理解 1 为开和 0 为关?

字节(英语:byte),通常用作电脑及手机及手表等 信息计量单位,不分数据类型。是通信和数据存储的概念。一个字节代表八个比特。从历史的观点上,“字节”表示用于编码单个字符所需要的比特数量。历史上字节长度曾基于硬件为1-48比特不等,最初通常使用6比特或9比特为一字节。今日标准以8比特作为一字节,因8为二进制整数。八个比特在一些规范(例如工业标准、计算机网络、电信技术等)中常被称为八位组。字节(byte)可缩写成B,例如MB表示megabyte;比特(bit)可缩写成b,例如Mb表示megabit。字节一词是Werner Buchholz于1956年6月在IBM Stretch计算机的早期设计阶段发明的,该计算机的寻址为位和可变字段长度(VFL)指令,指令中编码了字节大小。这是为了避免意外突变为比特而特意重写的。

开发像 C++ 编译器一样生成最佳代码(快速且可靠)的 Python 编译器有什么困难?

在编写优化编译器的过程中总是有很多问题需要解决——我会坚持我最熟悉的那个。动态语言允许使用不限于特定形状类型的参数来定义函数。例如,如果定义了一个简单的函数:

Python 具有动态类型。好消息是您可以使用两个整数或两个浮点数调用 Add 函数,两者都可以工作。您也可以使用两个向量、两个字符串(连接它们)、两个矩阵、一个矩阵和一个向量(将向量添加到每一行(或可能是列?))等来调用该函数。简单的解决方案是注册函数可能的类型,并查找与输入的实际类型相匹配的代码。但是同一个函数可能会被许多不同的参数类型调用,所以在计算答案之前,需要确定类型(包括维度)并以某种方式“查找”。甚至输入参数类型也需要这种处理。因此,在完成任何工作以获得答案之前,需要花费大量时间来发现实际正在做的事情。下次调用该函数时,即使是从同一位置调用,也可能需要再次执行相同的工作,因为其他程序可能已经更改了其中一个参数的类型。

与动态类型相反的是静态类型。在这种情况下,声明了每个函数的类型和维度,调用者必须使用具有预定义类型的函数。好消息是动态类型代码更容易编写——源代码更小,简单的函数,如 Add,可以重载以做很多有用的事情。但是代码速度较慢,如果将不适当的参数提供给函数,行为可能会很奇怪。而且可能没有警告——它可能只是给出了错误的答案或触发了另一个远离问题根源的故障。对于有多个作者的大型程序尤其如此,尤其是当程序正在积极开发和扩展时。

在从语言 B 到 C 的过程中,我们对类型检查应该有多强或多弱进行了很多讨论。C 语言演变为允许并后来需要头文件。由于 C 的目标是在从微处理器到大型机的所有东西上运行,因此编写了一个类型和可移植性检查程序 Lint,它可以接受多个函数定义作为输入,并检查计算机范围内所有机器的使用是否一致和操作系统。Lint 在函数中所做的许多检查都被合并到 C 和/或 C++ 中,头文件被用来“守卫”函数的大门,因此输入和输出是适当的。一种理想的语言可能允许所有较低级别的代码严格类型化以提高性能,但允许较高级别的代码动态类型化。

一些 Python 包通过用 C 或 C++ 编写低级例程以提高速度并将上层例程留在 Python 中来实现类似的功能。“在运行时”处理代码意味着什么?在程序真正运行之前,不是所有的代码都必须翻译成机器码吗?

这个问题的答案是响亮的“不”的三种方式

首先,像 javascript 这样的完全解释型语言可以在运行时直接运行任意代码,你可以创建一个输入字段,在其中编写一些代码并运行它,因为这些语言完全无需编译即可执行(它们由另一个程序解释,因此名称)

其次,像 java/C# 这样的部分解释型语言有一种叫做 JIT 编译的东西,它并没有特别允许在运行时执行任意代码,但是它确实可以通过编译代码来处理意外数据,只要它是遇到(主要是通过泛型)

最后,像 C++ 这样的完全编译的语言可以完全相反,代码永远不会在运行时执行,而是完全在编译时运行。在这种情况下,可执行文件中甚至没有机器代码。

当然,这些类别中的一些或所有类别可能比解释的更广泛地起作用,我知道提到的机制至少在提到的特定语言中起作用,并且我假设这可能与语言类别有关(尽管确实没有理由像 C# 这样的语言不能执行编译时代码,例如)

CPU(例如 100MHz)使 2+2=4 这样的操作失败所需的大致时间是多少?

我假设“失败”这个词是翻译或自动更正的产物。没有好的方法来估计单个操作在现代 CPU 上花费的时间。在现代 PC 中,操作是在管道中同时执行的。他们使用的值是从快速缓存内存或慢得多的 RAM 内存中获取的。这些因素对执行单个指令所需的时间有很大影响。但是 100MHz 是一个非常古老的处理器。Intel Pentium 是 1990 年代生产的,时钟速度在这个范围内。这是在引入所有现代流水线等之前。所以我们确实有合理的机会得到答案,即使它不适用于现代处理器。

在 Pentium 上,一条 ADD 指令需要一个时钟周期来执行,再加上它需要的每个内存访问需要一个时钟周期。因此,将内存中保存的值与寄存器中保存的值相加需要两个时钟周期,而将寄存器值与内存值相加需要三个时钟周期:一个用于读取值,一个用于执行 ADD,一个用于存储值.

对于 100MHz 时钟,每个时钟周期为 1/100MHz = 10ns。所以问题的答案是10ns到30ns,取决于操作数所在的位置。换句话说,每秒有 3300 万到 1 亿条 ADD 指令。我还没有研究过更现代处理器的详细工作原理,而且我也没有时间这样做;它非常复杂。然而,如果我们假设不涉及流水线(可能这条 ADD 指令就在分支指令使流水线无效之后)并且所有操作数都保存在快速缓存中,那么这些指令时序可能仍然存在。3GHz 处理器的时钟周期为 333ps,因此我们的数字可能在 333ps 和 1ns 之间,或者每秒 10 亿到 30 亿次操作之间。然而,它可能比实际情况快得多或慢得多。

计算机如何理解 1 为开和 0 为关?

计算机不理解“1”为“开”和“0”为关。二进制计算机是一组设计用于在两个电压电平上运行的电路。一个高电平和一个低电平。按照设计,当出现高电平时,它会以某种方式触发某些其他电路;当存在低电平时,它会以不同的方式触发事情。该计算机中(字面上)有数百万个这样的电路,执行相当复杂(尽管仍然相当初级)的操作组合,范围从将两个数字相加到例如在输出连接器上发出信号。

但是计算机无法理解这些。它就像一个机械装置,像发条一样,滴答滴答,滴答滴答,电路充当开关,根据输入(高压或低压)进行切换,根据输入(高压或低压)控制输出(高压或低压)设计师如何安排它们。请注意,有多层复杂性。这些高电压和低电压的东西可以连接到人类输入设备(例如,键盘上的按键)或人类输出设备(例如,计算机屏幕上的像素)。然后他们代表了一些东西。现在计算机仍然不明白那个计算机屏幕上的像素是字母“A”还是你阿姨的照片,它只是忠实地执行指令,将高电压连接到一些像素,将低电压连接到其他像素。

然后是更高级的软件。基于这些复杂的层次,一个先进的机器学习软件,最终仍然依赖于底层硬件的滴答、滴答发条机制,可以通过传感器从其环境中收集数据(以到计算机内部电路的高低电压),将其与之前收集的数据进行比较,并构建现实模型。在某一点上,我们甚至可以说这个软件确实理解了低电压和高电压可以表示二进制数字系统的两位数字的概念。但是这个软件几乎与实际的晶体管(导电或不导电)相去甚远,因为你的个性与大脑中单个神经元的潜在生化机制相去甚远,这些神经元以电或电流的形式发射并将信息传递给其他神经元。化学信号。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230118A035M200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券