本文接上文程序是如何在计算机上被执行的?(上篇:软件部分),主要内容是机器语言如何在计算机硬件上运行,关于逻辑门,加法器,布尔运算,亦即,cpu的工作原理

1、逻辑门

以下图片是《三体》中的一个情节:

这段故事提到一千万个这样的门部件,就是搭建计算机的基础元件,逻辑门

那什么是与、或、非呢?

相信聪明的你高中物理有学过电路,想象三种场景:

1、非门开关控制灯泡,1是打开,0是关闭

2、与门
串连电路,只要关一个开关,灯泡就不亮,只有两个开关都打开灯泡才亮,即必须都是1才亮。

3、或门

并联电路,只要有一个开关是开的,灯泡就亮。

道生一,一生二,二生三,三生万物,就像人体蛋白质由二十种氨基酸通过不同组合而成,使用这三种基本逻辑门,就可以实现所有逻辑运算,进而构造出一整套的计算,这时候我们认为,与、或、非就是逻辑完备的。

一切运算的基础——加法

现在能生成万物的基础元素与或非门出现了,接下来我们着手设计CPU最重要的能力:计算,以加法为例。由于CPU只认识0和1,也就是二进制,那么二进制的加法有哪些组合呢:

  • 0+0,结果为0,进位为0

  • 0+1,结果为1,进位为0

  • 1+0,结果为1,进位为0

  • 1+1,结果为0,进位为1,二进制嘛!

注意进位一列,只有当两路输入的值都是1时,进位才是1,看一下你设计的三种组合电路,这就是与门啊,有没有!

但,只有计算能力是不够的,电路需要能记得住信息。

神奇的记忆能力

到目前为止,你设计的组合电路比如加法器天生是没有办法存储信息的,它们只是简单的根据输入得出输出,但输入输出总的有个地方能够保存起来,这就是需要电路能保存信息。

电路怎么能保存信息呢?一位英国物理学家,设计了这样一个简单但极其神奇的电路:

这是两个NAND门的组合,不要紧张,NAND也是有你设计的与或非门组合而成的,所谓NAND门就是与非门,先与然后取非,比如给定输入1和0,那么与运算后为0,非运算后为1,这就是与非门,这些不重要。

比较独特的是该电路的组合方式,一个NAND门的输出是两一个NAND门的输入,该电路的组合方式会自带一种很有趣的特性,只要给S和R段输入1,那么这个电路只会有两种状态:

要么a端为1,此时B=0、A=1、b=0;

要么a端为0,此时B=1、A=0、b=1;

不会再有其他可能了,我们把a端的值作为电路的输出。

此后,你把S端置为0的话(R保持为1),那么电路的输出也就是a端永远为1,这时就可以说我们把1存到电路中了;而如果你把R段置为0的话(S保持为1),那么此时电路的输出也就是a端永远为0,此时我们可以说把0存到电路中了。

就问你神奇不神奇,电路竟然具备存储信息的能力了。现在为保存信息你需要同时设置S端和R端,但你的输入是有一个(存储一个bit位嘛),为此你对电路进行了简单的改造:

这样,当D为0时,整个电路保存的就是0,否则就是1。

同理,我们可以通过任意加法器进行组合拼接实现较长的二进制计算。实际上,数学家已经证明,加法是实现所有数学运算的基础。有了加法器,原则上就可以通过他们搭建任何其他计算,像乘法、除法、平方、开方、三角函数等。而伟大的计算机科学家图灵在一百年前就已经指明,这些简单运算足以支撑任何信息处理的过程。

寄存器与内存的诞生

现在你的电路能存储一个比特位了,想存储多个比特位还不简单,复制粘贴就可以了:

我们管这个组合电路就叫寄存器,你没有看错,我们常说的寄存器就是这个东西,类似于平常运算过程用到的可擦写草稿纸。

上图左侧是十六进制操作码,右边是将数据从一个寄存器复制到另一个寄存器的操作。

你不满足,还要继续搭建更加复杂的电路以存储更多信息,同时提供寻址功能,就这样内存也诞生了。

寄存器及内存都离不开上一节那个简单电路,只要通电,这个电路中就保存信息,但是断电后很显然保存的信息就丢掉了,现在你应该明白为什么内存在断电后就不能保存数据了吧。

以上就是cpu计算的原理了,如前所述,真正的计算机在运行的时候,是通过逐条读取存放在内存中的相应指令,然后进行计算和操作实现的。被机器所识别并运行的机器指令或操作指令,会被编码成方便人类理解的筑基形式,就是汇编语言

再接上一篇文章程序是如何在计算机上被执行的?(上篇:软件部分),从后往前读,就是整个程序在计算机上执行的流程了。

总结:

回顾一下,编程语言是经过如下流程在计算机上执行的:

编程语言---语法分析、词法分析---转换成汇编语言---机器指令---cpu运行---逻辑门---与或非

这样看,所有语言,不管是js,python,go还是其他的,最终都会被解析成汇编语言在cpu上执行。那么,所有语言,都是等价的,所有语言都可以通过编译器实现从一种语言到另一种语言到转换

当计算机运行程序时,我们会发现每一层表现形式不一样,但本质都是计算,而且每一层都是建立在下一层基础上的抽象。虽然分了很多层,所有层都是等价的,层和层之间有明确边界,越到下层牵涉到的基础单元越多,越到上层越简洁。

抽象对我们在计算机科学中做的每件事都很有帮助。抽象使得编写一个大型程序成为可能,将其划分为小而且容易理解的部分,用C这样的高级语言编写这样的程序不用考虑汇编,用汇编写代码不用考虑逻辑门,用逻辑门来构建处理器不用太多考虑晶体管,抽象是如此重要

不管是计算机网络分层原理,计算机系统,应用…都有抽象,都是为了让使用者更易用更好用,至此,理解了cpu,理解了语言的解析和执行、理解了分层和抽象,完。

程序是如何在计算机上被执行的?(下篇:cpu工作原理)的更多相关文章

  1. 优秀Java程序员必须了解的GC工作原理(转)

    一个优秀的Java程序员必须了解GC(Garbage Collection 垃圾收集)的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系 ...

  2. 安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行

    近期安装Microsoft .NET Framework 4(独立安装程序)时,提示"安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行" 没法放狗 ...

  3. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序

    这种错误的可能性有几种,比如: 1.没有安装数据访问组件,需要安装相应版本的数据访问组件: 2.没有安装相应版本的Office客户端,需要安装相应版本的Office客户端: 3.Microsoft.J ...

  4. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序 解决方法

    最近在搞asp.net.今天在做数据库操作的时候,老发生错误,还以为是自己代码有问题,检查了好久都发现错误. 错误提示: 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程 ...

  5. 未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序解决办法

    错误信息:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序. 解决办法: 去http://download.microsoft.com/download/7/0/3/7 ...

  6. 未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序解决方案

    未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序解决方案 一.现象:  C#程序中需要以Provider=OraOLEDB.Oracle.1方式访问ORACLE数据库.但程序执行时报 ...

  7. asp.net采用OLEDB方式导入Excel数据时提示:未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0" 提供程序"

    笔者在项目中做做了一个从Excel表格中导入数据的模块.大体上asp.net项目中导入Excel大体分成三类: 1)采用c#内置方案System.Data.OleDb(限制较小, 通用) 2)采用Ex ...

  8. IIS7.5 提示未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序

    在WIN7 X64平台IIS7.5,使用Asp.net连接access数据库时候,提示:未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序. 说明: 执行当前 Web 请求 ...

  9. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  10. 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动

    重新安装MySQL数据库,由于安装的时候马虎,一路next(事实上,某些地方需要严格的配置,我忘记注意了),导致现在出了很多麻烦. 错误信息: 本地计算机上的MySQL服务启动后停止.某些服务在未由其 ...

随机推荐

  1. 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架

    基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架 Avalonia简介: Avalonia是.NET的一个跨平台UI框架,提供了一个灵活的样式系统,支持广泛的操作 ...

  2. Go语言中指针详解

    指针在 Go 语言中是一个重要的特性,它允许你引用和操作变量的内存地址.下面是指针的主要作用和相关示例代码: 1. 引用传递 在 Go 中,所有的变量传递都是值传递,即复制变量的值.如果你想在一个函数 ...

  3. git报错:SSL certificate problem: unable to get local issuer certificate

    原因:在windows系统中git没有获取到ssl证书 解决方案 输入以下命令: git config --global http.sslBackend schannel 之后再执行操作就可以啦 另: ...

  4. 【译】为你的 ASP. NET Core Web API 创建 Microsoft Power App

    通过轻松创建 Web API 前端来提升您的开发体验. 低代码工具在开发人员中越来越流行,因为用更少的代码更快地创建应用程序.在 Visual Studio 2022 17.6 预览版2中,您现在可以 ...

  5. redux的三个概念与三大核心

    1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...

  6. 连续下雨天,.net开发者如何预防流感

    最近连续下了3天雨,天气变化大,很容易引发感冒咳嗽等疾病.对于.NET技术开发人员来说,如何保持身体健康,保证工作效率是一个很重要的问题. 首先,我们需要注意保持室内空气流通,避免长时间处于封闭的空间 ...

  7. 从Element日期组件源码中学到的两个工具方法

    最近翻到 ElementUI 的日期组件源码,看到一些处理日期的工具方法,挺有意思,平常没有注意到,特此记录下来. 获取当前日期的前一天,后一天 export const prevDate = fun ...

  8. vue中使用Tinymce

    1.安装tinymce编辑器 npm i tinymcenpm i @tinymce/tinymce-vue 或: yarn add tinymce yarn add @tinymce/tinymce ...

  9. VScode软件的安装以及C/C++环境配置的方法

    今天和大家分享一下VScode软件的安装以及C/C++环境配置的方法.手把手教大家入门. 1,下载VScode编译器 (1)    官网下载链接:https://code.visualstudio.c ...

  10. MAUI+Blazor混合应用开发示例

    前言 笔者之前在公司搭建过一套生产管理系统,该系统要求能和硬件进行串口通信,同时又要提供后台信息查询.笔者给出的解决方案就是:MAUI + Blazor,这样只需要提供一套UI,就能满足桌面端.移动端 ...