四二年,大饥荒,妻留粮解三个数

&p&这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算?
我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答,大家也只是解释了一部分问题,没有完整的把计算机整个的抽象层次说清楚。在大学里我看到了 Charles Petzold的《编码
隐匿在计算机软硬件背后的语言》,这部永不退色的计算机经典著作,为了讲明白了这件事儿,今天我决定用自己简略的话,回顾一下作者写作的思路,用我的理解为大家讲述计算机的工作原理。希望我能够完成。&/p&&p&今天的计算机已经变得相当复杂,是有史以来人类创造的最复杂最精密的仪器,没有之一,是二十世纪技术领域的“登峰造极之作”,计算机与生俱来的层次化体系结构,掩盖了技术背后最本质的东西,现在已经很少有人去关心计算机最本质的工作原理,我希望能剖析计算机一层层‘“抽象”面纱,展现最本质的“计算”过程。基本的知识基础是高中物理,高中数学。&/p&&br&&p&第一节 计算器&/p&&p&下面回到高中课堂,我依稀记得在电磁学那一部分,讲到了电磁继电器,当时老师说,继电器是很重要的发明,我打开物理课本,“什么破东西嘛”,太简单了,那时候觉得像继电器这样的发明没什么用。高中数学中也讲到,布尔代数,简单老说就是,与、或、非,而且教科书上说,布尔代数意义重大云云。下面问题来了,我只用继电器能不是实现简单的计算器?注意是“计算器”,而不是计算机,答案是肯定的,来,那就看看,如何用继电器打造出一个”计算器“,进而打造出一台”计算机“&/p&&img src=&/1fcd5eebb66_b.jpg& data-rawwidth=&991& data-rawheight=&422& class=&origin_image zh-lightbox-thumb& width=&991& data-original=&/1fcd5eebb66_r.jpg&&&p&两个继电器串联,点亮一盏灯,这算不算实现了“与”的操作呢?两“真”为”真“&/p&&img src=&/5d53b4b54c655ee27b1e8c_b.jpg& data-rawwidth=&1018& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&1018& data-original=&/5d53b4b54c655ee27b1e8c_r.jpg&&&p&两个继电器并联,点亮一盏灯,是不是实现了”或“的操作?一真为真&/p&&img src=&/0c6a6c0b33ad91d0c399d55fd662da97_b.jpg& data-rawwidth=&1081& data-rawheight=&413& class=&origin_image zh-lightbox-thumb& width=&1081& data-original=&/0c6a6c0b33ad91d0c399d55fd662da97_r.jpg&&&p&一个继电器本身就可以实现”非“的操作&/p&&p&这样一来,物理上的继电器,和布尔代数,完美的融合起来,我把与或非门继电器实现称作”物理层“,每张图右边的符号表示,称作”布尔逻辑层“,从”物理层“到”布尔逻辑层“是我们的第一层抽象,很简单吧?(当然现代计算器从物理实现到逻辑实现,已经不再使用继电器,而是在硅芯片上雕刻一个个的晶体管,但晶体管的数量绝对不会减少,这一点@丁旭 已经说得很明白) &/p&&p&接下来可能有人问,你整这些小儿科的东西,有什么用呢?别急,看我慢慢展开!&/p&&p&我们知道,布尔代数是一种数学,既然是在一种数学,那么存在数学运算啊,数学运算能用继电器实现吗,of course&/p&&img src=&/df0c9b68c81acddbc64bae_b.jpg& data-rawwidth=&1245& data-rawheight=&582& class=&origin_image zh-lightbox-thumb& width=&1245& data-original=&/df0c9b68c81acddbc64bae_r.jpg&&&p&一个或门,一个与非门,一个与门,按照图示连在一起形成了一个最常见的运算,异或运算,”相同为假,不同为真“,那物理实现上怎么做呢?请在大脑中想想怎么连线,一共七个继电器就可以实现,有了异或运算,我们就可以实现更复杂的运算,下面就和我们实现一台”计算器“直接相关了&/p&&img src=&/f895be5fdc8725ffc9f188eac4beef38_b.jpg& data-rawwidth=&976& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&976& data-original=&/f895be5fdc8725ffc9f188eac4beef38_r.jpg&&&p&一个异或门和一个与门,形成一个”半加器“,图示下边的符号表示一个半加器,这里是新一层的抽象,从布尔逻辑运算到”计算器件“的抽象&/p&&img src=&/698a1aae7a4e46bab7f75b_b.jpg& data-rawwidth=&1202& data-rawheight=&577& class=&origin_image zh-lightbox-thumb& width=&1202& data-original=&/698a1aae7a4e46bab7f75b_r.jpg&&&p&有一个半加器,距离我们实现手工打造一个”计算机“还很远,然而两个半加器,一个或门,可以实现一个”全加器“,为什么叫全加器呢?因为我们使用它可以实现一位加法的计算!(这里是二进制,问题的题目,为什么计算机能读懂”0“和”1“,看到这里是不是心头一喜呢?)&/p&&img src=&/b0e15c8c39ec1_b.jpg& data-rawwidth=&1097& data-rawheight=&601& class=&origin_image zh-lightbox-thumb& width=&1097& data-original=&/b0e15c8c39ec1_r.jpg&&&p&有了一位”全加器“,我们实现8位加法的计算还远吗?当然不远,8个全加器,按图示相连,就可以实现8位加法计算(和我们在纸上进行加法运算很像,进位的操作很显然。当然,这里都是进行二进制加法),右下方是8位加法器的表示方式。&/p&&p&要是这会儿在19世纪,在电力革命的年代,我一定要亲手打造一个计算器!&/p&&img src=&/abcfb25ca278b6e76fd1be5_b.jpg& data-rawwidth=&1164& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&1164& data-original=&/abcfb25ca278b6e76fd1be5_r.jpg&&&p&画的比较简陋,见过卡车上的按钮吗?上下拨动的那种,这是我穿越回19世纪站在专利局门口,阐述我”伟大”的发明,“我发明的计算器,有两排输入按钮,每个按钮上下拨动表示输入的是0或者1,最下排是9个灯泡,灯泡的亮与灭,指示这一位是0,还是1,我的发明是划时代的,可以把人类从繁杂的计算过程中解救出来...”&/p&&p&“什么?就因为我的计算器不能实现减法运算儿拒绝我的专利申请,减法运算?减法运算,怎样实现计算机的减法运算呢?”&/p&&p&计算机发展过程中,最重要的思想是“抽象”,一层层的抽象封装了实现的细节,使的计算机开发人员更关注与逻辑的实现,相信有了我上面的表述,读者应该能看懂下边的抽象思想:&/p&&img src=&/c48d5ad5b23a47402bddfd269bd073a4_b.png& data-rawwidth=&700& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/c48d5ad5b23a47402bddfd269bd073a4_r.png&&&p&这个电路实现了把输入的数据取反(0-&1,1-&0)&/p&&img src=&/efa7a48ff632c3bbdc403_b.png& data-rawwidth=&546& data-rawheight=&228& class=&origin_image zh-lightbox-thumb& width=&546& data-original=&/efa7a48ff632c3bbdc403_r.png&&&p&这是求补器的“抽象”&/p&&p&减法的逻辑实现我直接给出,相信读者也应该能看明白&/p&&img src=&/4bda23f057aa9c2306872_b.png& data-rawwidth=&669& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&669& data-original=&/4bda23f057aa9c2306872_r.png&&&p&我还清楚的记得,在计算机组成这门课上,老师讲述,原码和补码概念,“在计算机内部,正数的补码是它本身,负数的补码,记得取反加1“,为什么取反加1呢?看看上边的实现,计算机内部如何实现减法?有个取反操作,还有个进位操作,这不正是”取反加1“吗?&/p&&p&下面从逻辑实现层,回到物理层,思考下,需要多少继电器才能实现这样的 ”小发明“,算了,吓一跳吧?然而我们的计算机先驱康拉德·楚泽花费了十年心学,3000多个继电器才早出一个计算机原型,所以,,,本着向先哲致敬的精神,让我们在大脑中”打造出“一台计算机&/p&&img src=&/deb93fdac708c_b.png& data-rawwidth=&686& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&/deb93fdac708c_r.png&&&p&”我的专利不仅仅能实现加法操作,也能实现减法操作,计算具有普遍性,具有划时代的意义,可以把人类从复杂的计算中解救而出来...“&/p&&p&至此,我们实现了一个简单的计算器实现,不难吧?然而这才只是万里长征的第一步。&/p&&p&接下来我来说说,计算机是如何存储信息的,这真是个费力活儿,在不太遥远的过去,二十年前,计算机的存储量还非常有限,我记得初中那会儿还没有MP3,用磁带听歌,直到最近,存储技术才有了长足的进步,当然这是后话。&/p&&p&第二节,计数器&/p&&p&人类的感官,听觉,触觉,味觉,视觉,感官器官接受外界的刺激,在大脑中留下神经信号,进而形成对“外部世界”的认识,那抽象的事物怎么去认识呢?&/p&&p&电灯通电点亮灯泡,高中的物理知识解释,足够了。电可以让物体运动,这个道理人人都懂。坐在回家的高铁上,让我想想一下高速列车是如何运动的:驾驶员按下通电按钮,带动电车引擎,电车引擎通过传动装置把牵引力传给电车车轮,列车得以启动。高速列车的动力系统也相当复杂,我不了解每一个实现的细节,但是我可以想想出电车引擎的工作原理,为什么?因为这些都是实实在在的实物,看得见摸得着。那我想想出计算机的工作原理吗?答案是不能,为什么?因为计算机一层层的“抽象”,一个小小的物理器件上集成了上亿的基本元器件,使计算机真正的工作原理是我们越来越遥远。&/p&&p&下面还让我们回到19世纪末,二十世纪初,那个激荡人心的电力革命的年代,让我们去还原真实的技术实现过程。回到高中物理课堂&/p&&p&我们已经讲解了如何去制造一个一台简易的“计算器”,不知不觉下课了,这时我听到一阵刺耳的下课铃声。电铃和计算机有关系吗?我直接上图吧&/p&&img src=&/ccab_b.jpg& data-rawwidth=&500& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/ccab_r.jpg&&&br&&p&注意看旁边的那个金属小锤子&/p&&img src=&/efbc42bb94d00e4ae80eb5_b.png& data-rawwidth=&570& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&/efbc42bb94d00e4ae80eb5_r.png&&&p&电铃的工作原理如上图所示,大家想象下,电铃的小锤子震荡起来敲打金属盖发出声音的情形,duang,duang,daung,形象吧?(这种电路叫做震荡器)&/p&&img src=&/a324e541ffe65a6faf82b2_b.png& data-rawwidth=&513& data-rawheight=&168& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&/a324e541ffe65a6faf82b2_r.png&&&p&振荡器是不是可以实现计数功能呢?交替的输出0和1,哈哈,感叹造物的神奇吧!&/p&&p&下面我们再来看一些神奇的电路,当初的先驱们是怎么想到这些复杂而精致的设计&/p&&img src=&/b6e75df9b37dbd5afaa343_b.png& data-rawwidth=&614& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&/b6e75df9b37dbd5afaa343_r.png&&&p&闭上上方的电路,灯亮了&/p&&img src=&/0d6a50c628f05d316bf3c_b.png& data-rawwidth=&582& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&/0d6a50c628f05d316bf3c_r.png&&&p&断开上方的电路,灯依然在亮&/p&&img src=&/35e969d3c178a380f62b5cb8f6375270_b.png& data-rawwidth=&499& data-rawheight=&199& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&/35e969d3c178a380f62b5cb8f6375270_r.png&&&p&闭合下方电路,灯灭了&/p&&img src=&/92b6eaf9db307a7_b.png& data-rawwidth=&488& data-rawheight=&187& class=&origin_image zh-lightbox-thumb& width=&488& data-original=&/92b6eaf9db307a7_r.png&&&p&断开下方的电路,灯依然不亮&/p&&p&电路的奇特之处在于:同样是在开关都断开的状态下,灯泡有时候亮,有时候不亮,当开关都断开时,电路有两个稳定状态,这类电路叫做“ 触发器”。(英国物理学家1918在工作中发现的)&/p&&p&触发器电路可以保持信息,确切的说,可以“记忆”某些信息,他可以“记忆”那个开关先闭合。触发器是一个大家族,大家要是有兴趣可以去看相关资料。请记住一点!触发器是用来“记忆”信息的,我再给出两类常用的触发器&/p&&img src=&/8f1fa6ecea31_b.png& data-rawwidth=&517& data-rawheight=&247& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&/8f1fa6ecea31_r.png&&&p&这个叫做“D型触发器”,具体实现如上图,我们的表示一直都停留在很“底层”,一直都很关注实现的细节,随着细节实现越来越多,我们需要上升到高一层的层次,更加关注功能的实现,而不是陷于细节实现的泥潭!(想一想,为什么说,计算机具有与生俱来的层次结构)&/p&&p&数据端简写为D,时钟端简写为Clk,功能表如下:&/p&&img src=&/eb33d69de15ff30fcda3b0d_b.png& data-rawwidth=&248& data-rawheight=&194& class=&content_image& width=&248&&&p&脑袋里想象下,触发器是一个很听话的孩子,当clk端通电时,相当于告诉孩子,“孩子啊,你要记住我传给的信息”,clk断电时,孩子在自由自在的玩耍,完全不接受任何传过来的指令,很形象,不是吗?&/p&&p&在D型触发器的基础上实现了更复杂的功能,“ 边缘触发的D型触发器”&/p&&img src=&/c935dbb047ae91a8ddd145011eeb7dee_b.png& data-rawwidth=&587& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&/c935dbb047ae91a8ddd145011eeb7dee_r.png&&&p&“抽象”图&/p&&img src=&/e81dfaf7af19_b.png& data-rawwidth=&156& data-rawheight=&91& class=&content_image& width=&156&&&p&again,抽象的思想,使我们脱离的细节实现(上图),更加关注功能&/p&&img src=&/6f72ffb9fce_b.png& data-rawwidth=&220& data-rawheight=&145& class=&content_image& width=&220&&&p&向上的箭头,表示电信号从0到1变化的那一瞬间有效,再次在脑袋里想象下,触发器是一个很听话的孩子,当clk从0-&1变化时,相当于告诉孩子,“孩子啊,赶紧接住我给你的球,球在这里指信息”,其他状态下,孩子在自由自在的玩耍,完全不接受任何传过来的指令。&/p&&p&有人问,说了这么多,到底想干什么?好的,告诉你,用这些可以实现一个计数器,记得小孩子学数数吗?我们要做的的就是要用机器来从0开始数数,真的吗?恩,离这一步已经很近了,不信看下边&/p&&img src=&/fd8fa89f2ff60fbff7ba9f_b.png& data-rawwidth=&369& data-rawheight=&156& class=&content_image& width=&369&&&br&&p&简单的,把振荡器和触发器相连&/p&&img src=&/232f79df6e2e612d67f3bc2bd779dafc_b.png& data-rawwidth=&518& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&/232f79df6e2e612d67f3bc2bd779dafc_r.png&&&br&&p&电平信号的变化&/p&&p&稍微扩展一下,实现更复杂的功能,应该能看明白吧&/p&&img src=&/65c84dbb7a2ad9ca691aff_b.png& data-rawwidth=&528& data-rawheight=&179& class=&origin_image zh-lightbox-thumb& width=&528& data-original=&/65c84dbb7a2ad9ca691aff_r.png&&&p&电平信号的变化(标上0和1)&/p&&img src=&/cb7db76c286e_b.png& data-rawwidth=&594& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&/cb7db76c286e_r.png&&&p&嗨嗨,清醒下,我们得到了什么?把上图顺时针旋转90度,你发现了吗&/p&&img src=&/ae382b0ce95c316b8eeb4e2_b.png& data-rawwidth=&354& data-rawheight=&461& class=&content_image& width=&354&&&p&这不就是在计数吗?用二进制的方式计数!&/p&&p&把8个触发器连接在一起,然后放入一个盒子里,构成了一个8位计数器,能从0数数到2^8-1,(0-255),这个计数器称为“8位行波计数器”&/p&&img src=&/dc95beb4ba_b.png& data-rawwidth=&477& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&/dc95beb4ba_r.png&&&p&现在,我们已经懂得如何继电器来做加法、减法、计数了,这一件很有成就感的事儿,使用的技术也是100多年前就存在的技术。&/p&&p&第三节 存储器&/p&&p&我想用继电器打造一个存储量为64K x 8的存储阵列,我能实现吗?这会儿可是在二十世纪初!如果我穿越回那个年代,一定会再次为我的“发明”申请专利,如果真是这样,那计算机的发展史上会留下我的名字(呵呵,意淫一下),下面就看看我是如何实现我的“发明”吧&/p&&p&上节,我已经提到,触发器可以“记忆”1位的信息&/p&&img src=&/aa16bb2ce862a99723af1bb_b.png& data-rawwidth=&563& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&/aa16bb2ce862a99723af1bb_r.png&&&p&就是上图这个样子,我们把它抽象成:&/p&&img src=&/77b631ab0_b.png& data-rawwidth=&227& data-rawheight=&137& class=&content_image& width=&227&&&p&我们把上图称作“1位锁存器”,想一想,两个输入线和一个输出线都是什么意思,我上节已经解释过,来、来、来,想一想那个淘气的小朋友。&/p&&p&有了“1”,那么距离“100000”还会远吗?无非就是如何组织n个“1”,“抽象”的量级提升的过程&/p&&img src=&/fdb0e7f337c_b.png& data-rawwidth=&736& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&736& data-original=&/fdb0e7f337c_r.png&&&p&这是8位锁存器&/p&&img src=&/e6001e7cee4fee19efb3f0e93b29c4bf_b.png& data-rawwidth=&490& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&490& data-original=&/e6001e7cee4fee19efb3f0e93b29c4bf_r.png&&&p&简写成这种形式&/p&&p&再来看两个神奇的发明,或许你也会为发明者神奇的构思所折服&/p&&img src=&/a1b5b1067aff3bb66f5e7c4e44e41664_b.png& data-rawwidth=&590& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/a1b5b1067aff3bb66f5e7c4e44e41664_r.png&&&p&我想制作出这么一个元器件,他要实现这些功能。想想一下,某一天,你成了一个名人,每天前来拜访的人络绎不绝,今天呢,来了八个人,但是你时间有限,只能见一个人,那就让5号来吧(把拜访者编号,0-7),5号拜访者带来了自己的礼物(0或者1的信息)。看图,左边的三根线表示拜访者的地址(当然是二进制编码),000,001,010,011,100,101,110,111,5号就是101,这时候呢,我只需要把S0和S2通电,那么5号拜访者就进来了,献上自己的礼物(1位的信息)。&/p&&p&怎么实现这个功能呢?有兴趣的自己去研究下面实现,请记住,我们现在讨论的内容抽象的层次已经不是最最底层的实现了,而是更加关注于逻辑器件实现的功能&/p&&img src=&/5ce1334ec94cbd23fe8d2d239c75b87f_b.png& data-rawwidth=&578& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&/5ce1334ec94cbd23fe8d2d239c75b87f_r.png&&&p&这叫“8-1选择器”&/p&&p&反过来,我有一封信需要送出去,这封信的内容是0或者1,现在我也有8个快递小哥可以选择,编号分别是000,001,010,011,100,101,110,111,我让谁去给我送信呢?那就还是5号吧,于是我把地址分别设置为101,5号小哥就去给我送信了,给出具体实现,有兴趣的自己去看吧&/p&&img src=&/c415fae875bae2918b3bddb7f29ffef7_b.png& data-rawwidth=&437& data-rawheight=&504& class=&origin_image zh-lightbox-thumb& width=&437& data-original=&/c415fae875bae2918b3bddb7f29ffef7_r.png&&&p&这个电路名儿叫做“3-8译码器”&/p&&p&有了8-1选择器和3-8译码器,就可以制作出一个8位存储器了&/p&&img src=&/f62f1d4cbbe509c9c738fd1d5425468d_b.png& data-rawwidth=&674& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&674& data-original=&/f62f1d4cbbe509c9c738fd1d5425468d_r.png&&&p&again,把复杂的电路实现,抽象成简单的符号表示&/p&&img src=&/fdb7fd3c8fab7_b.png& data-rawwidth=&430& data-rawheight=&171& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&/fdb7fd3c8fab7_r.png&&&p&读/写存储器,通常叫做随机访问存储器或者叫RAM,RAM可存储8个单独的1位数据&/p&&p&如何得到16 X 1的RAM呢?相信大家都能想到,用2个 8 X 1的RAM,我仿佛回到了《计算机组成》的课堂,让我再来做一次作业吧&/p&&img src=&/bfb5aecfeee07b5be62ee_b.png& data-rawwidth=&530& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&/bfb5aecfeee07b5be62ee_r.png&&&p&简写如下:&/p&&img src=&/733d785f5ce80d346472d_b.png& data-rawwidth=&446& data-rawheight=&196& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&/733d785f5ce80d346472d_r.png&&&p&这种方式或许正确,但是使用了三根地址线,两根数据线,能不能使用4根地址线1根数据线呢?&/p&&p&加一个2-1选择器不就行了吗?(设计一个2-1选择器,这会儿应该不算什么难事儿)&/p&&img src=&/5bbad23c2d954426ffaa_b.png& data-rawwidth=&557& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&/5bbad23c2d954426ffaa_r.png&&&p&再次用符号简写:&/p&&img src=&/15f7d75b93ab9fd1a53b56f_b.png& data-rawwidth=&461& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&461& data-original=&/15f7d75b93ab9fd1a53b56f_r.png&&&br&&p&回到我们的出发点,怎么得到64K X 8的存储阵列呢?&/p&&p&无非就是努力提高8位锁存器的集成程度嘛,我可以想象,读者看到这里,脑子里全是密密麻麻的的连线,或许你还一时想象不到连线的方式,但是看到这里,64K X 8的存储阵列一定能用某种方式实现,对吧?虽然没有实现其电路图,但我也可以说,我理解了存储器工作原理,(你懂了吗?)。&/p&&img src=&/1b19ffdc0c3d5fa8bfef0230_b.png& data-rawwidth=&544& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&/1b19ffdc0c3d5fa8bfef0230_r.png&&&p&1024 X 8RAM的符号表示,2的16次方,即64K,地址线有16根,数据线有8根&/p&&p&为了申请我的专利,我需要做出一个机器的外部壳子,和第一节中的“计算器”一样,把这个机器的壳子把我所有实现的过程封装起来,形成一个“黑盒”,只保留几个外部的接口(也就是那几根数据线,一定要记得他们的功能),我要做成的外部盒子是这个样子&/p&&img src=&/490b43bd0d0_b.png& data-rawwidth=&626& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/490b43bd0d0_r.png&&&p&上一排的对应16根数据线,下一排有8根数据线,这个不用解释,相信把上文看完的都能明白什么意思,takeover这个按钮表示是否使得当前控制面板处于“激活状态”,也就是说,这个开关的作用是确定由控制面板还是又外部所连接的其他电路(从来没说过,没有连接外部其他电路,或者想象下,我这个机器壳子外面有一排的针孔,外部电路可以接进去,想想电脑机箱后边的针孔,就是这个意思,Soga)来控制。如果有其他电路相连。这时候takeover为 0(图示状态),此时存储器由其他电路接管,控制面板上的其他开关不起作用,当takeover为1 时,控制面板将重新获得对存储器的控制能力。&/p&&p&最后还是给出电路实现&/p&&img src=&/ffd325ac9a32d0f0dc9e642_b.png& data-rawwidth=&655& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&/ffd325ac9a32d0f0dc9e642_r.png&&&p&想一下,机器壳子后面的针孔连那里,控制面板的开关又连接哪里?&/p&&img src=&/b1c58ea11ed73b09e92017_b.png& data-rawwidth=&600& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/b1c58ea11ed73b09e92017_r.png&&&p&简化的图示,是不是又用到“抽象”的思想呢?&/p&&p&一个辛辛苦苦装满65,536字节(8位为一个字节,字节编码请去参考ASCII编码)珍贵数据的64K X 8的RAM阵列,如果断电,会发生什么事情?首先电磁铁会因为失去电流失去磁性,随着“梆”的一声,金属片讲弹回原位,RAM中的所有数据将如风中残烛一般消失在黑暗之中,所以,RAM也成为“易失性”存储器。&/p&&p&那我一手打造的64K X 8的存储阵列,需要多少继电器呢?答案是是500W左右,是不是惊讶到恐怖呢?谁会没事儿造出这么个恐怖的怪兽?(100年后的今天,用二极管,三极管,集成这么多元器件的芯片,连指甲盖的大小都不到,感叹人类技术的进步吧)。&/p&&p&我穿越回二十世纪初,再次站在专利局的门口,为我这项“伟大的发明”申请专利,瑞士专利局的爱因斯坦会因此吓尿吗?世界上最聪明的大脑,能理解“黑箱”背后发生了什么吗?&/p&&p&第四节
自动操作&/p&&p&说了这么多电子线路的知识,我相信的我的讲述方式,大家都是能看懂的,前面所写的,其实只是为大家讲述一件事儿,“把电子元器件内部实现展开”,现有的一个个电子元器件,现在就是一个个小工具(把内部实现封装起来,保留外部接口,外部接口,就是那一根根地址线,数据线,和其他开关)、原材料。那我们现在看一看现在都有那些原材料呢?&/p&&p&计算器:一个会算数的小朋友,每次你把要进行计算的两个数给他,拍一下小朋友的头,小朋友帮我算一下吧,他会把计算的结果给你,没有一点误差,计算速度很快,并且乐此不疲。&/p&&p&计数器:一个一直在数数的小朋友&/p&&p&存储器:辛辛苦苦装满了64K 字节的箱子&/p&&p&译码器:《唐伯虎点秋香》中有个代号,9527,一个数字,你说它什么意思呢?如果,我“规定”9527指的是唐伯虎,让译码器来做这件事,译码器你把9527给我带过来(地址线用2进制表示的二进制是多少呢?),这时候译码器“很听话”的把唐伯虎叫过来。(在这里,机器“理解了”人类的语言吗?)&/p&&p&有了这些原材料,我们就可以着手打造一台computer了,我们的工作才刚刚开始,请读者保持耐心,我们最终要实现的是一台通用计算机,这台“先进的”机器可以使加减法的过程自动化,is that unbelievable?这台机器可以解决所有能有加、减法处理的问题,而事实上现实中的许多问题确实可以用加法与减法来解决。&/p&&p&让我来回顾一下自己的教育经历。从咿呀学语之后,幼儿园开始,我们就要开始一生的学习了,小学的数学课现在还叫不叫“算数”?刚开始,我们扳着自己的手指数数“1,2,3,4,5,上山打老虎...”,学会数数之后呢?老师先教我们加法与减法,那么乘法和除法呢?我依稀记得,是用加法和减法来实现的,对吗?&/p&&p&加法与减法,可以从底而上,构建更加复杂的算数系统,以至于,微积分也是建立的基本的算数系统之上,我还清楚的记得泰勒公式带给我的震撼,记得第一次见到牛顿迭代法时的情景。&/p&&img src=&/41bbe01adc4e96f1c24cfcb_b.png& data-rawwidth=&719& data-rawheight=&103& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/41bbe01adc4e96f1c24cfcb_r.png&&&p&最美的数学公式之一,不解释为什么了,参考大学微积分&/p&&p&假如,假如我们已经实现一台可编程的最原始的执行加减法运算的“计算机”,如何计算出e的值呢?&/p&&p&想明白这一切,就需要我们了解“自动操作”的过程,了解程序的本质什么?编写程序的过程就像堆多米诺骨牌,辛辛苦苦,小心翼翼堆了半天,只为了那一下推到骨牌的快感!下面这一部分内容较难,请读者一定保持耐心,我会试着按我自己的理解讲清楚,如果我有理解不对之处,欢迎大家指出来,讨论改正&/p&&p&&b&新纪元&/b&-能接受“指令”的计算器&/p&&p&有人问我,真的可以用上述提供的那些原材料(计算器、计数器、存储器、译码器)造出一个计算机吗?就像维克多·弗兰肯斯坦组装怪物一样,当一切都已经就绪,看着我们一手打造出的庞大的怪物,小心翼翼的通上电,“醒来吧,孩子”,就像给他赋予生命一般,这些破铜烂铁奇迹般的苏醒过来,按照我给他的指令,完成我想要的工作,真的,人世间没有比这样的工作更让人神往了,你能理解《模拟游戏》中Turing对克里斯托弗的一往情深吗?至少他打动了我的心。&/p&&p&扯多了,我可以很明确的告诉你,只用那些原材料确实可以打造出一台计算机,并且历史上确实有人实现了!是谁?冯诺依曼?图灵?很遗憾地告诉你,no。主人公的名字,我前边已经提到了,他叫康拉德·楚泽,1935年还是一个工科学生的他,在位于柏林的家中打造出一个可编程的计算机,一共花了3000多个继电器。&/p&&p&接下来让我们穿越回到1935左右,让我们跟随“主人公”的思路,尝试打造出一台“计算机”。&/p&&p&还记得上小学时,你学完数数,学完加减法之后,大人们常常考考你的题目是什么?“你给我算一下从1一直加到100吧”,问题是,我能用机器代替我来算数吗?哦哦,简单,我的原材料里不是有“加法器”了吗?,稍作修改就行,好,看看我的设计&/p&&img src=&/8415ede484dafc24df26_b.png& data-rawwidth=&506& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&506& data-original=&/8415ede484dafc24df26_r.png&&&br&&p&拿一个8位的加法器和一个8位的锁存器,按上述方式相连,每次我们可以通过加法器的开关输入我们要算的数(当然要输入的数是0-255之间,计算的结果也是0-255之间,在这里可以先计算1-10的和),我们小心翼翼的拨动开关,最后下方的一排指示灯显示计算的结果。简单吧(这个器件称作累加器)可是我一不小心输错了一个数怎么办?只有重新来算,完全再来一遍,好麻烦啊,有没有可以改进的方式呢?我突然想到,不是有存储器嘛,可不可以把我要计算的数据先存入存储器,再通过读取存储器的内容,把数据传送到加法器,执行运算,最后显示结果。&/p&&p&good idea!具体该怎么做呢,我给出一种实现方案&/p&&img src=&/c84dcad0e5edd0b85ed1a_b.png& data-rawwidth=&633& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&/c84dcad0e5edd0b85ed1a_r.png&&&p&一个振荡器(想想duang,duang,duang的电铃),16位计数器(我们的存储器容量不是64K X 8么,需要16根地址线),一个64K X 8的RAM(RAM连接控制面板,控制面板可以输入数据,还记得控制面板的takeover按钮是做什么用的么?),一个8位加法器和一个8位锁存器。&/p&&p&让我们闭上眼睛,来想一想,这是怎么工作的。首先,请清零开关,然后闭合控制面板上的takeover按钮,这时候控制面板接管了存储器,如果要算的有100个数,我们一次调整存储器的地址线和数据线,把数据存入h的地址空间(这一部分你明白了吗,该怎么操作控制面板呢?上述地址空间用16进制表示)。数据输入完了,我们断开控制按钮(takeover键),这时候控制面板失去对存储器的控制,断开清零开关,这时候,计数器开始工作,0000h,电信号传入存储器的地址线,存储器呢,是一个忠实的仓库保管员,来,我看看你要取什么东西,他接过传来的地址,哦原来要0000h盒子内的东西啊,好,你拿走吧,(0000h“盒子”内的东西就是刚才输入的第一个数),第一个数据传入到加法器,加法器小朋友一看,好了,你和自身相加,这不还是你自己吗?他把计算结果给了锁存器,锁气器把计算的结果放入一个临时的盒子内。经过一点时间(很短)计数器变成0001h,还是和刚才一样,计数器小朋友把自己的数给存储器管理大叔,大叔根据传过来的数,把取出的数据传给加法器小朋友,加法器小朋友执行加法运算,把得到的结果给锁存器。他们是如此的兢兢业业,乐此不疲,“机械式”的完成自己的任务,没有一点儿怨言。&/p&&p&哎,计算的结果是什么?我怎么看到指示灯在闪烁,计算的结果哪里去了?哦哦哦,计数器小朋友实在是太敬业了,根本没有办法让他停止工作,当他数到FFFFh之后又从0000h开始数数了。&/p&&p&还有这样的计算也太机械了,功能也实在是太有限了,要是我想把100个数,分成50组,计算每一组的和,这又该怎么做到呢?聪明的读者你也动动脑袋想一想,怎么做到呢?&/p&&p&楚泽看到这里也许和咱们一样皱紧眉头,怎么做呢,怎么做呢?该怎样解决这个问题呢?这时候或许突然迸发出“革命性”的想法,把运算的结果存回到RAM阵列中不行吗?这样一来,就可以在适当的时候用RAM阵列 的控制面板来检查运算结果(按下takeover),为了实现这个目的,在控制面板上加一排显示灯。eureka!&/p&&p&改变之后的连线图&/p&&img src=&/8c1058d66dbedc7bbd67d_b.png& data-rawwidth=&574& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&574& data-original=&/8c1058d66dbedc7bbd67d_r.png&&&p&这里略去了一部分,包括振荡器和清零开关。这样做是很好,但是问题来了,怎样控制RAM写入信号呢(何时存入RAM,把结果存在什么位置?)&/p&&p&假如我有一个这样的计算任务要完成:首先对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和,图示如下&/p&&img src=&/533ffcfdeb6fc903e82744_b.png& data-rawwidth=&425& data-rawheight=&343& class=&origin_image zh-lightbox-thumb& width=&425& data-original=&/533ffcfdeb6fc903e82744_r.png&&&p&图中用一小段连续的纸条(标记上连续的格子)表示一小段存储器,格子内表示存的内容。怎样使自动加法器为我们完成这项任务呢?我们不能期待向RAM阵列中输入一组数,然后自动加法器自动完成任务,自动加法器怎样“理解”我们交给它的任务,它怎么“知道”我们要他们干什么?&/p&&p&为了完成这个任务,我们需要用一些数字代码来标示加法器需要完成的每一项工作:加载(Load)、相加(Add)、保存(Save)、终止(Halt)&/p&&p&有了上述的指令,我们就可以命令计算器来工作了(暂时不去了解如何实现),对于上述的任务,可以表示如下:
(1)把0000h地址处的内容加载到累加器
(2)把0001h地址处的内容加到累加器
(3)把0002h地址处的内容加到累加器
(4)把累加器中的内容存储到0003h地址处
(5)把0004h地址处的内容加载到累加器
(6)把0005h地址处的内容加到累加器
(7)把累加器中的内容存储到0006h地址处
(8)把0007h地址处的内容加载到累加器
(9)把0008h地址处的内容加到累加器
(10)把0009h地址处的内容加到累加器
(11)把累加器中的内容存储到000Ah地址处
(12)命令自动加法器停止工作&/p&&p&有了这些指令代码,那么这些指令代码存放在哪里呢?得了,不去想了,简单粗暴的解决方式就是在加一个RAM,一个RAM存放数据,另一个RAM存放数据对应位置的操作符(也就是上文指定的那些代码),再次对我们的机器进行改造,改造后的结果如下&/p&&img src=&/4c87b392ea539c41eed286cb_b.png& data-rawwidth=&580& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/4c87b392ea539c41eed286cb_r.png&&&p&观察要仔细啊,数据的RAM即可以通过Control Panel控制面板进行输入,也可以接受外部的数据,而存储代码RAM只能通过控制面板写入!&/p&&p&那么往存储代码的RAM里写入什么内容吧?机器又不认识load、store、add、halt这些单词。既然机器不认识,我就让他们认识!解决方式,就是编码,其实两位信息编码足够
操作码,代码
Load(加载),10h
Store(保存),11h
Add(加法),20h
Halt(停止),FFh&/p&&p&这样一来,存储代码的那个RAM里边要存的内容就一目了然了&/p&&img src=&/1f7b442f1eac20bb008f4f575ec32254_b.png& data-rawwidth=&332& data-rawheight=&363& class=&content_image& width=&332&&&p&看到这里,读者有疑问吗?还是我最早提出的那个问题,机器是如何“理解”人类的语言的,我虽然把要操作的指令用0和1进行编码,但你把编码之后的内容拿给我们一手打造的这台机器,他还是“不明白”什么意思,去进行何种操作啊!我们转来转去又转回最初的起点,你让冷冰冰的机器去“理解”人类的指令,无异于天方夜谭,机器就是机器,永远也不可能具有思维,当初,我在这里也是困扰好久,哦,原来如此!&/p&&p&我已经把答案告诉你了,机器就是机器,永远也不可能具有思维&/p&&p&我不管你有没有思维,你必须完成我给你的任务,你把上述的任务算个结果出来,这一点儿或许能办到,嘻嘻&/p&&img src=&/e7c77b645be_b.png& data-rawwidth=&613& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&/e7c77b645be_r.png&&&br&&p&为了体现Load和Add命令,我的机器内部又进行了部分改变,你看出差别来了吗?&/p&&p&其实上述有一小部分没有连线。again,闭上眼睛,跟我来想想机器执行的过程,可爱的小朋友们和敬业的大叔们又来了。计数小朋友把数据给两个RAM的仓库管理员,一个取出数据,一个取出指令。数据传给累加器和2-1选择器(这是个什么鬼)?数据到了2-1选择器小朋友的面前,发现了一道门,门上写着,“此山是我栽,此树是我开,要想从此过,留下买路财”,小朋友,让我过去吧,叔叔给你糖吃,2-1选择器小朋友说,“我只有一条路,你们两个人,我让谁通过呢?”(图中,2-1选择器接收了两组数据),就在这时候,2-1选择器小朋友,收到了一条指令,这条指令来自哪里呢?哦哦,刚才管代码的RAM大叔,取出指令(10h或者,11h或者20h或者FFh),他把指令交给“指令解析器”(图中没有画)指令解析器负责把信送给2-1选择器、RAM、计数器的指令接收端(也就是2-1选择器的S,RAM的W等,在这里称为控制信号,控制信号决定机器中某些部件是否工作或者决定某些期间如何工作。例如,如果代码RAM阵列输出是load指令,2-1选择器S端收到0,如果代码RAM阵列输出是Add,2-1选择器S端收到1,操作码是指令Store时,数据RAM阵列的W收到1。实现“指令解析器”很困难吗?想一想第二节中是如何送信的,3-8译码器,译码器实现只是一种方式,当然也可以用逻辑门来实现、你明白了吗?),2-1选择器小朋友收到了0,也就是要执行Load操作,8位锁存器把临时信息保存起来。然后计数器小朋友又开始数到了0001h,这些勤劳的小朋友和勤劳的大叔又继续工作了...&/p&&p&用这种方式,我终于实现了我的想法,这真是一件值得高兴的事儿,我要好好休息下,等等,休息之前,顺便扩展一下我们的机器,让它也能运算减法。好简单,增加一条指令不就行了?Subtract(减)&/p&&img src=&/aa008dade8ed6fe728a7b082c9c3c6a3_b.png& data-rawwidth=&312& data-rawheight=&183& class=&content_image& width=&312&&&p&相应的,机器内部实现再改造下,增加一个取反器&/p&&img src=&/baeebc0c93dcf23f0d6b1_b.png& data-rawwidth=&670& data-rawheight=&674& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/baeebc0c93dcf23f0d6b1_r.png&&&p&布置一道作业题,取反器的那根控制信号线接在哪里?&/p&&p&&b&数据“流水”&/b&&/p&&p&我们从继电器打造出门电路,进而实现加法器,计数器,存储器,都是为了向我们的那个终极目标一步步前进。这就像点亮科技树的过程,一步步提高,直到实现我们的终极目标--一台可编程的通用计算机,那现在来看看,我们的科技树点亮到哪一步了,现在我们亲手打造的“能读懂人类指令的计算器”,离我们的目标还有多远?&/p&&p&来看看我们这台机器能不能完成我们想要完成的任务。假设现在要把56h和2A相加,然后再从中减去38h,结果是多少呢?不是有指令了吗?来,设置指令,让机器去完成&/p&&img src=&/232af880f3e6dcbeb0533_b.png& data-rawwidth=&526& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&/232af880f3e6dcbeb0533_r.png&&&br&&p&由于指令和数据是分开存储的,我们分别通过控制面板在RAM中输入数据,启动机器,机器就“神奇”的计算出结果,可以用个控制面板来查看计算的结果。&/p&&p&如果我的计算任务扩大一些,算一算1W个数的和吧?啊?10000个数,这时候我可以想象,站在台机器前面的“主人公”满脸苦逼的表情,我们小心翼翼的输入这指令,Load ...,Add ...,Add ...,Add ...,......Store ...。然后我们再输入数据,这真是个体力活儿啊!当我们终于把这一切都完成之后,启动机器,Come on,baby!计算吧&/p&&p&让我们再次闭上眼睛,想象机器工作的情形,计数器多么像一颗跳动的“心脏”,过一段时间发出一次“心跳”,存储器收到心跳的脉冲,从此中取出数据,数据被传送到累加器“加工厂”等待处理,要通过一道道的“门”(2-1选择器),最后会传到存储器。每每想到这里,我不禁想起在欢乐谷水上漂流的过程,穿过一道道门,经过一间间屋子,每经过一道关卡,都可能被水淋到(数据被加工),最后转了一圈回到起点,机器内部执行的过程,就是数据坐在船上“流水”的过程,不是吗?&/p&&p&让我们来看看机器算出来的结果,这可真是一个激动的时刻,辛辛苦苦拨了半天开关,现在要见证奇迹了。“咦”?怎么结果不对,这数值也太小了!&/p&&p&哦,原来如此,我的累加器只能算8位的数据,让我去安静的哭一会儿去。&/p&&p&你可能想到,把两个8位的加法器连在一起构成一个16位的设备,这是一种解决方案,但是,还有代价更小的解决办法。&/p&&p&比如要计算76ABh+232Ch,最终结果是99D7h&/p&&img src=&/87f0ddf5aca348e4d20f19_b.png& data-rawwidth=&123& data-rawheight=&82& class=&content_image& width=&123&&&p&我们可以把高低位分开来算&/p&&img src=&/9c5acf7260d0dae4cdfba7b_b.png& data-rawwidth=&159& data-rawheight=&114& class=&content_image& width=&159&&&p&低位加法&/p&&img src=&/94b774c728adf104ff28d0b647acee25_b.png& data-rawwidth=&137& data-rawheight=&99& class=&content_image& width=&137&&&p&高位加法&/p&&p&最后把计算的结果写回存储器&/p&&img src=&/76fe75c916ebeda8fd6464a_b.png& data-rawwidth=&629& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/76fe75c916ebeda8fd6464a_r.png&&&p&D7h被写入地址0002h处,99h被写入地址0005h处&/p&&p&这是很理想的状况,因为,在上述的例子中把高低位分开计算,低位计算恰巧不存在进位的情况。如果要把76ABh和236Ch这两个16位的数相加该怎么做?ABh+6Ch=117h;1h+76h+23h=9Ah。计算的结果为9A17h,怎么解决这个问题呢?可能有读者已经想到了,加一个进位锁存器(存储进位)不就行了?那我再问一句,“那我们的指令码是不是需要扩展一下呢?怎么使得译码器来触发读取进位的信号呢?”读到这里,读者也应该和我一样,我们现在不关心具体实现细节,一定会有某种逻辑门的组合来实现,对吧?下边我给出扩展的指令码(也叫作操作码)&/p&&img src=&/290ff25fd0055fab5ad2_b.png& data-rawwidth=&502& data-rawheight=&251& class=&origin_image zh-lightbox-thumb& width=&502& data-original=&/290ff25fd0055fab5ad2_r.png&&&p&上述指令中,增加了一个“进位加”(Add with Carry)和“借位减”(Subtract with Borrow)有了他们,就可以极大的扩展加法器的功能,而不仅仅局限于8位数据的运算了,可以对16位,24位,32位,40位数进行加、减法操作了!比如对两个32位数7A892BCDh和65A872FFh进行加法运算。仅仅需要1条Add指令和3条Add with Carry指令&/p&&img src=&/fcb0b3fcf56a33eb9c0160a_b.png& data-rawwidth=&590& data-rawheight=&492& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/fcb0b3fcf56a33eb9c0160a_r.png&&&p&我们通过增加操作码指令扩展的我们的“计算器”,在通往终极目标的路上又迈出了坚实的一步,“数据流水”的方式也确实也可按照我们的意愿实现一些计算任务,但是,对于计算1W个数相加之类的任务,总不能期待一条条的输入指令吧?&/p&&p&让我们看看问题出在哪里。第一,对于上图来说,保存计算结果的存储单元地址不连续。第二。当前设计的自动加法器不允许在随后的计算中重复使用的前面的中间结果,一旦我们把计算的结果写回存储器,我们就无法再次读取它的值了。&/p&&p&产生上述情况的原因就在于,我们构造的自动加法器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址,直至停机。&/p&&p&要解决这个问题,需要对我们设计的加法器做一个根本性且程度极大的改变。我想几十年前第一代的计算机的设计者康拉德·楚泽,Turing等人一定会为这个问题寝食难安,因为解决了这个问题,才可以实现真正意义上的“自动操作”,这个问题也是&b&计算器&/b&与&b&计算机&/b&最根本的区别。&/p&&p&没想到会有这么多人点赞,谢谢你们的鼓励,我们的万里长征已经看到胜利的曙光了,马上就要迎来激动人心的时刻了,请保持最后的耐心。&/p&&p&&b&数据“转圈圈”&/b&
再次看一下我们设计的机器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址(计数器小朋友在一次计数,告诉存储器管理员大叔从哪个抽屉里取数据),直至停机。但是,如果我的数据是连续存储的,并且在任意地址保存数据(也就是说,存储器存放数据的抽屉式随意的,我们只知道抽屉的编号),该怎样去取数据进行计算,并且存储计算结果啊?这时候我突然听到一声,“你傻啊,你把要取数和存数的抽屉编号告诉我不就行了?”,管理员大叔一语惊醒梦中人,是啊,有了存储器的地址不就行了?可以把数据的地址与数据的内容分开存!这可真是石破天惊&/p&&p&那就再次改变我们的设计吧,&/p&&img src=&/890bf8df8a86df61453ff3_b.png& data-rawwidth=&786& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&786& data-original=&/890bf8df8a86df61453ff3_r.png&&&p&这次,我们把指令(代码和数据的地址称为一条指令,先得到数据的地址,在根据地址取数据)放在一个RAM中,把数据存在另一个RAM中,并加了3个8位锁存器(临时存放8位数据),示意图只画出了改变的部分,其余部分与原来保持一致(累加器和代码解析器还有相应的控制信号)。指令占1个字节,16位的数据地址占2个字节,一条指令共占用3个字节,每次从RAM中取出1个字节,所以每次取出一条完整指令需要3次计数,数据地址再次传给存储器(这里多加了一个RAM),RAM取出数据传给加法器,而代码的解析与数据传输到加法器进行计算操作也需要1次计数,这必然需要更加复杂的控制信号。&/p&&p&从存储器中取出一条完整指令的过程叫做取指令,机器响应指令码的一系列操作的过程叫做执行指令,虽然机器可以自动取出指令,并执行指令,你能说它是一种“有生命”的东西吗?&/p&&p&看到这里有人可能要问,我们现在不是假设在1935左右吗?RAM是很奢侈的(500W个继电器),能不能想法舍弃掉一个RAM?把指令(代码和数据地址)与数据存在一起就可以了,这简单,还记得2-1选择器小朋友吗?(存储器部分提到了)&/p&&img src=&/c8dce29efce26d279d676e3_b.png& data-rawwidth=&734& data-rawheight=&529& class=&origin_image zh-lightbox-thumb& width=&734& data-original=&/c8dce29efce26d279d676e3_r.png&&&p&很简单,得到数据地址之后,把地址回传给存储器(此时计数器小朋友的计数无效),再次根据地址取出数据。
来看一个小例子吧,计算45h+A9h-8Eh=?,假设45h,A9h,8Eh分别存在地址0010h,0011h,0012h处,计算的结果存于0013h处。我们应该给机器这样的指令:
把0010h地址处的字节装入累加器,
把0011h地址处的字节装入累加器,
从累加器中减去0012h地址处的地址,
把累加器中的内容保存到0013h地址处,
停机,&/p&&p&数据的存储可以是任意的,我们只需要知道其相应的地址,那么指令呢?指令还是机械的顺序的往下执行,会不会出现这种情况,顺序执行指令,可是数据和指令地址冲突(要存指令的地址处已经有了重要的数据,需要跳过),指令能否跳过某一段区域,继续执行呢?&/p&&p&这涉及到指令寻址方式的改变(耐心听下去,我们万里长征,最终的一步来了,跨过他,前方就是一马平川),怎样跳过某一段儿区域,继续执行指令呢?那就jump啊,对,扩充一条跳转指令(Jump)&/p&&img src=&/3d661c746d390d611881dae08e3aef84_b.png& data-rawwidth=&491& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&491& data-original=&/3d661c746d390d611881dae08e3aef84_r.png&&&p&相应的机器内部实现也要改变&/p&&img src=&/ddaa2c668c1fc02b53a776cab39c0ffc_b.png& data-rawwidth=&800& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/ddaa2c668c1fc02b53a776cab39c0ffc_r.png&&&p&在上一步基础之上,增加了一条到计数器的数据通路,相当于告诉计数器小朋友,“小朋友,你下次从我告诉你的那个数开始计数,叔叔给你糖吃,乖~”&/p&&p&让我们回到电子线路中,计数器的实现,振荡器和D触发器串联方式(16个D触发器),我们稍作修改一下边缘型触发的D型触发器&/p&&img src=&/870faa339e7aea32c885f27_b.png& data-rawwidth=&385& data-rawheight=&259& class=&content_image& width=&385&&&br&&p&可以不用了解上图的实现,请注意我们现在重点不在于具体实现,而在于实现某一功能,我们需要为16位计数器的每一位都设置一个这样的触发器。一旦加载了某个特定的值,计数器就开始从该值开始计数(是不是用糖果把计数器小朋友收买了,呵呵)&/p&&p&Jump(跳转)指令确实很有用,但是一个有条件的跳转更有用(“我是个有原则的人,除非满足我的条件才jump”),比如要计算A7h与1Ch(十进制的28)相乘的结果,和28个A7h相加的结果相同,计算过程涉及到大量的重复操作&/p&&p&假设乘数和被乘数以及计算结果保存在一下地址:&/p&&p&1000h:00h,A7h,(16位乘数保存在此处)&/p&&p&Ch,(16位被乘数保存在此处)&/p&&p&h,(16位乘积保存在这两个连续的地址空间)&/p&&img src=&/eab1c5e3fc0ccd4fece4c16_b.png& data-rawwidth=&728& data-rawheight=&467& class=&origin_image zh-lightbox-thumb& width=&728& data-original=&/eab1c5e3fc0ccd4fece4c16_r.png&&&p&当这六条指令执行完毕之后,存储器1004h和1005h地址保存的16位数与A7h乘以1的结果相同。还要把这6条指令反复执行27次才能达到乘法的目的,如果在地址0012h处置放一条Jump指令会怎样?&/p&&p&这个过程不会停止下来,它会一直反复执行下去!&/p&&p&我们需要这样一种Jump指令,它只让这个过程重复执行所需要的的次数,这种指令就是条件跳转指令,怎么实现它呢?我给出一种实现方式,简单看看就好&/p&&img src=&/91bc8bd72f19bb5b52109b0ecd2dea33_b.png& data-rawwidth=&645& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&/91bc8bd72f19bb5b52109b0ecd2dea33_r.png&&&p&这种锁存器叫零锁存器,当8位加法器输出为零时他锁存的值才是1。有了进位锁存器和零锁存器以后,可以为指令表新增4条指令&/p&&img src=&/56f6ac745bdac4_b.png& data-rawwidth=&495& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/56f6ac745bdac4_r.png&&&br&&p&非零跳转指令只有在零锁存器输出为0时才会跳转到指定的地址,如果上一步的加法、减法、进位加法或者借位减法运算结果为0时,将不会发生跳转。只需要在常规的跳转命令的控制信号之上再加一个控制信号&/p&&p&那么继续刚才提出的问题,0012h地址之后的的指令为&/p&&img src=&/1defccdeb670c342d75b87_b.png& data-rawwidth=&648& data-rawheight=&473& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&/1defccdeb670c342d75b87_r.png&&&p&Store指令不会影响零标志位的值,只有Add、Subtract、Add with Carry、Subtract with borrow这些指令才能影响零标志位的值,当执行到地28次循环时,1004h和1005h地址保存的16位数等于A7和1Ch的乘积。1003h地址保存的值为1,他和FFh相加的结果为0.零标志位被置位!Jump If Not Zero指令不会再跳转回到0000h地址处,程序执行完成。&/p&&p&现在可以说,我们这台不断完善的机器真的可以称得上是一台真正意义上的computer了!条件跳转指令将计算器和计算机真正区分开来。&/p&&p&那么,你现在明白了吗,为什么计算机能读懂0和1?计算机和程序到底是什么?&/p&&p&数据被附在电流上不断地转圈圈(循环的过程),当满足某一条件之后,得到最终结果。&/p&&p&&b&汇编语言&/b&&/p&&p&把上述机器码表示成助记符的形式&/p&&img src=&/fffebb97f03eb04beb04a_b.png& data-rawwidth=&679& data-rawheight=&389& class=&origin_image zh-lightbox-thumb& width=&679& data-original=&/fffebb97f03eb04beb04a_r.png&&&p&那么这个乘法的程序可以写成这种形式&/p&&img src=&/f4fce2ed9c5f8ab0a6028_b.png& data-rawwidth=&351& data-rawheight=&487& class=&content_image& width=&351&&&p&编码时最好不使用实际地址,用label来指代存储器中的地址空间,所以上述程序可以改写为&/p&&img src=&/50add86b354e02d208ca72a_b.png& data-rawwidth=&744& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&744& data-original=&/50add86b354e02d208ca72a_r.png&&&p&终于在春节到来之前写完了,算是圆了自己的一份小小的心愿。&/p&&p&写的不好,欢迎大家批评改正。&/p&
这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算?
我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答…
&p&感觉楼主主要是想知道从学生到踏入工作的时候,思维上要注意或者提高的地方吧。这个问题其实还挺有意义的, 特别是我最近2年开始带人以后,有几点注意好了之后的确可以帮忙很多new grad学生更加地适应工作和职业发展。(想当年我毕业的时候,是2010年,刚踏入工作的时候犯了不少的错误;现在想想,自己的确很菜,还走了不少弯路)所以这里我回想总结了下,大概这几点要好好注意。(因为是在美国学校毕业和加入硅谷公司,所以有个别几点是针对北美;但是大部分观点还比较通用,行业是:互联网+计算机。)&/p&&p&1. 主动揽活和思考:如果说大学的时候,有老师给你布置任务而且还有deadline之类的东西。在工作上似乎开始也有领导给自己分配一些任务;如果用 tower 或者 teambition 的话,一些任务还有deadline,貌似和上学的时候一样。如果你这样想就大错特错了。工作上领导喜欢的是你能够proactive(预先主动地,这个词不好翻译) 能够自主地去把负责的事情做好。你要能自己去规划一些事情,同时有好的想法(并且是能够落地的)可以及时和他们去反馈。一般的领导只在你入职最开始的时候,像老师那样来给你布置作业,甚至还有些无微不至的关怀,但是最后希望都是你能够成长起来,独挡一面。我举个简单的例子:开始入职的时候,你就好像LOL里的英雄出生一样,你要做的是带线补刀,打小怪,就好像完成一个个任务一样;但是你在心中要有一本明确的认知:打小怪补刀赚线只是一个过程(过渡阶段),并不是全部;其目的是为了给你涨经验涨钱涨等级,然后你的目标是要发育成一个能独当一面能出去打野能gank能团战而且和整个团队互补能够配合的英雄!你不是打怪机器,也不是补刀能手,这些只是一个过程,所以你眼睛不能只看着自己今天完成了几个任务(新人的任务一般都是很小粒度的bug或者是小功能),而是心想自己通过完成这些任务可以成长多少,自己开始出去gank或者团战还欠缺什么?如何来补全?&/p&&p&2. 不要只呆在自己熟悉的圈子:这个我做得不太好,刚开始工作的时候我觉得自己之前竞赛、程序比别人写得快那么一点,于是就可以不在乎圈子和关系。于是渐渐地只和自己熟悉一些中国朋友(圈子不够国际化)吃饭和玩。到了最后我才意识到,当一个工程师做到了上面的级别,你代码能力的重要程度指数型下降而你的 soft skill(除了编程能力之外的软实力) 则越来越重要。这时你的圈子和人脉(即使在公司里)就显得越来越重要。所以,我建议你逼自己走入主流的圈子。比如:“team lunch” 这种东西,不管他们是什么牛鬼蛇神,吃什么难吃的东西,你都是要去的,是 强制的。国内的话,如果你是工程师的话,就要主动和其他部门或者公司其他职能部门多沟通和合作,不要只是简单地埋头写代码。&/p&&p&3. 看未来和趋势,而不是眼前。这点我觉得是学生事情刚踏入工作的时候最容易犯的错误。根本原因是学生时代一般都没钱也没太多眼界,所以开始挣钱了之后,觉得随便一些收入很容易满足,从而 settle down下来。我看到很多新毕业生在挑公司或者挑工作的时候,看得不是未来(趋势),而只看眼前。很典型的例子就是当年我加入Facebook的时候,旁边同学问我说为什么不去Google或者Apple,那时他们的Android和iPhone,还有搜索和Mac业务如日中天,去一个社交网站干嘛?(当时Facebook可没有Instagram,Whatsapp和Oculus VR)甚至还有人有了Facebook的offer和微软的offer或者Google的offer,最后选择去了Google的。也有人只看工资和现金,对股票和option不去研究甚至摆出一副不在乎的态度的。甚至还有人说 Google 食堂的菜更多,说Google因为有游泳池或者免费的洗衣机,真让人哭笑不得。创业路上有一句话叫做 顺势而为。看清以后发展的趋势非常重要,而且你在这个公司或者这个领域要起步之前(看清楚,是之前)就赶紧跳上去;这样才能最大限度地借势公司的成长(而不是在公司已经飞得很高的时候上去)。这些道理说出来大家好像都很明白,但是在亲自选择的时候很难不犯错误,因为人们总是不愿意思考以后的不确定性而趋向于选择当下的安逸。不然这里问几个问题? 你是选择 BAT 还是 创业公司? 是选择 互联网金融的领域 还是 O2O 领域? VR/AR 是走向爆发还是扯淡?(对的,您要思考!同学)&/p&&p&4. Prioritize your tasks:具体说来就是:学习上的课程是有限的,作业也有有限的,而且还有相对明确的deadline和最后一个期末考试;考试完结后,几乎学业清空一段时间。但是在工作上你会发现你没有一个类似暑假或者寒假的东西,另外最可怕的是你的活是干不完的 --- 对的,是无穷无尽的。特别你是在一个上升期的互联网公司的话,给你任务的速度很多时候是超过你的处理速度的。所以这个时候,你在接到一个被分配的任务或者一个email要求你干什么的时候,你不是要马上可以做,而是要强迫自己停顿下,分清现在这个任务的优先级,然后分配好开始时间,之后再开始做。这点尤其重要!特别当看到一个简单或者routine的任务被email或者tower上分配来的时候,不要因为任务简单就马上跳上去干,不然这样极可能被简单重复劳动把自己的时间全部占光,最后没来得及干重要的事情,或者没有精力去思考更加长远更有影响力的事情。所以,重申一次,去做impact和urgency最高的事情(这种事情一般来说不是很愉悦,甚至是比较棘手或者说是无从下手的事情),而把简单重复的活尽量后排(或者delegate出去)。这时你才会发现你的忙碌是有意义的,而不是伪工作(pseudo work)。我常常看到一些毕业不久的人每天都很忙,但却没有抓住重点,只是为了忙碌而忙碌,或者用更加贴切的话描述是:“为了感动自己而忙碌”。很多时候这样的忙碌,最后都是一个屁。之前在Facebook里,对于这样的同事有一个称号叫做“pseudo worker”,领导的职责是直接给他们透彻的反馈,让他们认清自己工作的impact最大化的地方到底在哪儿,同时告诫他们要忍住低impact的简单任务的诱惑。对的,那些垃圾任务有着一种诱惑;诱惑着没有定力的人一直去做,一直去做,感觉自己特别有成就感,特别“忙碌和充实”。所以要小心! 在国内创业路上也有很多这样的创始人(或者cofounders),他们自己的方向可能没怎么想清楚,或者路线制定有错,却一天到晚在朋友圈晒自己和同事们的加班,觉得这样的“忙碌”很充实。其实这是一种很可怕而且对团队极不负责的做法。一般在工作时长惊人但又没有unicorn估值的公司里,我总觉得加班是一种羞耻,是团队领导不会分优先级或者战略不明确的表现;如果创始人还一直在那里秀加班来感动自己的话,我的建议是“尽早离开这样的公司”。同时我还敢打赌,90%这样的公司在加班(和日常工作时间里)的效率非常低。&/p&&p&5. 工作并不是你的全部:这点我不太想展开,就罗列几点:a. 家庭很重要,美国人特别注重life-work balance,在工作台上经常是家庭合照; b. 可能对于没满30岁的人没有感觉。但是当你迈过30岁这个坎,你会更加注重小孩和家庭的重要性。kids are your future,这是老美们经常说的话。所以那时你应该把重心转到家庭和下一代身上,让他们成为你生命的延续(虽然这很俗,但是是事实。我们都是DNA的奴隶。) c. 你的身体才是最重要的。不停加班熬夜的时候想想自己的身体健康问题。工作上的很多事情(比如一些小的功能、小的bug)其实对于公司影响没你想象的那么大,而你的身体才是你自己最为宝贵的东西。所以多健身多锻炼作息正常别抽烟。你如果去硅谷逛一圈,最好再工作个一段时间,你会发现那边烟民很少(很多烟民是印度和中国人,还是一些发展中国家的人),而公司高管经常性的行为是早起健身和周末陪家人,然后还把各种晒幸福的照片往Facebook上发,给人一种齐乐洋洋的感觉。这是一种更加级别的炫耀,是超越了晒车晒房晒奢侈品的更加级别的一种炫耀。&/p&&p&6. 停下来思考职业规划:工作起来之后经常会觉得节奏很快,压力很大,使得整个大脑感觉像是被填满了,还有感觉在很长连续的时间里一直马不停蹄地去应付各种各样的事情。Zuck在一起Q&A的时候,被问及你是如何进行时间管理的;他回答比较长, 但是他核心说的一点就是 &Don't do thing reactively, but proactively.“ 不要机械式地做被分配的活,而是自己主动规划自己的任务和要后续锻炼和进步的方向。所以,Bill Gates 和 zuck 都会选一年中的一周停下来进行深度思考(gates的思考周),所以你的思考周在哪儿?即使你没他们那么牛,来几个思考日总归可以的吧? :D (您又尴尬地笑)&/p&&p&7. 越到后来,越感到旁边牛人的丰富,越能够了解到自己的能力和眼界的局限性,所以学会多站在巨人的肩膀上。不过更加重要的(或者经常被学生忽略的)是在平时的工作中多承认和感谢别人的帮助(在Facebook里叫 acknowledge others' credits first)。比如在 launch product、或者在做 demo 或者 任何 presentation 之前,都应该感谢这次产品或者项目的帮助者;先把他们都感谢一番,最后再说自己或者团队做的事情。只有时时刻刻去acknowledge别人贡献的人,才能不断吸引好的团队凝聚在你的周围,也只有这样你才能变成一个合格的领导者(leader)。这里推荐一本书(也是Facebook团队内部很火的书): &a href=&///?target=http%3A///Leaders-Eat-Last-Together-Others/dp/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/Leaders-Eat-&/span&&span class=&invisible&&Last-Together-Others/dp/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&img src=&/ca0f23ea2ebb_b.png& data-rawwidth=&331& data-rawheight=&499& class=&content_image& width=&331&&&br&&br&&p&8. 切忌一点:不要把不是自己做的东西说成是自己的成绩;也不要把整个团队的东西说成是自己一个人的成绩。这是大忌,请有则改之无则加勉。&/p&&br&&p&更多职业发展、留学、计算机互联网内容可以看我的专栏:&a href=&/qinchao& class=&internal&&覃超帝国兴亡史 - 在希望的田野上 - 知乎专栏&/a&&/p&&img src=&/v2-f4dc56ac36ef5ce99bfc5_b.png& data-rawwidth=&630& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&630& data-original=&/v2-f4dc56ac36ef5ce99bfc5_r.png&&
感觉楼主主要是想知道从学生到踏入工作的时候,思维上要注意或者提高的地方吧。这个问题其实还挺有意义的, 特别是我最近2年开始带人以后,有几点注意好了之后的确可以帮忙很多new grad学生更加地适应工作和职业发展。(想当年我毕业的时候,是2010年,刚踏…
1、体制外出身的孩子可能对编制没什么概念。事业单位编制,是我国几十年来人事制度的一部分。事业单位并非企业,提供具有公共属性的服务,但也不属于行政部门,处于这种定位的,叫事业单位,包括医疗、教育、科研、勘探、气象等,至少上个世纪,绝大多数知识分子都在这里面。事业单位最大的特点是不能放开手脚在市场营利,而是(理论上)由财政拨款来维持运营。拨款的其中一个重要依据就是按人头来,那么人事权就是要被集中管制的核心权力,由人事局管理。&br&&br&2、事业编制意味着工资待遇和福利,包括社保、养老等等,其实就是饭碗。然而,医院比较特殊,因为从国家看来,医院是有自己挣钱的能力的,所以,实施的是「差额拨款」,就是说大部分靠医院自收自支,小部分由财政兜底。「人员工资」是拨款的一个大头,然而这笔钱放在今天是很可怜的,比如 &a data-hash=&94f6a9aebbc& href=&///people/94f6a9aebbc& class=&member_mention& data-editable=&true& data-title=&@狮驼岭乐队小钻风& data-tip=&p$b$94f6a9aebbc& data-hovercard=&p$b$94f6a9aebbc&&@狮驼岭乐队小钻风&/a& 说自己的工资1845元一个月,很多人不信,但这都是真的,我还没有他多。我们都是靠医院自收自支,从医院的盈利中分配为奖金来活命的。加上医保什么的本身就跟城镇居民统一了,所以事业编制带来的所谓福利待遇其实算下来并不多的。&br&&br&3、事业编制真正带来的是稳定性。很多人不理解上一辈人对稳定性偏执的追求是为什么,不能理解一个大医院有编制的护士月收入几千块钱,家里却愿意花10万去找关系让她进大医院工作。因为以上一辈人的经验,我们国家「走了很多弯路」,然而这么多风风风雨雨,几千万人都下岗再就业了,而事业单位饭碗不丢,靠的都是编制。其实这也是对的,编制的确带来职业稳定,意味着你的单位要开除你的话,不可以关着门就决定了,有很多复杂的程序要走,所以只要你没干什么大逆不道的事情,基本保得住饭碗。这对于医疗这种经常「出事」的高风险行业尤其重要,因为如果没有编制在,出了事可能领导就要拿你去背锅,所谓的「临时工」。再举个最近的例子,看看什么叫事业单位里没有编制的人:&br&&img src=&/961a7e5a97d0eaf5b90adbafac2aed34_b.png& data-rawwidth=&550& data-rawheight=&628& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/961a7e5a97d0eaf5b90adbafac2aed34_r.png&&一句话:编制之于事业单位,就是劳动法之于企业。对于员工,这就是劳动保障的根本。&br&此外,稳定还有个优点,就是组建家庭的时候少了很多不确定性。如果你每年都可能跳槽,还有可能换个城市混,你在这儿买房么?生娃么?&br&&br&4、其实对于医生,人事的稳定好处甚多。这个行业本身就是长战线,终生学习是固有属性,尤其是大医院的医生,要持续成长到中年,长时间固定位置利于培养。对于基层,编制可能是最大的吸引力,跟公务员类似,待遇不高,然而稳定,给人安全感。&br&&br&5、但是,编制的弊端也是显而易见的。这种稳定太过稳了。换成三十年前没有问题,所有行业都这么稳。可时代变了,我在互联网行业工作的同学已经跳槽第 5 次了,而对于事业单位的人,大部分是预计要在一个单位干一辈子的。时间久了,就会习惯,也许你业务熟练,然而面对社会丛林之残酷,就远不如其他快节奏行业那么灵动了。&br&&br&6、取消编制是不可逆转的趋势。因为医疗是包袱,国家要扔掉这个包袱。国人的健康需求越发强烈,公立医疗是个无底洞,医保有多少,就会花空多少,要么让所有人再加倍地缴纳,要么干脆包给市场。资本进入医疗市场的核心障碍就是人才资源集中在公立医院,越优秀越不愿意走。取消编制,短期看是不再拨这部分(可怜的)款,长期看是给市场开仓放粮。&br&&br&7、别忙叫好。走向开放是好的,打破旧制度是好的。坏的是「破而不立」。打破旧体制,然后任由市场来蚕食,其结果是国有资产流失。市场要挣钱,然后你给他们发了枪。首先被扔进丛林里捕杀的,是老百姓而已,毕竟羊毛出在羊身上。说个形象点的假设,以后看病难都好解决了,你挂不上号,住不了院,我会给你个选项,不远处有个民营医院,我的前任同事在那儿当主任,你愿意的话我开个条子你直接去,马上做手术。我对他水平有信心,所以心里没什么过不去的,还能提成几千。这是拿公立医疗的资源,去市场变了现,还是理想情况。现实是,可能你去了民营那边,多给你做点不需要做的事情,多收点不需要收的钱。挣钱的人变多了,羊毛出在羊身上,医疗的总体成本是升高的。「打破旧体制」是正在发生的事情,而如何让跃跃欲试要到医疗市场挣钱的人别乱来,这才是值得担忧的,他们可比公里体系难管多了。&br&&br&8、取消编制不等于会立即提高薪酬。因为规范的民营医疗尚未形成,目前的12000多家民营医院,有接近80%是莆田系,其中大部分靠的还是坑蒙拐骗,他们对于大规模挖人还不感兴趣,培养客服团队更重要。&br&&br&9、取消编制对于年轻人是残酷的。医生的培养周期非常长,就算博士毕业,一样无法独当一面,一般得到35岁才会初步成型。大医院之所以愿意招一个不到30岁的来再给他几年十年的时间成长,是因为他绝大多数情况下不会走人,所以值得花时间培养。一旦人才流动性变大,医院一定是优先考虑无需再花时间培养的、已经能独当一面的人才。对于35岁以前的来说,就是要医学院-研究生-住院医师规培-专科医师规培走完,才会在人才市场上讨喜。处于这个交接时期的年轻人,最要担忧不是未来在哪吃饭,而是怎样尽早尽快地练就本领。&br&&br&10、这个时代,所谓的铁饭碗,就是技术和持续学习的能力。铁饭碗不是别人端给的,是自己捧在手里的。变革迟早会来,要保持觅食的能力,外面的世界变化大,节奏快,现实无比,不讲情面。将来那些不依赖体制,还能吃医生这口饭的,才是真正的人才。&br&&br& 听闻&a data-hash=&f20cde2d8d9a6f4ad2ae5d& href=&///people/f20cde2d8d9a6f4ad2ae5d& class=&member_mention& data-tip=&p$b$f20cde2d8d9a6f4ad2ae5d& data-hovercard=&p$b$f20cde2d8d9a6f4ad2ae5d&&@田吉顺&/a& 医生已经先行一步,离开公立体制,到丁香园旗下机构从医。预祝一帆风顺!
1、体制外出身的孩子可能对编制没什么概念。事业单位编制,是我国几十年来人事制度的一部分。事业单位并非企业,提供具有公共属性的服务,但也不属于行政部门,处于这种定位的,叫事业单位,包括医疗、教育、科研、勘探、气象等,至少上个世纪,绝大多数知…
&p&这两天忙,等我下周一9.14再更新。评论末端有水月同学的打包下载链接。&/p&&p&我推荐电子书阅读,也推荐各位给能买到纸质书的作者一点真正的支持。未必现在买他们的书,等您有钱也不晚。作者们知识珍贵,分享不易。谢谢大家。&/p&&p&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&/p&&br&&p&我来推荐十本书。你们听好了。受益了要请我喝酒。&/p&&p&我在广州,一定要提前预约。但喝酒我一般都有时间。&/p&&p&实在没办法请我喝酒的,那么就去请你身边的酒鬼,喝一发。&/p&&p&我们天下酒鬼是一家!&/p&&p&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&/p&&p&题目谈到充实,所以我的推荐偏沉。题目谈到电影,这个我不专业就不说了。&/p&&p&&b&第一本书:《遥远的救世主》作者:豆豆&/b&&/p&&p&这是一本囊括了人性和神性的书。&/p&&p&你可以看清楚一个聪明人是怎样赚钱的,&/p&&p&是怎样把握人性的,&/p&&p&是如何尊重他人的,&/p&&p&是如何面对自己的孤独感的。&/p&&p&因为这是一本小说,不是一本哲学书,所以我先推荐这本书,希望您能看进去。&/p&&p&此处请记住,我是一个逼格很高的酒鬼。&/p&&p&关于这本书,这个作者,她的丈夫,都是传奇,读完了可以顺藤摸瓜找来看看。&/p&&p&&b&“顺藤摸瓜是一个非常棒的读书习惯”。不用谢。慢慢来。&/b&&/p&&p&&b&第二本书:《金翼:中国家族制度的社会学研究》作者:林耀华&/b&&/p&&p&这是一本你看两个的家族兴衰起落,后宏观的对比自身家族的书。&/p&&p&你是谁?&/p&&p&你从哪里来?&/p&&p&你的家族转折点在哪里?&/p&&p&这些牵连的人物和所谓的“命运”到底在你身上发生了哪些化学作用?&/p&&p&这是一本林先生的小说,写于四十年代,他是哈佛的人类学博士,也是书中的某一个人物。&/p&&p&这种切身的,但是笔触轻巧的小书特别棒棒!&/p&&p&爷爷奶奶姥姥姥爷的青春和过往都是有来处,有去处的。&/p&&p&采访一下他们?&/p&&p&&b&第三本书:《项塔兰》作者:格里高利·大卫·罗伯兹&/b&&/p&&p&哈哈哈哈。我一推荐这本书就想笑怎么办?我把作者简介放在这里吧?&/p&&blockquote&&p&格里高利·大卫·罗伯兹(Gregory David Roberts),出生于澳大利亚墨尔本,他的“真实经历”比任何小说都更具传奇色彩,从学生时代就是个激进的运动分子,活跃于各种反战、反法西斯、反政府组织,深信自己可以改变世界。优异的天赋,使他成为大学中最年轻的哲学和文学讲师,却在25岁婚姻破裂,失去妻子,更失去5岁爱女的监护权。他选择用海洛因来填补生命中乍然到来的空洞,从一个理想主义者堕落为毒虫。&/p&&p&上瘾的需求逼使他拿着仿造手枪,以全套西装打扮、温和的谈吐、礼貌的举止,去抢劫银行,因而获得“绅士大盗”(The Gentleman Bandit)的封号。被捕后,24次的抢劫纪录换来19年徒刑。两年半后,罗伯兹于光天化日下逃出澳大利亚最戒备森严的重刑监狱,短暂停留新西兰,然后流亡印度。&/p&&p&这段长达八年的印度流亡岁月,便成了《项塔兰》最真实的蓝本。1991年他在德国被捕,决心坦然面对过去,入狱服刑。1997年获释出狱后,他着手写下《项塔兰》这部厚达千页的自传式小说,2003年出版后一鸣惊人,成为专职畅销作家。&/p&&/blockquote&&p&容我推测你不知道这本书,他不是很大众。但是是不是很有趣的样子?&/p&&p&这既是一段人生经历,也是一个城市的故事。&/p&&p& 我想每个城市都应该有这样一个人,这样一个故事。。。&/p&&br&&p&&b&第四本书:第四本:《傅雷家书》&/b&&/p&&p&对于不是世家出身,父母对孩子的教养更多时候在自己的生命经验的局限当中。&/p&&br&&p&傅雷先生是大家,对子女的关爱,在本书中体现的淋漓尽致,反观自身的修养,体会父母那“不高明”的舐犊深情。&/p&&p&然后好好爱他们呀,肉麻的说,妈妈你好棒棒啊!爸爸我好崇拜你啊!&/p&&br&&p&但在爱和尊严相悖时你会如何选择?个体生命被时代洪流裹挟而去。下文是傅雷遗书。&/p&&blockquote&&p&谁也不知道傅雷夫妇在赴死前的最后几小时里商量过什么,他们死后,警察发现了一封由工笔小楷誊写而成的遗书:&/p&&p&人秀:&/p&&p&尽管所谓反党罪证(一面小镜子和一张褪色的旧画报)是在我们家里搜出的,百口莫辩的,可是我们至死也不承认是我们自己的东西(实系寄存箱内理出之物)。我们纵有千万罪行,却从来不曾有过变天思想。我们也知道搜出的罪证虽然有口难辩,在英明的***领导和伟大的&a href=&///?target=http%3A///doc/5341846.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&毛主席&i class=&icon-external&&&/i&&/a&领导之下的中华人民共和国,决不至因之而判重刑。只是含冤不白,无法洗刷的日子比坐牢还要难过。何况光是教育出一个叛徒傅聪来,在人民面前已经死有余辜了!更何况像我们这种来自旧社会的渣滓早应该自动退出历史舞台了!&/p&&p&因为你是梅馥的胞兄,因为我们别无至亲骨肉,善后事只能委托你了。如你以立场关系不便接受,则请向上级或法院请示后再行处理。&/p&&p&委托数事如下:&/p&&p&一、代付九月份房租55.29元(附现款)。&/p&&p&二、武康大楼(&a href=&///?target=http%3A///doc/5691522.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&淮海路&i class=&icon-external&&&/i&&/a&底)606室沈仲章托代修奥米茄自动男手表一只,请交还。&/p&&p&三、故老母余剩遗款,由人秀处理。&/p&&p&四、旧挂表(钢)一只,旧小女表一只,赠保姆周菊娣。&/p&&p&五、六百元存单一纸给周菊娣,作过渡时期生活费。她是劳动人民,一生孤苦,我们不愿她无故受累。&/p&&p&六、姑母&a href=&///?target=http%3A///doc/5404863.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&傅仪&i class=&icon-external&&&/i&&/a&寄存我们家存单一纸六百元,请交还。&/p&&p&七、姑母傅仪寄存之联义山庄墓地收据一纸,此次经过红卫兵搜查后遍觅不得,很抱歉。&/p&&p&八、姑母傅仪寄存我们家之饰物,与我们自有的同时被红卫兵取去没收,只能以存单三纸(共370元)又小额储蓄三张,作为赔偿。&/p&&p&九、三姐朱纯寄存我们家之饰物,亦被一并充公,请代道歉。她寄存衣箱贰只(三楼)暂时被封,瓷器木箱壹只,将来待公家启封后由你代领。尚有家具数件,问周菊娣便知。&/p&&p&十、旧自用奥米茄自动男手表一只,又旧男手表一只,本拟给敏儿与×××,但恐妨碍他们的政治立场,故请人秀自由处理。&/p&&p&十一、现钞53.30元,作为我们火葬费。&/p&&p&十二、楼上宋家借用之家具,由陈叔陶按单收回。&/p&&p&十三、自有家具,由你处理。图书字画听侯公家决定。&/p&&p&使你为我们受累,实在不安,但也别无他人可托,谅之谅之!&/p&&p&傅雷梅馥一九六六年九月二日夜&/p&&/blockquote&&br&生活本身是那么的不可预知,在一个不可预知的时代中是生死的惶惑,自我的湮灭。当今的迷茫也是一样,换一个面目追求生活的本质和意义罢了。&br&&br&&p&&b&第五本书:《夹边沟记事》作者:杨显惠&/b&&/p&&br&&p&当年我看的时候,第一次觉得本书平易近人的像看门大爷。但这样一个人给你娓娓道来当年的惨烈。就会觉得特别难以接受。这是一本访谈大饥荒年代的白描书,完全没有任何玩弄文字的手法。只有赤裸裸的数字,白花花的骨头。&/p&&br&&p&冯小刚先生拍摄1942,更加加深了我对他的热爱。如果您看了这本书,在看这部电影,看看您的感受是否和我一致。这是唯一一个中国导演,首次碰触此类题材的。&/p&&br&&p&我的推荐,喜欢向后看,看向历史的几十年前。那并不远不是么?&/p&&p&阅兵了,我们开始眼含热泪的内心震动的感激老兵。&/p&&p&建立一个历史观,可能更深刻的将一个视角和纬度内嵌在自己的思维坐标系里。&/p&&p&既不容易被推翻,也不容易被煽动。您各位说呢?&/p&&br&&p&&b&第六本书:《大商人》作者:傅国涌&/b&&/p&&br&&p&&b&何谓大商人:&/b&&/p&&p&是民国时代的那些中国企业家们。他们背负着振兴中国的内心使命,在清廷的倒塌和军阀的混战以及国民政府的挤压中,坚守实业救国的理想。最终成为那个时代的一批丰碑似的雕像。&/p&&p&他们代表了近代中国企业家的奋斗历程。在1949年之前大抵上有三批人。从第一代的买办如陈启源,到第二代的如状元张謇,再到第三代留洋的如范旭东,侯德榜等人。这三代企业家中的大部分都生活简朴,克己奉公。具备了一切我们近些年推崇的西方经典企业家的种种美德。&/p&&br&&p&何处得知此书:&/p&&p&在读张鸣先生的《无所谓与无所畏》时,他文章中有一篇写到民国企业家,提到了好友傅国涌,以及傅国涌先生写的《大商人》一书。作为一个创业者,遂四处求书一读。结果早已绝版。在网上以高价买了一个印刷粗劣的复印版。&/p&&br&&p&本书的最动人之处:&/p&&p&用一句话来概括那就是,张謇塑造了20世纪初的中国第一城——南通。&/p&&p&个人太欣赏张謇老先生了。把他的创业时间轴整理了一下。&/p&&p&? 1886年,产生“中国需振兴实业,其责需在士大夫”的念头&/p&&p&? 1894年,文武百官跪在雨中迎接慈禧。不做磕头虫,从此远离官场。&/p&&p&? 甲午战争后,形成实业和教育救国的念头。决定“舍身饲虎”。&/p&&p&? 1896年,选中唐家闸办大生纱厂。&/p&&p&(在同年代许多大城市未曾标注的世界地图上,小镇唐家闸进入国际视野)&/p&&p&? 1897年,不回京做官。“愿成一分一毫有用之事,不愿居八命九命可耻之官。”&/p&&p&? 1899年,筹备4年的大生纱厂开机。张四先生时年,47岁。当年已盈利。&/p&&p&? 大生纱厂开办后,陆续在唐家闸,开办了广生油厂,大兴面粉,资生铁厂,甚至大生轮船公司等。&/p&&p&? 1901年,建立通海垦牧公司。开垦盐碱荒地,持续十年之久。&/p&&p&垦荒做了三件事,筑堤,开河,修路。从茫茫一片终不见人的海滩发展到兴隆的市镇。&/p&&p&? 1903年,建立通州师范学校。校歌中有一句,“民智兮国牢”。&/p&&p&理念是,教育救国,要先做实业支撑教育。是为“父教育,母实业”&/p&&p&? 1903年,建立了翰墨林书局,印制许多日本译作。&/p&&p&? 1905年,建立女子师范学校。后农校,纺校,医校相继诞生。&/p&&p&截止1922年,张四先生70岁时,共建立各类学校400多所。大体做到了普及小学教育。&/p&&p&? 1906年,在通州师范开设政法课,请留学生普及宪政知识。&/p&&p&? 1907年,大生二厂开机。第一年也盈利。15年里盈利超过500万两。&/p&&p&? 1910年,安排植树造林,至少十几万棵。&/p&&p&? 1912年,60大寿,号召大家建立一个养老院。&/p&&p&? 1913年,建立唐闸公园。&/p&&p&? 194年,请沈寿教出一批刺绣女学生。由沈寿口述,张謇执笔的《雪宦绣谱》成为工艺史上的传世经典。&/p&&p&(张先生的八卦就在此。。。他和沈女士有绯闻。嗯)

我要回帖

 

随机推荐