龙空技术网

三体中的人列计算机到底是啥?

程序员鹤涵 228

前言:

此刻你们对“c语言计算行列”大致比较关注,我们都想要了解一些“c语言计算行列”的相关知识。那么小编也在网络上收集了一些有关“c语言计算行列””的相关文章,希望我们能喜欢,兄弟们一起来了解一下吧!

大家好,我是鹤涵。

大家最近看三体电视剧版本了吗?跟原著还原度非常高,甚至超过原著(画面震撼呀)!

其中第15集,居然出现了冯.诺依曼+秦始皇的组合,用3000w名士兵组成了一台人形计算机。

作为程序员我可不困了,下面盘盘他的原理是啥?这玩意能计算复杂的三体运动?

人列计算机

电脑装好了,开机

这密密麻麻就是3000w士兵模拟的电路组成的人形计算机。

我第一次看到这个场面你是大受震撼的!

上图展示了与门的逻辑。红色代表0,白色代表1。输入全为1,输出才为1,否则输出0。

常见的还是有或门,非门,异或门。

输入1

输入2

输出

1

1

1

1

1

上面这个门电路有啥用呢?

举个:实现二进制加法

在输入的两位是 00 和 11 的情况下,对应的输出都应该是 0;在输入的两位是 10 和 01 的情况下,输出都是 1。结果你会发现,这个输入和输出的对应关系其实就是“异或门(XOR)”。

算完个位的输出还不算完,输入的两位都是 11 的时候,我们还需要向更左侧的一位进行进位。那这个就对应一个与门,也就是有且只有在加数和被加数都是 1 的时候,我们的进位才会是 1。对应着”与门“

其实,异或门就是一个最简单的整数加法,所需要使用的基本门电路。

1

1

+

1

1

进位

1

1

1

通过一个异或门计算出个位,通过一个与门计算出是否进位,我们就通过电路算出了一个一位数的加法。我们把两个门电路打包,给它取一个名字,就叫作半加器(Half Adder)。

由于我们半加器只能完成两个数的相加,要是有多位数组而且产生进位,就会产生三个数相加的情况,这时候就需要“全加器”登场。

两个半加器和一个或门,就能组合成一个“全加器”。第一个半加器,我们用和个位的加法一样的方式,得到是否进位 X 和对应的二个数加和后的结果 Y,这样两个输出。然后,我们把这个加和后的结果 Y,和个位数相加后输出的进位信息 U,再连接到一个半加器上,就会再拿到一个是否进位的信号 V 和对应的加和后的结果 W。

8bit的加法我们就可以串联8个全加器,如果要支持更多的位数的加法就再多串联几个全加器就ok了

正是通过这些简单的,大量的门电路,相互紧密协作,创造了巨大的价值。

冯.诺依曼体系

这个计算机是怎么组装起来的呢?

整个计算机世界的地基:冯.诺依曼体系

冯·诺依曼体系结构(Von Neumann architecture),也叫存储程序计算机。

什么是存储程序计算机呢?这里面其实暗含了两个概念,一个是“可编程”计算机,一个是“存储”计算机。

可编程

在“可编程”计算机之前,“程序”是固定在电路板上的,只能运行指定的计算程序。一旦要修改“程序”,就只能重装电路,这样成本非常大,非常不灵活。这样的计算机是“不可编程”的,比如我们的老式计算机只能计算固定的加减乘除。

存储

程序本身是存储在计算机的内存里,可以通过加载不同的程序来解决不同的问题。早年的“Plugboard”这样的插线板式的计算机。整个计算机就是一个巨大的插线板,通过在板子上不同的插头或者接口的位置插入线路,来实现不同的功能。

这样是“可编程”了,但想用上次写好的程序就不可能了,“程序”的状态是存储在板子组成的物理电路上的。

程序和硬件绑定就无法灵活编程

他的这种设计思想导致了硬件和软件的分离,即硬件设计和程序设计可以分开执行,才能出现软件工程师这个职业!!!

于是我们的冯祖师爷,基于当时在秘密开发的 EDVAC 写了一篇报告First Draft of a Report on the EDVAC,描述了他心目中的一台计算机应该长什么样。这篇报告在历史上有个很特殊的简称,叫 First Draft,翻译成中文,其实就是《第一份草案》。

冯.诺依曼确定了”计算机结构“中的5大部件:

运算器、控制器、存储器、输入设备、输出设备

或者简化为3个组件:

CPU(运算器,控制器)、存储(内存,外存)、输入输出设备(输入设备,输出设备)

CPU

1.运算器

算术逻辑单元(Arithmetic Logic Unit,ALU),我们真正完成运算,处理数据全靠它去干活!

ALU的主要功能就是在控制信号的作用下,完成加、减、乘、除等算术运算以及与、或、非、异或等逻辑运算以及移位、补位等运算。

运算器的主要部件就是ALU,运算器的处理对象是数据,所以数据的长度以及数据的表示方法,对运算器的影响很大。大多数通用计算机是以16、32、64位数据作为运算器一次处理数据的长度。能够对一个数据的所有位同时处理运算器称为并行运算器,一次只能对数据的一个位处理的运算器称为串行运算器。

运算器与其他部分的关系:

计算机运算时,运算器的操作对象和操作种类由控制器决定。运算器操作的数据从内存中读取,处理的结果再写入内存(或者暂时存放在内部寄存器中),而且运算器对内存数据的读写是由控制器来进行的。

2.控制器

控制器又称为控制单元(Control Unit),是计算机的神经中枢和指挥中心,只有在控制器的控制下,整个计算机才能够有条不紊地工作、自动执行程序。

控制器的工作流程为:从内存中取指令、翻译指令、分析指令,然后根据指令的内存向有关部件发送控制命令,控制相关部件执行指令所包含的操作。

控制器和运算器共同组成中央处理器(Central Processing Unit),CPU是一块超大规模集成电路,是计算机运算核心和控制核心,CPU的主要功能是解释计算机指令以及处理数据。

存储

3.存储器

存储器的主要功能是存储程序和各种数据,并且能够在计算机运行过程高速、自动地完成程序或者数据的存储,存储器是有记忆的设备,而且采用俩种稳定状态的物理器件来记录存储信息,所以计算机中的程序和数据都要转换为二进制代码才可以存储和操作。

存储器可以分为内部存储器(内存)和外部存储器,两者在计算机系统中各有用处。

3.1.内部存储器

内部存储器称为内存或者主存,是用来存放欲执行的程序和数据。

在计算机内部,程序和数据都是以二进制代码的形式存储的,它们均以字节为单位(8位)存储在存储器中,一个字节占用一个存储单元,并且每个存储单元都有唯一的地址号。

CPU可以直接使用指令对内部存储器按照地址进行读写俩种操作。

读:将内存中某个存储单元的内容读出,送入CPU的某个寄存器中;

写:在控制器的控制下,将CPU中某寄存器内容传到某个存储单元中。

3.2外部存储器

外部存储器主要来存放”暂时“用不着的程序和数据,可以和内存交换数据。存储成本最低,容量最大,速度最慢。

一般是U盘、硬盘(固态硬盘SSD,机械硬盘HDD)等。

运算速度的瓶颈在于存储速度远慢于CPU,性能优化的宗旨就是尽量少访问慢系统

我们把CPU比作是我们飞速运转的大脑。

那么寄存器就是当前在思考和处理的数据。

L1~L3Cache就是短期到长期记忆,需要非常少的时间就能读取。

内存就相当于我们的家里的书架,虽然容量大了不少,但是比起从记忆里读取旧慢了25倍。

磁盘相当于图书馆,容量比内存更大,但是速度比内存也更慢了,比内存还要慢1000倍。

从寄存器、CPU Cache,到内存、硬盘,这样一层层下来的存储器,==速度越来越慢,空间越来越大,价格也越来越便宜。==我们往往就要在成本和速度之间进行权衡(trade-off)

输入输出设备

4.输入输出设备

实际上我们操作计算机都是与输入输出设备在打交道。

鼠标键盘是输入设备、显示器是输出设备;

手机触摸屏即时输入设备又是输出设备;

服务器中网卡既是输入设备又是输出设备;

所有的计算机程序都可以抽象为输入设备读取信息,通过CPU来执行存储在存储器中的程序,结果通过输出设备反馈给用户。

总线,各个设备接入的高速公路

核心是为了减少多个模块之间交互的复杂性和耦合度。

在实际的硬件层面,总线其实就是一组连接电路的线路。因为不同设备之间的速度有差异,所以一台计算机里面往往会有多个总线。

常见的就有在 CPU 内部和高速缓存通信的本地总线,以及和外部 I/O 设备以及内存通信的前端总线。前端总线通常也被叫作系统总线。它可以通过一个 I/O 桥接器,拆分成两个总线,分别来和 I/O 设备以及内存通信。自然,这样拆开的两个总线,就叫作 I/O 总线和内存总线。总线本身的电路功能,又可以拆分成用来传输数据的数据线、用来传输地址的地址线,以及用来传输控制信号的控制线。

计算机软件

上面我们介绍了冯.诺依曼体系计算机由哪几部分组成,以及他们如何协同工作的。但这时候它只是一个会计算的“机器”。

硬件和软件的关系相当于琴和乐谱只有琴是无法产生价值的。

原始时代

目前我们还没有任何编程语言,只能理解CPU指令的二进制,将程序以二进制的方式刻录在存储上(ROM或硬盘)。

这时候变成是极其痛苦的,效率低的可怕。不要说修改和迭代程序了,连把想法表达出来都十分麻烦。

首先要把执行指令翻译成二进制的比特数据,然后刻录在存储上。当时软件与硬件的界限不清晰(还没有软件工程师,程序员这一说法),编写程序需要进行电气操作。

为了解决这个问题,汇编语言和编译器的出现使编程变得更简单,编译器可以将程序编写在汇编语言上的代码编译成为CPU指令,并存储在外部存储设备上。

汇编语言与计算机的CPU指令非常相似,一条汇编指令与一条CPU指令基本相对应。

汇编语言是什么

第一款编程语言诞生。 汇编语言是把程序编写和程序执行过程中的执行效率双重提高了。汇编语言通过文本符号(symbol)表示机器指令,内存地址,函数,和跳转目标地址,大大简化了程序的编写过程,避免了因为过多的关注机器实现的细节而造成的精力浪费,同时给程序员更多的思考空间。

另外,汇编语言还具有高效的特点,因为它是按照硬件的实际结构来编写程序的,程序员可以通过汇编语言充分利用硬件的资源,以最快的速度实现程序的执行。另外,汇编语言还具有高度的可读性,程序员可以通过读代码来快速了解程序的执行过程,从而更快的定位和解决程序问题。

总的来说,汇编语言是一种高效,简洁,实用,易于阅读的编程语言,为程序员提供了很多方便。

我们把三体问题的编写成代码,通过打孔卡进行输入,运行在我们的计算机上,我们就可以快乐的计算“三体”问题啦!~

总结

冯.诺依曼体系我们计算机世界的地基。高级编程语言(C,Java,Go,Python),操作系统,中间件,框架,还有我们日常使用的微信,抖音都,离不开冯.诺依曼体系。

它使得我们计算机的硬件可扩展,软件和硬件分离才能让软件这么多年迅猛发展。

标签: #c语言计算行列