EEJournal

专题文章
现在就订阅

建造一台电脑,如果你不小心穿越回过去(下)

在我前一列,我开始思考和反复思考,如果我不经意间进入了一个时间轴,发现自己回到了20世纪30年代末或40年代初,我该怎么做才能把食物放在桌子上。为了增加趣味性和轻浮感,我思考了这种不稳定的时间轴是否也把我带到了一个平行的维度,在这个维度中,计算机科学仍然根植于模拟领域。

我认为自己擅长的一件事是从头开始设计一台数字计算机(如果不是靠我的诠释舞者技能养活自己,那真的不是一个很好的选择)。

您可能还记得,我们决定遵循的过程是为我们的中央处理单元(CPU)确定指令集架构(ISA),选择一种实现技术(继电器、真空管……),并构建这个野兽的硬件部分,包括只读存储器(ROM)、随机存取存储器(RAM)等组件,以及穿孔纸制品写入器、读取器和电传打字终端、纸带或穿孔卡片形式的媒体等设备。

下一步,我们必须集中我们的注意力将是如何编程我们大胆的美丽。从本质上讲,任何数字计算机都只理解自己的机器码;也就是说,0和1的二进制模式表示其核心指令和任何相关数据。

我们的第一个选择(在我们自己的多元宇宙切片中的人们所采用的)将是使用铅笔和纸在机器代码中捕获我们的程序。例如,假设一个16位地址总线和一个8位数据总线,这样的程序可能看起来像下面这样:

使用铅笔和纸捕获的机器代码程序
(图片来源:Max Maxfield)

随后,我们可以使用两组可靠的拨动开关将这个机器代码程序输入到计算机的内存中:一组指定地址,另一组定义操作码(指令)和操作数(与指令相关的额外数据或地址值)。

除了费时费力之外,用机器码捕获程序并不像我说的那么有趣,特别是当您考虑到编辑程序以插入或删除指令的行为将改变它后面所有内容的地址时。

因此,我们的下一步将是构想并记录某种形式的符号表示,使人类更容易书写、阅读和理解。除了使用助记符来表示CPU支持的每个指令(例如,LDA = " Load Accumulator ", DECA = " Decrement Accumulator ", JNZ = " Jump if Not 0 "),这样的语言还支持常量、注释、符号标签、汇编指令等。

回到我们世界中实际发生的事情,由于以这种符号形式捕获的程序最终需要被“组装”成相应的机器代码,因此这种符号形式被称为“汇编”语言,而将这些程序翻译成机器代码的行为被称为“装配”。

最初,我们将使用铅笔和纸捕获汇编代码程序。一个示例程序可能如下所示:

使用铅笔和纸捕获的汇编代码程序
(图片来源:Max Maxfield)

汇编语言相对于机器代码的最大优势是我们(人类)可以实际阅读和理解它。然而,首先,我们仍然必须手工组装程序(即,将其转换为可执行的机器代码)。同样,我们会用铅笔和纸来做。再说一次,一旦我们手工组装了我们的程序,我们仍然需要用我们的拨码开关把它输入我们的计算机。

正如我们在上一篇专栏文章中所讨论的,除了定义我们的ASCII码版本(0和1的二进制模式,用于表示字母数字字符、标点字符和控制代码)之外,我们的下一步可能是使用手工编码和组装过程来创建一些简单的实用程序来执行诸如读写纸带和/或穿孔卡片之类的任务。

我们还将使用手工编码和组装过程来创建一个简单的文本编辑器和一个简单的汇编程序,后者是一个可以读取汇编源文件并为我们将其组装成机器代码的程序。此时,我们几乎肯定会开始循环使用我们的简单文本编辑器来捕获更复杂的汇编程序的汇编源代码,然后使用我们当前的汇编程序来组装更复杂的汇编程序。同时,我们可能会使用当前的文本编辑器来捕获更复杂的编辑器的汇编源代码,然后使用最新的、最好的汇编程序来组装更复杂的编辑器。

一方面,这个过程相当令人难以置信,但它也有某种优雅的简单性(我也想起了老程序员的笑话:“为了理解递归,必须先理解递归”)。

汇编语言的问题之一是它与计算机的核心指令集绑定在一起,这意味着每台机器都有自己的语言。反过来,这意味着(如果我们将交叉汇编程序的概念排除在我们的讨论之外),不可能为一台计算机编写汇编语言程序,然后将其组装到另一台计算机上使用。

汇编语言的另一个问题是,尽管专业用户可以编写简洁高效的代码,但这通常需要花费大量时间,这意味着用户通常只以一种方式做事,而不会花大量时间试验其他实现。

最终,我们的用户将不再满足于在汇编语言级别上工作,并将要求一种更简单的做事方式。一种解决方案是定义一种更高级的语言表示形式,允许我们使用诸如“if ((a== 6) and (b < 10)) then…”这样的语句。在我们的现实世界中有一种这样的语言叫做C,为什么是C呢?当时已经有一种语言叫做“B”(真的)。

一旦我们定义了我们的新语言,我们就可以使用最新最好的编辑器以这种语言捕获源代码程序,但是接下来我们要做什么呢?我们仍然需要一些方法来将源代码转换为可以在我们的计算机上运行的等效机器代码表示。执行这种转换的一种方法是使用我们可能称为编译器的程序,之所以这样命名是因为它将从读取源代码和编译变量和函数等列表开始。

当然,当你开始思考这个问题时,我们将不得不用汇编语言创建我们的第一个C编译器,因为这是我们目前必须使用的所有东西。只有在我们使用编辑器捕获编译器的汇编语言版本,并使用汇编器将其组装成机器码之后,我们才能最终使用编译器的这个机器码版本将用C源代码编写的程序翻译(“编译”)为它们的机器码等价物。

我们的第一个C编译器可能是一个只支持C语言的一个子集的基本实现,这可能不会让您感到惊讶。再一次,我们将遵循一个循环过程,使用当前的文本编辑器为更复杂的C编译器捕获C源代码,然后使用当前的C编译器编译更复杂的编译器,循环往复(再次,我的头在旋转)。

C编译器实际上并不生成机器代码,尽管从普通观察者的角度来看它似乎是这样做的。实际发生的事情是——在幕后和幕后——编译器生成汇编代码,汇编代码被交给汇编程序来生成最终的机器代码。

迁移到更高级别的编程抽象(如c)有很多好处。例如,假设我们创建了几种不同类型的计算机。在这种情况下,一旦我们为每台计算机创建了编译器,我们就可以用C源代码编写一个程序,并将其编译成每台计算机所需的机器代码。另一个优点是,在更高的抽象级别上工作使我们能够更快速、更容易地探索每个编程问题的不同解决方案。

好了,结果出来了。抽象的三个层次:C语言、汇编语言和机器代码。事情要是这么简单就好了。我们仍然必须考虑有无数高级编程语言的事实什么是编译器?吉姆·特里(Jim Turley);此外,编译器只是一种方法,因为我们还有解释语言,线程解释语言,被翻译成字节码的语言,在虚拟机上运行,然后事情开始变得复杂。

我不知道你怎么想,但我觉得这类事情非常有趣。我有一种冲动,想更深入地研究这些不同的做事方式,但如果你不分享我的热情,我就不想这么做,所以我会让你发表评论说“是”或“否”。当然,像往常一样,我也欢迎任何其他评论、问题或建议。

关于“建造一台电脑,如果你不小心回到过去(下)”的13个想法

  1. 嗨,麦克斯,和往常一样有趣,我是一个耶投票更多。图灵机有很多部件让它们运行,大多数用户从来没有考虑过这些部件。Flowpro Machine是另一种计算和比较两种机器部件的方法,读者可能会感兴趣。

    1. 嗨,Ron -谢谢你的赞美之词-除了解释器/线程解释的东西,你给了我一些关于后续专栏的想法-我还有其他一些专栏要先写,但我会把这个添加到列表中

  2. “去过那儿,你说呢!”在我看来,C语言很棒,主要是因为它有循环、指针和系统函数库。在C语言之前,有分支和子程序调用。(不确定“goto”)。有一个隐藏的概念,即一次只有一个程序在运行(没有多路编程)。是的,弗吉妮娅,那是“黑暗时代”。幸运的是,那些日子已经过去了。

    但是太阳仍然不太亮,因为每个人和他的堂兄弟们都在定义新的语言,因为他们发现了所有现有语言的一些局限性。实用性和常识已经中断。

    我也是一个硬件工程师。我在这里告诉你,加载、添加、存储、分支cpu并不是运行程序的唯一方法。

    在计算中有对堆栈的基本需求。不,麦克斯,我没说"堆叠机"

    1. 嗨,卡尔-如果没有它的GOTO语句,BASIC会在哪里?如果没有堆栈,反向波兰符号(RPN)会是什么样子呢?我只是将“所有语言”添加到我下次要讨论的内容列表中(不是在下一篇文章中,而是在本系列的下一篇文章中)。

      1. 与RPN一起出现的是“分流码算法”。这就引出了抽象语法树(AST),它可能是构建最先进计算机的关键。

        Python是一种非常流行的解释语言,而c#是一种更新的编译语言(我的最爱!),两者都基于基于RPN/栈的AST。

        在硬件方面,有嵌入式内存块,特别是在fpga上,只是坐在那里浪费电力,因为没有人知道如何使用它们(当然,我知道)。

  3. 嗨,麦克斯,耶!很有趣。现在,如果你无意中进入了一个时间点,发现自己被穿越到了21世纪30年代末或40年代初,会怎么样?
    你会用量子位来定义alu吗?量子纠缠零延迟时间能否使1位ALU计算64位数字的速度与当前64位ALU一样快,从而简化CPU架构?

    1. 嗨,约翰-首先,我怀疑量子计算是否会“简化计算机架构”,哈哈,我实际上计划检查2030年代和2040年代,但由于我目前没有一个功能性的时间机器(你根本无法在阿拉巴马州亨茨维尔获得零件),我将走风景好的路线去那里(或者“那时”,我想)。现在你让我想起了《生活大爆炸》的一集,谢尔顿开始谈论谈论时间事件序列时需要使用的时态(https://youtu.be/oNDbl3nZdyA这是一部经典之作

  4. 嗨,Max,我工作过的第一台电脑有拨动开关和led。在新冠疫情封锁期间,我想我应该尝试用SSI/MSI逻辑(以及许多led)的传统方式构建一个简单的计算机,但新的MSI逻辑已经变得像独角兽一样难以找到。简单的pld,同样罕见,但仍在生产中。然后我考虑了你所做的所有事情,汇编器,编辑器,高级语言,文件系统。天啊,我的身体里已经没有足够的生命来做这些了。

    如果我把古老的8080/8085放到FPGA中会怎样?上面所有的工具都可以在PC上运行,无论是本地的,还是在CP/M模拟器中——等等!为什么不直接写一个8080模拟器在ARM主机上运行呢?比最初的8080快几百倍的ARM Cortex-M7是否能够模拟到总线级别(如果不能将计算机与某些东西连接,那么计算机还有什么意义呢)?答案是肯定的。我不想用ARM汇编语言编程(又是一个寿命有限的问题),我拿着一本古老的英特尔数据书,开始按照英特尔的描述用“C”代码构建状态机。我很快就决定模拟第二代8085总线,它需要更少的支持硬件,我可以使用altind -8085 SBC作为测试平台(感谢David Hunter)。

    最初的总线计时测试表明,对状态机使用switch()语句涉及太多开销(即使在为最大速度进行优化时也是如此)。转换为函数指针表的方法奏效了(这是我从未想过我会做的事情)。SPI端口用于读取交换机,并几乎实时地将虚拟寄存器转储到LED阵列。那是所有的收银机!不只是旧的Altair/IMSAI盒子的地址和数据。

    所以现在我有一台像以前一样的电脑,直接切换机器代码,或者从开关中加载ROM中的引导地址,切换RUN并启动它。在帕洛阿尔托基础搜索质数或我搜索克林贡人时,看着闪烁的led灯让人着迷。

    1. 嗨,尼尔,这听起来太棒了,我想看一张图片(或视频),你能把它发邮件给我吗max@clivemaxfield.com?我的一个朋友有一台原版的Altair 8800(他说铝制外壳可以承受房子的倒塌)——我真的很想要那台机器!我很想得到我的手IBM 360控制面板(http://infolab.stanford.edu/pub/voy/museum/pictures/display/3-1.htm) -我只满足于带有开关和灯的部分-然后使用Arduino来控制一切,哈哈

      1. 我猜IBM面板上的灯是小白炽灯泡。如果我有机会接触到这些面板,我将不得不决定是保留灯泡还是用led代替它们。

留下回复

有特色的博客
2022年12月13日
在这个知识助力器博客中,我们讨论了使用Verilog-AMS的实数建模(也称为wreal建模),并探索如何使用wreal语言对模拟或混合信号块建模。我们还向您介绍了为期两天的实数建模与Verilog-AMS课程。
2022年12月13日
我们将分享数字化存储芯片设计和验证节省时间的四种方法,并探索先进存储设备的关键芯片设计和验证工具。数字技术可以加速内存设计和验证的4种方法首先出现在从…
2022年12月8日
这个世界准备好迎接下一个封装的变形了吗?
2022年12月7日
当英飞凌需要为下一代功率半导体产品的开发选择一个场求解器时,... ...

有特色的视频

通过端到端解决方案实现内存设计和开发的新范式

Synopsys对此

为了满足高性能计算、人工智能和汽车应用的需求,对高度定制的高性能存储芯片的需求正在推动对新的设计范式的需求,如DTCO、左移设计、数字化和可靠性设计。

了解有关内存解决方案的更多信息

特色粉笔谈话亚博里的电子竞技

超越SOT23:小型包装的未来

逮老鼠的电子产品而且Nexperia

在整个电子工程领域有一个大趋势,那就是把我们推向越来越小的元件和印刷电路板。在本集粉笔谈话中,来自Nexperia亚博里的电子竞技的Tom Wolf和Amelia Dalton探索了SOT23较小包装尺寸的好处。他们会研究这种SMD的新封装尺寸如何降低您的BOM,减少您的板空间等等。

点击这里了解更多有关Nexperia SOT23表面贴装封装产品的信息

Baidu