前面的话: 现在的知识,是过去经验的总结,而其中有些是约定。 但我想看到的是知识的成长过程。 像编程,不是首先记到变量类型、语句结构、数组指针和函数进程,而是当用到的时候再用。因为近四百年的现代科学,从现在回看历史进程,我们处于时间的最上层,可以设想一下如果我是在100年前的世界,或者如果现在自己来设计一个语言应该怎么操作。所以我们就以这样的角度来认识python,其实不止是python,不止是编程。 第二段话: 技术原本应该是整个人类文明的财富,但即使到了2020年,这个充满未来感的时代(虽然现实比预想的更糟),可都2020年了,还在技术封锁,而不得不迫使技术稍显落后的地方非得再从头搞起来。(对,就是说的现在)那么既然要从头搞,就仔细回溯一下技术是如何发展到现在这样的,甚至可以思考一下有没有别的方向,而非得这样吗?

    现代意义的计算机是于1946年时候美国军方定制的的一台“电子数字积分计算机”(ENIAC Electronic Numerical And Calculator)在宾夕法尼亚大学问世。ENIAC(中文名:埃尼阿克)是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的,这台计算器使用了17840支电子管,大小为80英尺×8英尺,重达28t(吨),功耗为170kW,其运算速度为每秒5000次的加法运算,造价约为487000美元。ENIAC的问世具有划时代的意义,表明电子计算机时代的到来。在以后60多年里,计算机技术以惊人的速度发展,没有任何一门技术的性能价格比能在30年内增长6个数量级。然后经过几十年的发展成为现在手中把玩的这个东西。与其畅想接下来计算机会发展成什么样子,倒不如先回溯一下历史,甚包括1946年之前的关于计算、关于科技的历史。

    计算机,也就是计算的机器,从远古的结绳计数到后来的算盘都可以算作一种计数计算方式。虽然算盘早就出现了(大约2600年前,对算筹的改进而来),却2200年之后直到出现计算尺,才逐渐有了现代计算机的雏形。并且是出现在西方。
    所以这里就有了第二个疑问,为什么手动计算到机器计算跨越了2000多年,齿轮其实也很早就已经出现,像水车、指南车和木牛流马这些。难道只是因为2000多年只注重代数而忽视了几何,直到西方出现的欧几里得几何。几何被重视之后,漫长而蛮荒的手动计算开始退居二线,机械计算才能承担的起复杂的运算。进而就开始思考,算术方法的本质是什么,什么才是好的方法,其实不管是结绳计数,还是数手指头、或者转动齿轮,都只是数学工具而已,那么任何能计数的东西都能被算作进去,所以才有了后来的计算机。
    1630年左右英国牛津的埃德蒙·甘特发明了一种使用单个对数刻度的计算工具,当和另外的测量工具配合使用时,可以用来做乘除法。1630年,剑桥的William Oughtred发明了圆算尺,1632年,他组合两把甘特式计算尺,用手合起来成为可以视为现代的计算尺的设备。即使到现代,计算尺也是一种很有效给工具。
    后来1642年法国科学家布赖斯.帕斯卡发明了齿轮式加法器,却只能做6位的加减法,与我国的算盘都有着非常大的距离。并且这种加法器的出现相传也只是为了解决代数问题,为了帮助做税务官的父亲在计算税率时不再那么费力。但庆幸的是他从几何的角度出发设计的机械装置, 这昭示了用一种纯粹的机械装置去代替人的思考和记忆是可以做到的。这种加法器是一种系列齿轮组成的装置,外形像一个长方盒子,用儿童玩具那种钥匙旋紧发条后才能转动,只能够做加法和减法。然而,即使只做加法,也有个“逢十进一”的进位问题。聪明的帕斯卡采用了一种小爪子式的棘轮装置。当定位齿轮朝9转动时,棘爪便逐渐升高;一旦齿轮转到0,棘爪就“咔嚓”一声跌落下来,推动十位数的齿轮前进一档。帕斯卡加法器—具体工作原理可以参考知乎一篇文章计算机科学(上)--硬件基础 - 图1
    1672年莱布尼茨在帕斯卡加法器的基础上为其增添了一种名叫“步进轮”的装置。步进轮是一个有9个齿的长圆柱体,9个齿依次分布于圆柱表面;旁边另有个小齿轮可以沿着轴向移动,以便逐次与步进轮啮合。每当小齿轮转动一圈,步进轮可根据它与小齿轮啮合的齿数,分别转动1/10、2/10圈……,直到9/10圈,这样一来,它就能够连续重复地做加法。 连续重复的计算加法是现代计算机做乘除法采用的办法,莱布尼茨的计算机加减乘除四则运算一应俱全。不仅四则运算,还能开方的机械式计算器。
    莱布尼茨在做计算器的时候设想能不能只用0和1来进行运算,既然能够逢十进一,那么也可以逢二进一。计算机科学(上)--硬件基础 - 图2
    于是计算机的数学理论基础——现代的二进制记数系统由戈特弗里德·莱布尼茨于1679年设计,在他1703年发表的文章《论只使用符号0和1的二进制算术,兼论其用途及它赋予伏羲所使用的古老图形的意义》出现。与二进制数相关的系统在一些更早的文化中也有出现,包括古埃及、古代中国和古印度。中国的《易经》尤其引起了莱布尼茨的联想。
    莱布尼茨关于二进制的论文全名是《论只使用符号0和1的二进制算术,兼论其用途及它赋予伏羲所使用的古老图形的意义》(1703年)。类似于现代二进制计数系统,莱布尼兹的系统使用0和1。下面是莱布尼兹的二进制记数系统的一个例子:

    0 0 0 1 数值为{\displaystyle 2^{0}} 0 0 1 0 数值为{\displaystyle 2^{1}} 0 1 0 0 数值为{\displaystyle 2^{2}} 1 0 0 0 数值为{\displaystyle 2^{3}}

    但二进制还是在莱布尼茨之后沉寂了一百多年直到1847年英国数学家乔治布尔再提起并制定其其运算规则。
    所以在1700后面的100多年里还是以机械装置进行以十进制为基础的数学运算,于此同时代手工纺织业的生产需求,纺织机本身也是一种机械装置,而关于机械,可考最早的就是指南车了,指南车并不是依靠地磁场而完全只是齿轮的的组合,就能够实现车上小人所指方向基本保持出发状态不变。这与后期的齿轮机械装置做的计数器有着同样的技术含量。进而影响了织布机这种提高生产效率的机器的发明和改进。织布机就是梭子牵引着丝线在横向穿梭于纵向的丝线之间,一会提起梭子,一会压下梭子。依靠手工,也能编织出精美的图案。后来1725年法国纺织机设计师布乔提出了“穿孔纸带”的构想,并依据此设计出了穿孔纺织机。布乔首先设法用一排编织针控制所有的经线运动,然后取来一卷纸带,根据图案打出一排排小孔,并把它压在编织针上。启动机器后,正对着小孔的编织针能穿过去钩起经线,其它则被纸带挡住不动。于是,编织针自动按照预先设计的图案去挑选经线,布乔的“思想”“传递”给了编织机,编织图案的“程序”也就“储存”在穿孔纸带的小孔中。这一用就是65年,直到后来的1790年,法国机械师杰卡德,基本形成了改进提花机的构想,由于当时正是法国大革命时期,杰卡德为了参加革命,无暇顾及发明创造,直到1805年才真正完成”自动提花编织机“的制作。杰卡德为他的提花机增加了一种装置,能够同时操纵 1200 个编织针,控制图案的穿孔纸带后来换成了穿孔卡片。而穿孔就是明显的二进制的思想,即有孔和没孔。只不过这个二进制思想还没有真正被发掘出其巨大威力。
    1812年法国人巴贝奇为了解决当时政府发起的一项编制一套《数学用表》这样浩大的工程中遇到的各种问题,于1822年发明了差分机。因为在人工要编制这样一套表的话太过费时费力,还经常出错,虽然都是重复的工作。这就跟当时我国第一颗原子弹使用算盘进行理论验证类似。1812年20岁的巴贝奇从自动提花机获得灵感耗时10年设计出了差分机。但差分机也是一种机械装置,如果其需要的零件设计不精细,那么运算出来的结果就会又很大偏差,受限于当时生产技术和其他原因差分机研制受挫。之后巴贝奇又提出了一个更新更大胆的设计——通用的数学计算机,巴贝奇称它为分析机。巴贝奇的伙伴阿达·奥古斯塔认为分析机’编织’的代数模式同杰卡德织布机编织的花叶完全一样”,于是,为分析机编制一批函数计算程序的重担,落她的肩头。阿达开天辟地第一回为计算机编出了程序,其中包括计算三角函数的程序、级数相乘程序、伯努利函数程序等等。阿达编制的这些程序,即使到了今天,电脑软件界的后辈仍然不敢轻易改动一条指令。人们公认她是世界上第一位软件工程师。众所周知,美国国防部据说是花了250亿美元和10年的光阴,把它所需要软件的全部功能混合在一种计算机语言中,希望它能成为军方数千种电脑的标准。1981年,这种语言被正式命名为ADA语言,使阿达的英名流传至今。当然这些都是后话了。
    在当时,两人为把分析机的图纸变成现实,耗尽了全部财产,搞得一贫如洗,在此期间,两人为筹措研究经费,两人还商量“下海创收”,比如制作国际象棋玩具、赛马游戏机等等。但这并没有带来什么改变,为此,阿达还两次把丈夫家中的祖传珍宝拿去当铺换钱,不过后来又被阿达的母亲赎了回来。在经历了贫困交加和无休止的脑力劳动,阿达的身体状况急剧恶化,1852年,年仅36岁的阿达怀着对分析机美好的梦想去世了。
    阿达去世后,巴贝奇又默默的独自坚持了20年,晚年的他已经不能准确发音 和有条理的表达自己的意思,但仍坚持工作。1871年巴贝奇去世。最终分析机没有被制造出来。巴贝奇和阿达设想的分析机超出了他们所处时代至少一个世纪。
    1890年,德国侨民霍列瑞斯博士在美国做人口普查(上一次人口普查人工花了7年),人口普查需要做大量工作,如年龄、性别等用调查表做采集的项目,还要计算每个社区有多少老人、小孩,男人、女人等。霍列瑞斯博士就想用机器自动统计这些数据。几年后他根据巴贝奇的发明和杰卡德的穿孔纸带设计了机器。结果花了6周就得出了准确的数据。杰卡德和霍列瑞斯分别用开创了程序设计和数据处理之先河。以历史的目光审视他们的发明,正是这种程序设计和数据处理,构成了电脑“软件”的雏形。
    1896年霍列瑞斯博士创办了IBM公司的前身。
    至此,制造出来的计算机都是机械的,机械计算机向电子计算机发展的过渡时期发生的主要事件。
    ———————————————————————————重要的分割线————————————————————


    1904年,世界上第一只电子二极管在英国物理学家弗莱明的手下诞生了,这使爱迪生效应具有了实用价值。弗莱明也为此获得了这项发明的专利权。
    1906年,美国发明家德福雷斯特(De Forest Lee),在二极管的灯丝和板极之间巧妙地加了一个栅板,从而发明了第一只真空三极管.
    但直到1946年才出现用电子管来设计计算机,甚至使用电能驱动的计算机也是1939年美国人艾肯在图书馆看过巴贝奇的论文之后设计的以继电器为主要器件的机械电动式计算机,电只是用来提供机械动力而已。该计算机于1944年正式运行,又被称为史前最后一代机械计算机。于此同时当时任职宾夕法尼亚大学莫尔电机工程学院的莫希利(John Mauchly)于 1942年提出了试制第一台电子计算机的初始设想——“高速电子管计算装置的使用”,期望用电子管代替继电器以提高机器的计算速度,并且得到当时二战时期军方的大力支持,以快速精确的计算出炮弹的轨迹。并终于在1946年2月14日,世界上第二台电子计算机,世界上第一台通用计算机 (多个行业都可以使用)埃历阿克”(ENIAC,译成中文是“电子数字积分和计算机”)诞生于美国宾夕法尼亚大学。之后计算机开始了狂奔进化,从电子管到晶体管,再到集成电路,依据摩尔定律从小规模集成电路到大规模集成电路,一直到现在我们手上把玩的这个东西。
    那么1910到1940年之间发生了什么怎么就一片空白,二进制与继电器又是如何被用到计算机的设计上面呢?
    其中香农在1936年发表了一篇硕士论文<继电器和开关电路的符号化分析>,科学严谨地论述了如何使用布尔代数对继电器电路进行分析和合成。1940年,24岁的香农因这一成果获得了Alfred Noble协会美国工程师奖。开关电路在后来的计算机和通信电子工程发展中发挥了极大的作用,现在人们普遍认为这项工作为数字电路领域奠定了基础。H. H. Goldstine后来称赞这一成果为“有史以来最重要的一篇硕士论文”、“把数字电路设计方式由艺术变为科学的里程碑”。当我们对香农创立的信息论津津乐道时,可能在香农心目中他硕士论文的工作才是他最得意的成果,他从中得到的乐趣超过其他任何事情。
    从1700年二进制的出现到1935年开始结合使用电这之间的200多年间两者都是相互独立的,当然电的使用是在1675年之后77年的1752年,美国科学家富兰克林向天引电。关于电,我们另开一个坑单独再谈。
    这里我们只说二进制。二进制作为一种数学的延申,在当时莱布尼茨也是这样认为的,认为二进制是在数学领域要比十进制更加接近世界的本质的最自然的语言符号,而在数学领域经过100多年的发展,1847年乔治布尔才给二进制有了现代意义上的二进制运算法则。布尔分别在1847年和1854年发表了著名的《逻辑的数学分析》和《思维规律的研究》,将数学中的代数方法引入到逻辑学中,被后人称为布尔代数(Boolean algebra),逻辑运算因而也叫布尔运算。计算机科学(上)--硬件基础 - 图3
    直到20世纪,随着继电器电路的发展,许多科学家开始将二进制、布尔代数和电路联系到一起,最终,由美国一位名为克劳德·香农(Claude Shannon)的数学家做出了完整阐释。1938年,就读于麻省理工学院的香农发表了他那篇著名的硕士论文《继电器与开关电路的符号分析》,奠定了数字电路的理论基础。在此之前二进制都是在数学领域发展。并且这其中有很类似,本身黑白、阴阳是中国易经中最早出现,但一直就只是有无、阴阳这样的表述,直到莱布尼茨看到易经跟自己的研究联系在一起之后,才在哲学的角度引入符号标识,用阿拉伯数字0和1来表示。历史总是这样,老是被忽视,直到1936年香农把0和1跟继电器的开和关对应起来,接下来就是如何依靠摩尔定律来使这种开关更精巧了。现在意义的计算机在香农时候开始打牢了地基。
    其实继电器出现在计算机的设计中,是1884年赫尔曼·霍尔瑞斯发明的机器叫制表机(tabulator/tabulating machine),顾名思义,就是专门用来制作数据统计表的机器。制表机主要由示数装置、穿孔机、读卡装置和分类箱组成。制表机的工作是围绕穿孔卡片展开的:操作员先使用穿孔机制作穿孔卡片,再使用读卡装置识别卡片上的信息,机器自动完成统计并在示数表盘上实时显示结果,最后,将卡片投入分类箱的某一格中,进行分类存放,以供下次统计使用。当时纸带打孔机已经被用在生活中了。赫尔曼·霍尔瑞斯发明的制表机卡片设有300多个孔位,与雅卡尔和巴贝奇的做法一样,靠每个孔位打孔与否来表示信息。尽管这种形式颇有几分二进制的意味,但当时的设计还远不够成熟,并没有用到二进制真正的价值。举个例子,我们现在一般用1位数据就可以表示性别,比如1表示男性,0表示女性,而霍尔瑞斯在卡片上用了两个孔位,表示男性就其中一处打孔,表示女性就在另一处打孔。其实性别还凑合,表示日期时浪费得就多了,12个月需要12个孔位,而常规的二进制编码只需要4位。当然,这样的局限也与制表机中简单的电路实现有关。
    在制表机前,穿孔卡片(或纸带)多用于存储指令而不是数据。比较有代表性的,一是雅卡尔提花机,用穿孔卡片控制经线提沉;二是自动钢琴,用穿孔纸带控制琴键压放。
    原理上,通过电路通断识别卡上信息。底座中内嵌着诸多管状容器,位置与卡片孔位一一对应,容器里盛有水银,水银与导线相连。底座上方的压板中嵌着诸多金属针,同样与孔位一一对应,针的上部抵着弹簧,可以伸缩,压板的上下面由导电材料制成。这样,当把卡片放在底座上,按下压板时,卡片有孔的地方,针可以通过,与水银接触,电路接通,没孔的地方,针就被挡住。
    这一基本原理与雅卡尔提花机类似,不难理解。重头戏是,如何将电路通断对应到所需要的统计信息呢?霍尔瑞斯在专利中给出了一个简单的例子,如下图所示。这是涉及性别、国籍和人种3项信息的统计电路图,虚线为控制电路,实线为工作电路。在此基础上香农把二进制跟继电器结合起来了。
    那么接下来就是这样的开关如何控制庞大的机器运转呢?以及机器怎么就开始边的聪明起来了。前者是香农,后者是同时代的图灵。技术与思想从来就是同步的,这也是为什么科技在20世纪发展迅速,并且基于当时的发展速度对未来做了大胆的乐观预言,但显然这样未来有些失望了。1880到1910年代出生的那波人,到现在也是百年,1980到2010年的人显然是没法比的。如果这个时代如当时那样充满热情而不是像现在这样沉寂,2020也许会如你所愿,将大有不同。

    推荐书《计算机简史》《编码·隐匿在计算机软硬件背后的语言》
    image.png
    推荐专栏:知乎专栏—改变世界
    推荐视频
    点击查看【bilibili】