等不上wwWwww.11ddaa.com99啦为什么应该,是跳转到www.11ddaa.com99cOm别的地方啦

update: 强烈不推荐搞学术、做量化使用此方法,此方法只适用于商科PPT犬,做一些定性分析时使用。&br&-----&br&我不是搞经济学的,但是最近做实习,要找N多千奇百怪的data,其中有些变态的数据,找来找去都找不到。&br&&br&但是在某个一霎那,你会突然发现某个report/paper 里刚好有我们想要的数据。就像这样:&br&&figure&&img src=&https://pic2.zhimg.com/326b18fbac7eabbf1340089_b.png& data-rawwidth=&1068& data-rawheight=&613& class=&origin_image zh-lightbox-thumb& width=&1068& data-original=&https://pic2.zhimg.com/326b18fbac7eabbf1340089_r.png&&&/figure&来源:&a href=&//link.zhihu.com/?target=http%3A//www.colliers.com/-/media/files/marketresearch/apac/china/northchina-research/bj-residential-q1-2015.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&colliers.com/-/media/fi&/span&&span class=&invisible&&les/marketresearch/apac/china/northchina-research/bj-residential-q1-2015.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&但是然并卵... 你去email colliers 要data 他并不会理你啊。&br&&br&这时候就轮到神器登场了,&a href=&//link.zhihu.com/?target=http%3A//arohatgi.info/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ankit Rohatgi&/a& 开发的 &a href=&//link.zhihu.com/?target=http%3A//arohatgi.info/WebPlotDigitizer/app/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebPlotDigitizer&/a&。&br&&br&&figure&&img src=&https://pic1.zhimg.com/24bafdef54_b.png& data-rawwidth=&1225& data-rawheight=&850& class=&origin_image zh-lightbox-thumb& width=&1225& data-original=&https://pic1.zhimg.com/24bafdef54_r.png&&&/figure&&br&上传我们想要的图片:&br&&br&&figure&&img src=&https://pic2.zhimg.com/155a0b61f4a570dce929d_b.png& data-rawwidth=&1218& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&1218& data-original=&https://pic2.zhimg.com/155a0b61f4a570dce929d_r.png&&&/figure&&br&描好坐标轴和点:&br&&br&&figure&&img src=&https://pic4.zhimg.com/a58da35de421b5bc7ffdc2c2f87bc2eb_b.png& data-rawwidth=&1226& data-rawheight=&853& class=&origin_image zh-lightbox-thumb& width=&1226& data-original=&https://pic4.zhimg.com/a58da35de421b5bc7ffdc2c2f87bc2eb_r.png&&&/figure&&br&&figure&&img src=&https://pic2.zhimg.com/112aa2dcc590f_b.png& data-rawwidth=&1207& data-rawheight=&770& class=&origin_image zh-lightbox-thumb& width=&1207& data-original=&https://pic2.zhimg.com/112aa2dcc590f_r.png&&&/figure&&br&导出数据,大功告成!&br&&figure&&img src=&https://pic4.zhimg.com/add43916f7_b.png& data-rawwidth=&818& data-rawheight=&384& class=&origin_image zh-lightbox-thumb& width=&818& data-original=&https://pic4.zhimg.com/add43916f7_r.png&&&/figure&&br&当然还有其他的,比如&br&&a href=&//link.zhihu.com/?target=http%3A//www.datathief.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Welcome to DataThief&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//digitizer.sourceforge.net/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&digitizer.sourceforge.net&/span&&span class=&invisible&&/&/span&&span class=&ellipsis&&&/span&&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.getdata-graph-digitizer.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Digitize graphs and plots&/a&&br&或者你也可以自己写matlab code啥的识别&br&&br&反正我是懒得下载软件/自己写code。&br&---------&br&其他可以解锁的技能:&br&NO1.使用 &a href=&//link.zhihu.com/?target=http%3A//arohatgi.info/WebPlotDigitizer/app/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebPlotDigitizer&/a& 自动识别曲线。&br&NO2.使用 &a href=&//link.zhihu.com/?target=http%3A//arohatgi.info/WebPlotDigitizer/app/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebPlotDigitizer&/a& 处理数据后使用&a href=&//link.zhihu.com/?target=https%3A//plot.ly/external& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Plotly&/a&直接画出曲线。&br&NO3.使用 &a href=&//link.zhihu.com/?target=http%3A//arohatgi.info/WebPlotDigitizer/app/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebPlotDigitizer&/a& 识别对数坐标轴
update: 强烈不推荐搞学术、做量化使用此方法,此方法只适用于商科PPT犬,做一些定性分析时使用。 ----- 我不是搞经济学的,但是最近做实习,要找N多千奇百怪的data,其中有些变态的数据,找来找去都找不到。 但是在某个一霎那,你会突然发现某个report/pap…
&b&&i&&u&Seer&/u&&/i&&/b&&br&A Windows quick look tool.&br&&br&中文:
&a href=&//link.zhihu.com/?target=http%3A//sspai.com/31712& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一分钟,让你的 Windows 学会 OS X 的「一指禅」:Seer&/a&&br&&br&英文: &a href=&//link.zhihu.com/?target=http%3A//www.ghacks.net//seer-better-file-previews-for-windows/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&https://www.ghacks.net//seer-better-file-previews-for-windows/&/a&&br&&br&法语:&a href=&//link.zhihu.com/?target=http%3A//www.geekzone.fr//seer-previsualisation-a-os-x-windows/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Seer : une pr?(C)visualisation ?
la OS X pour Windows&/a&&br&&br&西班牙语:&a href=&//link.zhihu.com/?target=http%3A//es.gizmodo.com/este-sencillo-programa-trae-a-windows-una-de-las-mejore-& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Este sencillo programa trae a Windows una de las mejores funciones de Mac: Quick Look&/a&&br&&br&日文:&a href=&//link.zhihu.com/?target=http%3A//ottan.xyz/windows-osx-like-quick-look-seer-3780/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Windowsで、OS XのQuick Lookを実現する「Seer」&/a&&br&&br&葡萄牙语:&a href=&//link.zhihu.com/?target=http%3A//www.softdownload.com.br/visualize-arquivos-windows-seer.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Visualize arquivos no Windows com o Seer&/a&&br&&br&瑞士语: &a href=&//link.zhihu.com/?target=http%3A//feber.se/pc/art/346869/seer_ger_windows_macliknande_p/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&feber.se/pc/art/346869/&/span&&span class=&invisible&&seer_ger_windows_macliknande_p/&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&&br&&br&&figure&&img src=&https://pic4.zhimg.com/ddae88bb1d8eca17293c7_b.png& data-rawwidth=&1100& data-rawheight=&619& class=&origin_image zh-lightbox-thumb& width=&1100& data-original=&https://pic4.zhimg.com/ddae88bb1d8eca17293c7_r.png&&&/figure&&br&&br&视频&br&&figure&&img src=&https://pic4.zhimg.com/add46c3df886fdf_b.jpg& data-rawwidth=&1086& data-rawheight=&670& class=&origin_image zh-lightbox-thumb& width=&1086& data-original=&https://pic4.zhimg.com/add46c3df886fdf_r.jpg&&&/figure&&br&&br&文本
代码类高亮 , 并且 &b&支持 json 和 xml 的格式化查看 ,文本编码检测&/b&&br&&figure&&img src=&https://pic3.zhimg.com/a349ef9ade_b.jpg& data-rawwidth=&962& data-rawheight=&918& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&https://pic3.zhimg.com/a349ef9ade_r.jpg&&&/figure&&br&&br&markdown&br&&figure&&img src=&https://pic1.zhimg.com/6b613c13b3cb37b32f9d04_b.jpg& data-rawwidth=&712& data-rawheight=&766& class=&origin_image zh-lightbox-thumb& width=&712& data-original=&https://pic1.zhimg.com/6b613c13b3cb37b32f9d04_r.jpg&&&/figure&&br&&br&图片. 包括psd 和gif 这样的动态图&br&&figure&&img src=&https://pic3.zhimg.com/45bdffe49a0be7dc5129e_b.jpg& data-rawwidth=&662& data-rawheight=&942& class=&origin_image zh-lightbox-thumb& width=&662& data-original=&https://pic3.zhimg.com/45bdffe49a0be7dc5129e_r.jpg&&&/figure&&br&&br&压缩包&br&&figure&&img src=&https://pic3.zhimg.com/3d4fa2edbd3800c0bca76da_b.jpg& data-rawwidth=&762& data-rawheight=&619& class=&origin_image zh-lightbox-thumb& width=&762& data-original=&https://pic3.zhimg.com/3d4fa2edbd3800c0bca76da_r.jpg&&&/figure&&br&&br&&br&文件夹&br&&figure&&img src=&https://pic1.zhimg.com/fb6a0bf273a1f53afe918a6b_b.png& data-rawwidth=&962& data-rawheight=&809& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&https://pic1.zhimg.com/fb6a0bf273a1f53afe918a6b_r.png&&&/figure&&br&&br&还有一些 PDF 啊 啥的常用格式都是滋次的。&br&&br&&br&初始状态是为了和 OS X 功能保持一致。&br&但很多功能都在设置里面。比如 Seer 会多一个Control bar。&br&&br&&figure&&img src=&https://pic1.zhimg.com/15d436d7a49b057be78418_b.png& data-rawwidth=&682& data-rawheight=&510& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&https://pic1.zhimg.com/15d436d7a49b057be78418_r.png&&&/figure&&br&&br&&br&&br&除了预览 office 需要本地软件支持(2007版本及以上),其他都不需要。Office 默认不开启,需要手动设置。因为慢&不完善。&br&也就是说, &b&新装的Windows系统就可以查看所有格式,&/b&&b&新装的Windows系统就可以查看所有格式,&/b&&b&新装的Windows系统就可以查看所有格式。&/b&&br&&br&&br&&br&好了...上两个好评:&br&&figure&&img src=&https://pic3.zhimg.com/ad5f0b61e6e676f9afd354fd97a2d326_b.png& data-rawwidth=&1610& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&1610& data-original=&https://pic3.zhimg.com/ad5f0b61e6e676f9afd354fd97a2d326_r.png&&&/figure&&figure&&img src=&https://pic3.zhimg.com/d546dd796fcd2dedc948a_b.png& data-rawwidth=&745& data-rawheight=&293& class=&origin_image zh-lightbox-thumb& width=&745& data-original=&https://pic3.zhimg.com/d546dd796fcd2dedc948a_r.png&&&/figure&&br&&br&&br&&br&我跟你讲我就这个表情~~~~ &br&&figure&&img src=&https://pic3.zhimg.com/35f39cfda52e_b.png& data-rawwidth=&462& data-rawheight=&503& class=&origin_image zh-lightbox-thumb& width=&462& data-original=&https://pic3.zhimg.com/35f39cfda52e_r.png&&&/figure&&br&&br&&br&&br&FYI ,不支持 xp。&br&最低支持 vista,不过没测。只测了win7 win8 win10。&br&从 0.4.0 开始改成了安装版,25M大小。&br&&br&&b&&u&软件还在加紧开发改进中,所以,有什么建议或者意见,可以给我反馈~~&/u&&/b&&br&由于这是个独立程序,都是用个人业余时间开发的。所以可能会有一些不尽人意的地方,但我会持续改进下去。 : )&br&是的,作者是我。 &br&&br&&a href=&//link.zhihu.com/?target=https%3A//sourceforge.net/projects/ccseer/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Seer download&/a&&br&&br&谢谢大家&br&&figure&&img src=&https://pic1.zhimg.com/fe82e4cdc70_b.png& data-rawwidth=&48& data-rawheight=&48& class=&content_image& width=&48&&&/figure&
Seer A Windows quick look tool. 中文:
法语: 西…
&figure&&img src=&https://pic1.zhimg.com/ecd5e0a2ecee18_b.jpg& data-rawwidth=&406& data-rawheight=&205& class=&content_image& width=&406&&&/figure&“计算机科学的两件难事:缓存失效和命名。”&br&当然这里的命名有着更深层的意思,比如W3C的各种术语。已经有很多教我们如何命名的规范 &a href=&//link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Naming_convention_%28programming%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Naming convention (programming)&/a& ,每个编程语言都有各式各样的命名规范【像CSS就有几套非常有效的规范(OOCSS,BEM,SMACSS,SUITCSS,Atomic...)】但这些规范并不能消除我们的问题,每个程序员或多或少都在编程过程中为变量和函数命名苦恼过。&br&借用网络上的一个例子试着解释一下:&br&&blockquote&你要开发一个游戏,有人,可以开枪。人的对象有个走的行为,你把方法命名为Walk(),很简单。枪的对象有个射击的行为,你把方法命名为Fire(),还是很简单。不过这两个对象在画布里需要动起来,你给他们命名为update()。当另一个人看到这个方法时他会有些疑问,这个update是更新什么?要不要持久化到数据库?&a href=&//link.zhihu.com/?target=https%3A//www.quora.com/Why-is-naming-things-hard-in-computer-science-and-how-can-it-can-be-made-easier& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&quora.com/Why-is-naming&/span&&span class=&invisible&&-things-hard-in-computer-science-and-how-can-it-can-be-made-easier&/span&&span class=&ellipsis&&&/span&&/a&&/blockquote&这是ITworld发起的一个投票,其中不分年龄不分经验接近半数的人认为命名是最头疼的事情。&br&&a href=&//link.zhihu.com/?target=https%3A//www.reddit.com/r/ProgrammerHumor/comments/2f2on0/programmers_hardest_tasks/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Programmers' hardest tasks : ProgrammerHumor&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//blog.jobbole.com/50708/%23rd%3Fsukey%3Dfc78a5ac0d81ca5ff3dd56e6fcfe6fcaeddb3dcb3eb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序员最头疼的事:命名&/a&&br&&figure&&img src=&https://pic3.zhimg.com/5aa72e7ad866d8b9c6be_b.jpg& data-rawwidth=&485& data-rawheight=&566& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic3.zhimg.com/5aa72e7ad866d8b9c6be_r.jpg&&&/figure&&br&&br&母语是英文的开发者为命名苦恼,非英文母语的开发者更加为此苦恼。当你到github上参与开源项目的贡献的时候,或者准备开源自己的作品的时候,或者设计一个框架的时候,命名会是一个一直伴随你的不大不小的问题。&br&但开发语言跟语言一样除了语法外当然要堆词汇了,有各种计算机术语大全的书,还有计算机专用词典。但有趣的是开发语言也有很多“方言的词汇”,甚至不同的编程语言还有自己的”方言词汇“,要让别人看懂你的代码你还不得不用上这些方言常用的词汇。如果不是有了解你根本不可能想起这些词汇【好比说初始化就有很多方言(init,boot,launch...)】这就得堆经验了,要多看堆经验是很慢长的过程。&br&我们平时当然会先查单词,再比较近义词,必要还要Google一下与我们期望表达的关联性。但是还是没有底,还是不满意,对,没有底,不满意。就一个变量名函数名随着迭代的进行已经被我们改了多少次。有时候你巴不得身边有个人直接告诉你。&br&堆经验的方法是很笨的,没有捷径,多看书和源码。参与的越多经验自然就越多,找个大型的开源项目参与翻译文档是个不错的开始,但如果你并不用到这个项目或者说这个项目与你当前从事的领域关联不大,收效并不明显。因为缺乏实践。&br&如何不改变我们的平时的习惯就能日积月累的收获变量命名的经验呢?&br&回顾我们平时的习惯:1.查单词;2. 比较单词语义;3. 比较代码上下文;4.确定命名。&br&只要把这几个步骤缩短就能节省大量时间。&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a& 就是帮我们缩短这些步骤的一个变量名搜索工具。&br&&a href=&//link.zhihu.com/?target=http%3A//www.solidot.org/story%3Fsid%3D46539& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Solidot | Codelf通过搜索在线开源平台的项目源码帮开发者给变量命名&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.cnbeta.com/articles/465237.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Codelf 搜索开源代码帮程序员命名_Open Source 开源_cnBeta.COM&/a&&br&&figure&&img src=&https://pic2.zhimg.com/8dc9ee215e1d9e158042aebfd0e348f9_b.png& data-rawwidth=&764& data-rawheight=&227& class=&origin_image zh-lightbox-thumb& width=&764& data-original=&https://pic2.zhimg.com/8dc9ee215e1d9e158042aebfd0e348f9_r.png&&&/figure&&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a& 支持直接搜索中文,当你查中文的时候,Codelf 会直接查好单词和单词的近义词给你,然后再搜索Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Project上的开源项目的源码匹配出与这些词汇相关的变量名和函数名。Codelf 可以选择开发语言进行搜索,结果会把同个源码文件里匹配的变量名排在一起,如你选择“CSS”然后搜索“product”&figure&&img src=&https://pic1.zhimg.com/ff162addcefcd_b.png& data-rawwidth=&888& data-rawheight=&819& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&https://pic1.zhimg.com/ff162addcefcd_r.png&&&/figure&&br&&br&你可以立即查看对应的源码,多少能学习到别人的设计,如果代码的业务与自己相投,对梳理自己的业务是有帮助的。&br&&figure&&img src=&https://pic1.zhimg.com/0f25accfddaa4bf19cc4db3eecf1682c_b.png& data-rawwidth=&953& data-rawheight=&780& class=&origin_image zh-lightbox-thumb& width=&953& data-original=&https://pic1.zhimg.com/0f25accfddaa4bf19cc4db3eecf1682c_r.png&&&/figure&&br&我们求知欲的本能是看到什么想到什么就想立即了解它知道它,过后就不了了之了,每个开发者都有想看源码学习的本能,可惜看源码是一件非常烧脑的过程,Codelf 有让碎片时间看看源码变得轻松有趣,随手掏出手机一搜索就可以打发时间了。如过圣诞节,选择JavaScript语言搜索“圣诞树”就看到一段短小的圣诞树代码,很有趣的算法呢&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E5%259C%25A3%25E8%25AF%259E%25E6%25A0%2591& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic2.zhimg.com/24962daec88fb6edd980a871_b.png& data-rawwidth=&378& data-rawheight=&678& class=&content_image& width=&378&&&/figure&&br&当然,你还可以直接查看源码来源的仓库Repo;直接拷贝变量名等。&br&&figure&&img src=&https://pic4.zhimg.com/fab79ce42e3e35e22c2ad426be85a9b3_b.png& data-rawwidth=&403& data-rawheight=&268& class=&content_image& width=&403&&&/figure&Codelf会让你的变量命名变得有趣,如果你是个有文学细胞的人,那会更加欢乐了,让我们来搜索一些2015年的热词:&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E8%E6%25B4%259E%25E5%25A4%25A7%25E5%25BC%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic1.zhimg.com/36fec545e911ebbc3e040c_b.png& data-rawwidth=&468& data-rawheight=&684& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic1.zhimg.com/36fec545e911ebbc3e040c_r.png&&&/figure&&br&&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E6%E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic2.zhimg.com/9abcdfbf3f356e379e259_b.png& data-rawwidth=&470& data-rawheight=&616& class=&origin_image zh-lightbox-thumb& width=&470& data-original=&https://pic2.zhimg.com/9abcdfbf3f356e379e259_r.png&&&/figure&&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E4%25B8%25BB%25E8%25A6%%259C%258B%25E6%25B0%%25B4%25A8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic3.zhimg.com/42ba99bf1efe_b.png& data-rawwidth=&487& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&487& data-original=&https://pic3.zhimg.com/42ba99bf1efe_r.png&&&/figure&&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E8%2589%25AF%25E8%25BE%25B0%25E5%25A5%%2599%25AA%25E5%%25E5%25BA%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic2.zhimg.com/78cafd1daf7fad9ff238dd_b.png& data-rawwidth=&477& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&https://pic2.zhimg.com/78cafd1daf7fad9ff238dd_r.png&&&/figure&&br&&a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/%23%25E5%25B8%25A6%25E4%25BD%25A0%25E8%25A3%%2580%25BC%25E5%25B8%25A6%25E4%25BD%25A0%25E9%25A3%259E& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&br&&figure&&img src=&https://pic3.zhimg.com/17b03b0caacb1adbfb1e6_b.png& data-rawwidth=&473& data-rawheight=&701& class=&origin_image zh-lightbox-thumb& width=&473& data-original=&https://pic3.zhimg.com/17b03b0caacb1adbfb1e6_r.png&&&/figure&&br&&br&下面是一些相关连接:&br&&ul&&li&&b&Codelf: &a href=&//link.zhihu.com/?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&/a&&/b&&br&&/li&&li&&b&Codelf 的 github repo: &a href=&//link.zhihu.com/?target=https%3A//github.com/unbug/codelf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&unbug/codelf · GitHub&/a&&/b&&br&&/li&&li&&b&Two hard things: &a href=&//link.zhihu.com/?target=http%3A//martinfowler.com/bliki/TwoHardThings.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TwoHardThings&/a&&/b&&br&&/li&&/ul&&br&最后是一个找到的与Codelf相关的段子,哈哈:&br&&blockquote&场景1,话说,今天产品汪又来找我了,我昨天才切完图,肯定是改需求&br&场景2,尼玛,又要改好友列表,要在里面添加关注状态&br&场景3,关注,未关注,互相关注,前面两个好命名,后面那个怎么写好呢?作为一个有点英文水平的程序员肯定不会用什么Each-follow之类的,想想就不对劲,但是用什么我还真特么不知道&br&场景4,看看微博怎么搞的呗,我先找个互相关注的按钮瞧瞧,一点进去就是女神的,可女神没有关注我啊,怎么办&br&场景5,女神是交互MM啊,我就找个借口说测试一个渣浪,我X,我特么好2,这么明显谁不知道啊,但是我特么还是干了啊,天啦撸啊&br&场景6,女神关注我了也,赶紧把之前发的一些不正经的微博删除了,别在女神山前损形象啊,我去,我怎么转发了那么多苍老师的。。。太没品了,尼玛,sister是什么鬼,我竟然寂寞到转发韩国妹&br&场景7,好了,回来看微博的关注按钮吧,可是我X,这是什么鬼命名,我实在看不懂,难道压缩了?&br&场景8,难倒我了,那我看看twitter的啊,必须啊,人家歪果仁肯定有好的命名&br&场景9,我得翻墙啊,不然上不去,GFW草泥马啊。&br&场景10,花了10块钱买了个mz代理总算上去了,可是我特么没人关注我啊,有注意了,叫女神上去关注我呗,这样之前的嫌疑就可以避开了,哈哈,机智如我&br&场景11,好说歹说女神上去了,又花了10块帮女神买了个代理,本来想请女神吃饭的,怕太明显了被看出来。&br&场景12,我叼,女神关注我了啊,女神里面也是唯一一个我关注了她,好像荒岛上就我俩个一样,又YY了一把。&br&场景13,我了个X,Twitter并没有互相关注的按钮,人家直接显示“followrs you”,我去,这太明了了,我们的产品汪真是没法比啊&br&场景14,我把产品汪喷了一顿,结果人家还是没有改,因为人家给我买罐可乐,我太没种了,竟然就让了&br&场景15,明天再想吧,命名是大事,就为了这个整天啥活也没干,下班都不好意思走啊。。。。&br&场景16,我想起来了,有个叫 Codelf 的变量命名神器,我去搜搜索。&br&场景17,直接搜索 “相互 follow”&br&&figure&&img src=&https://pic2.zhimg.com/ba9f0c4d7fef_b.png& data-rawwidth=&475& data-rawheight=&573& class=&origin_image zh-lightbox-thumb& width=&475& data-original=&https://pic2.zhimg.com/ba9f0c4d7fef_r.png&&&/figure&神器就是神器啊!!!!此时一万只草泥马打了我的脸&/blockquote&
“计算机科学的两件难事:缓存失效和命名。” 当然这里的命名有着更深层的意思,比如W3C的各种术语。已经有很多教我们如何命名的规范
,每个编程语言都有各式各样的命名规范【像CSS就有几套非常有效的规范(OOCSS,BEM,SMAC…
我现在初三,不算是黑客,只是凭着兴趣去玩玩而已。&br&&br&原答案:&br&肯定有很多人知道社工库(不懂自行百度),说白了就是个查密码人肉用的,我大概两三年前弄了个社工库名字叫“密码库”,做得还挺大的,身份证,扣扣,开房记录什么的都能查,百度“社工库”排名最高到过第一,后来我被警察叔叔查水表了,还好我没满十六岁……&br&&br&这里主要说下我是怎么把密码库做起来,又是怎么倒闭的,想起来伤感(?_?),我语文不好,写得不好不要介意。&br&&br&在小学六年级的时候,偶然发现了一种网站叫做社工库,当时觉得牛逼透了,特别是一个叫做“捜云”的,数据库特大,而且帐号很便宜(刚开始的时候10元一个永久,现在竟然涨到了800元),我随便上一个论坛,输入帐号就可以拿到密码,刷积分,刷回复什么的,爽死了?(?? ??)?,于是我也掂量着想搞一个玩玩,刚开始只是兴趣爱好,后来为什么收费待会讲,于是我走上了不归……啊呸……&br&&br&由于我之前跟几个人合伙搞过一个IDC网站,还弄了个论坛,人不多(网站现在还在开,只是我退出了),所以那时候开一个网站很熟练,我很快就弄了一个简易社工库,这个社工库是我在网上找的97bug社工库的php源码改来的,很简单,就是把社工数据制成文本格式,查询的时候读入内存然后搜索,那时我用了一台SSD的VPS主机,导入了了CSDN600W,如家汉庭2000W等一些数据。&br&&br&一段时间后,一些新闻媒体相继报道了社工库blablabla,之前做得比较大的数据库纷纷倒闭,搜云的站长Acn在关闭搜云后往网上扔了一个30G的社工数据和搜索源码,有4亿条内容,MSSQL2012格式。那时我网站还小,水表还没查到我这儿,我就继续开了下去。&br&&br&我看到这个30G的数据后,我先是购买了一台硬盘比较大的VPS,2G内存,200G硬盘,然后发现根本没法查,速度慢成乌龟,然后我就下“血本”,花了600元淘宝租了一个月的服务器,CPU是两颗L线程,1TB硬盘。弄好后查询一次要花3秒。&br&&br&小学毕业后,一个漫长的暑假,然后是无聊的初一。我为了“扩张”社工库,参照着Bootstrap自己设计了一个前端UI,那时我玩易语言比较多,略懂一些HTML,而对PHP一片空白,几乎每一句代码都查一次百度,花了我差不多2个星期才完成了UI和一个简单的会员系统,然后我起了个名字叫做“密码库”,并注册了几个域名,密码库从此诞生了~~鼓掌~~&br&&br&后来我就开始慢慢完善这个网站,修复一些BUG,完善了会员系统,开始了收费,每个邀请码收费20元。&br&&br&网站慢慢做大了,自然有人嫉妒,对我的网站进行DDOS,经常出现打不开的情况。于是我就网上找了个代理备案,花了300元把域名备案后弄了个阿里云主机,网站打开终于快多了。&br&&br&后来不知道怎的,Acn又重开了搜云,还号称加了几十亿数据,比我网站现在的4亿牛逼多了,然后我联系Acn,想找他要这个数据的查询API,他(TM)竟然要价800元,好吧,忍了。我吐槽下Acn的人品真不怎么好,先是他给我的API查询一次得30秒就算了,好时断时续,后来我才知道这个数据是在他自己的电脑上的,得等他电脑开机才能查,吐血。最后竟然直接关了API接口,还不给退钱了,(TM)的。&br&&br&后来有个叫“落花雨”的人加了我的Q,要我的网站源码跟他换了在115网盘上的一堆数据,刚开始当然不答应,后来还是忍不住o(╯□╰)o,这可是几百G的大数据~。拿到数据后,才看到是一堆各种乱七八糟格式的文件,有zip的,txt的,sql,mdb的,我凌乱了。&br&&br&--------------割割,说点题外话---------------&br&碰巧这个时候我的那台macbookpro充电器坏掉了,再顺便吐槽下这充电器,到现在5年已经坏了3次了,现在正在吃灰中。我爸同时也是为了我别总是在床上躺着用电脑,直接跟我一起挑配件组装了一台台式机,兴奋之余也有一点小失望。我爸给我挑CPU的时候,差点就用上5820K了,竟然我爸的一个朋友进来一看,立马就说5820K只是核数多频率低没用,X99主板还死贵,直接PASS掉,/(ㄒoㄒ)/~~给我换了个4790K,知友们,真是这样么(;′⌒`)&br&-----------------------再割----------------------------&br&&br&有了新电脑后,我终于能在本地搭建数据库研究了,研究了几天后,我是这样解决的,方法有点蠢,我先在搜索栏输入.rar,.zip这些关键字,然后全选右键解压,然后百度下了个文件去重删除重复数据,用易语言写了个小程序,历遍所有文件,读入数据,处理后放到一个单独的文件夹里,然后再写了个程序生成一段mssql代码把文件逐行导入,我分成了10个表,每个表10亿数据,用了8个表,建完索引后,数据文件有3TB大,数据量够恐怖了吧,为了提高搜索速度,我后来在budgetvm花了200刀每月弄了台4*2tb黑盘的服务器,做了raid0,那读写速度好酸爽,不看4k的话持续读写快过ssd。&br&&br&网站就是这样做起来的,慢慢网站人数越来越多,服务器慢慢支撑不起庞大的搜索量,期间也换过好几个服务器,花了不少钱,所以我最后把邀请码提价到了100元/个。&br&&br&-----------------------再割----------------------------&br&然后高潮的来了。。。&br&&br&一天早上,我还和平常一样来到学校,上着英语课,突然,一个陌生人来到教室门口,把我叫到了教导处。&br&&br&警察叔叔:你好,我是海口xx公安局的,还有这位是深圳来的砖家,这网站是你弄得?……这位深圳砖家是昨晚连夜做飞机过来的……之前那个盗取银行卡密码的人你认识不?&br&&br&补充下,警察叔叔说的应该是这个&a href=&//link.zhihu.com/?target=http%3A//news.sina.cn//detail-ichmifpx5019750.d.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&17岁少年盗19万张银行卡信息!逆天密码原来应该这样设&/a&,这个17岁的少年,我(TM)肯定不认识啊。&br&&br&blablabla……一堆话后,我爸来到了学校,然后又blablabla……,然后就来到了我家,把我的4790k的主机搬走了,心疼,而且说好的过几天就还,然后过几天,再过几天,再过几天,到了我最后一次来公安局录信息的时候,警察叔叔又说储藏室门没钥匙,下次再来拿,(TM)还有下次?(&﹏&br&做笔录的时候我最记得,一个房间里有个椅子,上面有手铐,我当然不用带,我就在上面一边玩手机一边回答问题(≧?≦)/&br&&br&#更新,这里有段话被删了,天朝你们懂得#&br&&br&然后这事就这样“完”了。&br&&br&-------------------割-------------------&br&再写几个好玩的故事哈哈&br&&br&在小学的时候,学校旁边有个黑网吧,很多同学一下课就跑进去,甚至有通宵的,于是我就在服务器上下载了一个SYN DDOS的小工具,然后通过QQ显IP找到我同学所在的网吧IP,D过去,整个网吧断网,不一会小学生们吧网吧闹翻了6……&br&&br&电脑课上的时候,老师教我们VB,我做完后,顺手在后面加了两句代码&br&&div class=&highlight&&&pre&&code class=&language-text&&Shell &net user administrator 123123&,vbHide
Shell &shutdown -s -f&,vbHide
&/code&&/pre&&/div&老师检查作业的时候,你们能想到老师的表情么/(ㄒoㄒ)/~~&br&&br&学校的电脑上是装着还原卡的,而且还不能插U盘。好像是增霸(忘了,初三狗电脑课取消了),我打开一看,竟然没密码,直接关掉了开机还原,关闭了U盘限制。然后拿着U盘趁老师不在把教师端远程控制拷贝到我的机子上。老师不在的时候电脑全部归我管^_^,一次同学们在做作业的时候不小心把全班的电脑关闭了。。。&br&然后。。。
我现在初三,不算是黑客,只是凭着兴趣去玩玩而已。 原答案: 肯定有很多人知道社工库(不懂自行百度),说白了就是个查密码人肉用的,我大概两三年前弄了个社工库名字叫“密码库”,做得还挺大的,身份证,扣扣,开房记录什么的都能查,百度“社工库”排名…
&p&这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算?
我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答,大家也只是解释了一部分问题,没有完整的把计算机整个的抽象层次说清楚。在大学里我看到了 Charles Petzold的《编码
隐匿在计算机软硬件背后的语言》,这部永不退色的计算机经典著作,为了讲明白了这件事儿,今天我决定用自己简略的话,回顾一下作者写作的思路,用我的理解为大家讲述计算机的工作原理。希望我能够完成。&/p&&p&今天的计算机已经变得相当复杂,是有史以来人类创造的最复杂最精密的仪器,没有之一,是二十世纪技术领域的“登峰造极之作”,计算机与生俱来的层次化体系结构,掩盖了技术背后最本质的东西,现在已经很少有人去关心计算机最本质的工作原理,我希望能剖析计算机一层层‘“抽象”面纱,展现最本质的“计算”过程。基本的知识基础是高中物理,高中数学。&/p&&br&&p&第一节 计算器&/p&&p&下面回到高中课堂,我依稀记得在电磁学那一部分,讲到了电磁继电器,当时老师说,继电器是很重要的发明,我打开物理课本,“什么破东西嘛”,太简单了,那时候觉得像继电器这样的发明没什么用。高中数学中也讲到,布尔代数,简单老说就是,与、或、非,而且教科书上说,布尔代数意义重大云云。下面问题来了,我只用继电器能不是实现简单的计算器?注意是“计算器”,而不是计算机,答案是肯定的,来,那就看看,如何用继电器打造出一个”计算器“,进而打造出一台”计算机“&/p&&figure&&img src=&https://pic3.zhimg.com/1fcd5eebb66_b.jpg& data-rawwidth=&991& data-rawheight=&422& class=&origin_image zh-lightbox-thumb& width=&991& data-original=&https://pic3.zhimg.com/1fcd5eebb66_r.jpg&&&/figure&&p&两个继电器串联,点亮一盏灯,这算不算实现了“与”的操作呢?两“真”为”真“&/p&&figure&&img src=&https://pic1.zhimg.com/5d53b4b54c655ee27b1e8c_b.jpg& data-rawwidth=&1018& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&1018& data-original=&https://pic1.zhimg.com/5d53b4b54c655ee27b1e8c_r.jpg&&&/figure&&p&两个继电器并联,点亮一盏灯,是不是实现了”或“的操作?一真为真&/p&&figure&&img src=&https://pic4.zhimg.com/0c6a6c0b33ad91d0c399d55fd662da97_b.jpg& data-rawwidth=&1081& data-rawheight=&413& class=&origin_image zh-lightbox-thumb& width=&1081& data-original=&https://pic4.zhimg.com/0c6a6c0b33ad91d0c399d55fd662da97_r.jpg&&&/figure&&p&一个继电器本身就可以实现”非“的操作&/p&&p&这样一来,物理上的继电器,和布尔代数,完美的融合起来,我把与或非门继电器实现称作”物理层“,每张图右边的符号表示,称作”布尔逻辑层“,从”物理层“到”布尔逻辑层“是我们的第一层抽象,很简单吧?(当然现代计算器从物理实现到逻辑实现,已经不再使用继电器,而是在硅芯片上雕刻一个个的晶体管,但晶体管的数量绝对不会减少,这一点@丁旭 已经说得很明白) &/p&&p&接下来可能有人问,你整这些小儿科的东西,有什么用呢?别急,看我慢慢展开!&/p&&p&我们知道,布尔代数是一种数学,既然是在一种数学,那么存在数学运算啊,数学运算能用继电器实现吗,of course&/p&&figure&&img src=&https://pic3.zhimg.com/df0c9b68c81acddbc64bae_b.jpg& data-rawwidth=&1245& data-rawheight=&582& class=&origin_image zh-lightbox-thumb& width=&1245& data-original=&https://pic3.zhimg.com/df0c9b68c81acddbc64bae_r.jpg&&&/figure&&p&一个或门,一个与非门,一个与门,按照图示连在一起形成了一个最常见的运算,异或运算,”相同为假,不同为真“,那物理实现上怎么做呢?请在大脑中想想怎么连线,一共七个继电器就可以实现,有了异或运算,我们就可以实现更复杂的运算,下面就和我们实现一台”计算器“直接相关了&/p&&figure&&img src=&https://pic1.zhimg.com/f895be5fdc8725ffc9f188eac4beef38_b.jpg& data-rawwidth=&976& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&976& data-original=&https://pic1.zhimg.com/f895be5fdc8725ffc9f188eac4beef38_r.jpg&&&/figure&&p&一个异或门和一个与门,形成一个”半加器“,图示下边的符号表示一个半加器,这里是新一层的抽象,从布尔逻辑运算到”计算器件“的抽象&/p&&figure&&img src=&https://pic4.zhimg.com/698a1aae7a4e46bab7f75b_b.jpg& data-rawwidth=&1202& data-rawheight=&577& class=&origin_image zh-lightbox-thumb& width=&1202& data-original=&https://pic4.zhimg.com/698a1aae7a4e46bab7f75b_r.jpg&&&/figure&&p&有一个半加器,距离我们实现手工打造一个”计算机“还很远,然而两个半加器,一个或门,可以实现一个”全加器“,为什么叫全加器呢?因为我们使用它可以实现一位加法的计算!(这里是二进制,问题的题目,为什么计算机能读懂”0“和”1“,看到这里是不是心头一喜呢?)&/p&&figure&&img src=&https://pic2.zhimg.com/b0e15c8c39ec1_b.jpg& data-rawwidth=&1097& data-rawheight=&601& class=&origin_image zh-lightbox-thumb& width=&1097& data-original=&https://pic2.zhimg.com/b0e15c8c39ec1_r.jpg&&&/figure&&p&有了一位”全加器“,我们实现8位加法的计算还远吗?当然不远,8个全加器,按图示相连,就可以实现8位加法计算(和我们在纸上进行加法运算很像,进位的操作很显然。当然,这里都是进行二进制加法),右下方是8位加法器的表示方式。&/p&&p&要是这会儿在19世纪,在电力革命的年代,我一定要亲手打造一个计算器!&/p&&figure&&img src=&https://pic2.zhimg.com/abcfb25ca278b6e76fd1be5_b.jpg& data-rawwidth=&1164& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&1164& data-original=&https://pic2.zhimg.com/abcfb25ca278b6e76fd1be5_r.jpg&&&/figure&&p&画的比较简陋,见过卡车上的按钮吗?上下拨动的那种,这是我穿越回19世纪站在专利局门口,阐述我”伟大”的发明,“我发明的计算器,有两排输入按钮,每个按钮上下拨动表示输入的是0或者1,最下排是9个灯泡,灯泡的亮与灭,指示这一位是0,还是1,我的发明是划时代的,可以把人类从繁杂的计算过程中解救出来...”&/p&&p&“什么?就因为我的计算器不能实现减法运算儿拒绝我的专利申请,减法运算?减法运算,怎样实现计算机的减法运算呢?”&/p&&p&计算机发展过程中,最重要的思想是“抽象”,一层层的抽象封装了实现的细节,使的计算机开发人员更关注与逻辑的实现,相信有了我上面的表述,读者应该能看懂下边的抽象思想:&/p&&figure&&img src=&https://pic1.zhimg.com/c48d5ad5b23a47402bddfd269bd073a4_b.png& data-rawwidth=&700& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/c48d5ad5b23a47402bddfd269bd073a4_r.png&&&/figure&&p&这个电路实现了把输入的数据取反(0-&1,1-&0)&/p&&figure&&img src=&https://pic4.zhimg.com/efa7a48ff632c3bbdc403_b.png& data-rawwidth=&546& data-rawheight=&228& class=&origin_image zh-lightbox-thumb& width=&546& data-original=&https://pic4.zhimg.com/efa7a48ff632c3bbdc403_r.png&&&/figure&&p&这是求补器的“抽象”&/p&&p&减法的逻辑实现我直接给出,相信读者也应该能看明白&/p&&figure&&img src=&https://pic3.zhimg.com/4bda23f057aa9c2306872_b.png& data-rawwidth=&669& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&669& data-original=&https://pic3.zhimg.com/4bda23f057aa9c2306872_r.png&&&/figure&&p&我还清楚的记得,在计算机组成这门课上,老师讲述,原码和补码概念,“在计算机内部,正数的补码是它本身,负数的补码,记得取反加1“,为什么取反加1呢?看看上边的实现,计算机内部如何实现减法?有个取反操作,还有个进位操作,这不正是”取反加1“吗?&/p&&p&下面从逻辑实现层,回到物理层,思考下,需要多少继电器才能实现这样的 ”小发明“,算了,吓一跳吧?然而我们的计算机先驱康拉德·楚泽花费了十年心学,3000多个继电器才早出一个计算机原型,所以,,,本着向先哲致敬的精神,让我们在大脑中”打造出“一台计算机&/p&&figure&&img src=&https://pic2.zhimg.com/deb93fdac708c_b.png& data-rawwidth=&686& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&https://pic2.zhimg.com/deb93fdac708c_r.png&&&/figure&&p&”我的专利不仅仅能实现加法操作,也能实现减法操作,计算具有普遍性,具有划时代的意义,可以把人类从复杂的计算中解救而出来...“&/p&&p&至此,我们实现了一个简单的计算器实现,不难吧?然而这才只是万里长征的第一步。&/p&&p&接下来我来说说,计算机是如何存储信息的,这真是个费力活儿,在不太遥远的过去,二十年前,计算机的存储量还非常有限,我记得初中那会儿还没有MP3,用磁带听歌,直到最近,存储技术才有了长足的进步,当然这是后话。&/p&&p&第二节,计数器&/p&&p&人类的感官,听觉,触觉,味觉,视觉,感官器官接受外界的刺激,在大脑中留下神经信号,进而形成对“外部世界”的认识,那抽象的事物怎么去认识呢?&/p&&p&电灯通电点亮灯泡,高中的物理知识解释,足够了。电可以让物体运动,这个道理人人都懂。坐在回家的高铁上,让我想想一下高速列车是如何运动的:驾驶员按下通电按钮,带动电车引擎,电车引擎通过传动装置把牵引力传给电车车轮,列车得以启动。高速列车的动力系统也相当复杂,我不了解每一个实现的细节,但是我可以想想出电车引擎的工作原理,为什么?因为这些都是实实在在的实物,看得见摸得着。那我想想出计算机的工作原理吗?答案是不能,为什么?因为计算机一层层的“抽象”,一个小小的物理器件上集成了上亿的基本元器件,使计算机真正的工作原理是我们越来越遥远。&/p&&p&下面还让我们回到19世纪末,二十世纪初,那个激荡人心的电力革命的年代,让我们去还原真实的技术实现过程。回到高中物理课堂&/p&&p&我们已经讲解了如何去制造一个一台简易的“计算器”,不知不觉下课了,这时我听到一阵刺耳的下课铃声。电铃和计算机有关系吗?我直接上图吧&/p&&figure&&img src=&https://pic4.zhimg.com/ccab_b.jpg& data-rawwidth=&500& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic4.zhimg.com/ccab_r.jpg&&&/figure&&br&&p&注意看旁边的那个金属小锤子&/p&&figure&&img src=&https://pic2.zhimg.com/efbc42bb94d00e4ae80eb5_b.png& data-rawwidth=&570& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&https://pic2.zhimg.com/efbc42bb94d00e4ae80eb5_r.png&&&/figure&&p&电铃的工作原理如上图所示,大家想象下,电铃的小锤子震荡起来敲打金属盖发出声音的情形,duang,duang,daung,形象吧?(这种电路叫做震荡器)&/p&&figure&&img src=&https://pic3.zhimg.com/a324e541ffe65a6faf82b2_b.png& data-rawwidth=&513& data-rawheight=&168& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&https://pic3.zhimg.com/a324e541ffe65a6faf82b2_r.png&&&/figure&&p&振荡器是不是可以实现计数功能呢?交替的输出0和1,哈哈,感叹造物的神奇吧!&/p&&p&下面我们再来看一些神奇的电路,当初的先驱们是怎么想到这些复杂而精致的设计&/p&&figure&&img src=&https://pic4.zhimg.com/b6e75df9b37dbd5afaa343_b.png& data-rawwidth=&614& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&https://pic4.zhimg.com/b6e75df9b37dbd5afaa343_r.png&&&/figure&&p&闭上上方的电路,灯亮了&/p&&figure&&img src=&https://pic1.zhimg.com/0d6a50c628f05d316bf3c_b.png& data-rawwidth=&582& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&https://pic1.zhimg.com/0d6a50c628f05d316bf3c_r.png&&&/figure&&p&断开上方的电路,灯依然在亮&/p&&figure&&img src=&https://pic1.zhimg.com/35e969d3c178a380f62b5cb8f6375270_b.png& data-rawwidth=&499& data-rawheight=&199& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&https://pic1.zhimg.com/35e969d3c178a380f62b5cb8f6375270_r.png&&&/figure&&p&闭合下方电路,灯灭了&/p&&figure&&img src=&https://pic4.zhimg.com/92b6eaf9db307a7_b.png& data-rawwidth=&488& data-rawheight=&187& class=&origin_image zh-lightbox-thumb& width=&488& data-original=&https://pic4.zhimg.com/92b6eaf9db307a7_r.png&&&/figure&&p&断开下方的电路,灯依然不亮&/p&&p&电路的奇特之处在于:同样是在开关都断开的状态下,灯泡有时候亮,有时候不亮,当开关都断开时,电路有两个稳定状态,这类电路叫做“ 触发器”。(英国物理学家1918在工作中发现的)&/p&&p&触发器电路可以保持信息,确切的说,可以“记忆”某些信息,他可以“记忆”那个开关先闭合。触发器是一个大家族,大家要是有兴趣可以去看相关资料。请记住一点!触发器是用来“记忆”信息的,我再给出两类常用的触发器&/p&&figure&&img src=&https://pic2.zhimg.com/8f1fa6ecea31_b.png& data-rawwidth=&517& data-rawheight=&247& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&https://pic2.zhimg.com/8f1fa6ecea31_r.png&&&/figure&&p&这个叫做“D型触发器”,具体实现如上图,我们的表示一直都停留在很“底层”,一直都很关注实现的细节,随着细节实现越来越多,我们需要上升到高一层的层次,更加关注功能的实现,而不是陷于细节实现的泥潭!(想一想,为什么说,计算机具有与生俱来的层次结构)&/p&&p&数据端简写为D,时钟端简写为Clk,功能表如下:&/p&&figure&&img src=&https://pic2.zhimg.com/eb33d69de15ff30fcda3b0d_b.png& data-rawwidth=&248& data-rawheight=&194& class=&content_image& width=&248&&&/figure&&p&脑袋里想象下,触发器是一个很听话的孩子,当clk端通电时,相当于告诉孩子,“孩子啊,你要记住我传给的信息”,clk断电时,孩子在自由自在的玩耍,完全不接受任何传过来的指令,很形象,不是吗?&/p&&p&在D型触发器的基础上实现了更复杂的功能,“ 边缘触发的D型触发器”&/p&&figure&&img src=&https://pic3.zhimg.com/c935dbb047ae91a8ddd145011eeb7dee_b.png& data-rawwidth=&587& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&https://pic3.zhimg.com/c935dbb047ae91a8ddd145011eeb7dee_r.png&&&/figure&&p&“抽象”图&/p&&figure&&img src=&https://pic2.zhimg.com/e81dfaf7af19_b.png& data-rawwidth=&156& data-rawheight=&91& class=&content_image& width=&156&&&/figure&&p&again,抽象的思想,使我们脱离的细节实现(上图),更加关注功能&/p&&figure&&img src=&https://pic1.zhimg.com/6f72ffb9fce_b.png& data-rawwidth=&220& data-rawheight=&145& class=&content_image& width=&220&&&/figure&&p&向上的箭头,表示电信号从0到1变化的那一瞬间有效,再次在脑袋里想象下,触发器是一个很听话的孩子,当clk从0-&1变化时,相当于告诉孩子,“孩子啊,赶紧接住我给你的球,球在这里指信息”,其他状态下,孩子在自由自在的玩耍,完全不接受任何传过来的指令。&/p&&p&有人问,说了这么多,到底想干什么?好的,告诉你,用这些可以实现一个计数器,记得小孩子学数数吗?我们要做的的就是要用机器来从0开始数数,真的吗?恩,离这一步已经很近了,不信看下边&/p&&figure&&img src=&https://pic4.zhimg.com/fd8fa89f2ff60fbff7ba9f_b.png& data-rawwidth=&369& data-rawheight=&156& class=&content_image& width=&369&&&/figure&&br&&p&简单的,把振荡器和触发器相连&/p&&figure&&img src=&https://pic1.zhimg.com/232f79df6e2e612d67f3bc2bd779dafc_b.png& data-rawwidth=&518& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&https://pic1.zhimg.com/232f79df6e2e612d67f3bc2bd779dafc_r.png&&&/figure&&br&&p&电平信号的变化&/p&&p&稍微扩展一下,实现更复杂的功能,应该能看明白吧&/p&&figure&&img src=&https://pic4.zhimg.com/65c84dbb7a2ad9ca691aff_b.png& data-rawwidth=&528& data-rawheight=&179& class=&origin_image zh-lightbox-thumb& width=&528& data-original=&https://pic4.zhimg.com/65c84dbb7a2ad9ca691aff_r.png&&&/figure&&p&电平信号的变化(标上0和1)&/p&&figure&&img src=&https://pic1.zhimg.com/cb7db76c286e_b.png& data-rawwidth=&594& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&https://pic1.zhimg.com/cb7db76c286e_r.png&&&/figure&&p&嗨嗨,清醒下,我们得到了什么?把上图顺时针旋转90度,你发现了吗&/p&&figure&&img src=&https://pic3.zhimg.com/ae382b0ce95c316b8eeb4e2_b.png& data-rawwidth=&354& data-rawheight=&461& class=&content_image& width=&354&&&/figure&&p&这不就是在计数吗?用二进制的方式计数!&/p&&p&把8个触发器连接在一起,然后放入一个盒子里,构成了一个8位计数器,能从0数数到2^8-1,(0-255),这个计数器称为“8位行波计数器”&/p&&figure&&img src=&https://pic3.zhimg.com/dc95beb4ba_b.png& data-rawwidth=&477& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&https://pic3.zhimg.com/dc95beb4ba_r.png&&&/figure&&p&现在,我们已经懂得如何继电器来做加法、减法、计数了,这一件很有成就感的事儿,使用的技术也是100多年前就存在的技术。&/p&&p&第三节 存储器&/p&&p&我想用继电器打造一个存储量为64K x 8的存储阵列,我能实现吗?这会儿可是在二十世纪初!如果我穿越回那个年代,一定会再次为我的“发明”申请专利,如果真是这样,那计算机的发展史上会留下我的名字(呵呵,意淫一下),下面就看看我是如何实现我的“发明”吧&/p&&p&上节,我已经提到,触发器可以“记忆”1位的信息&/p&&figure&&img src=&https://pic4.zhimg.com/aa16bb2ce862a99723af1bb_b.png& data-rawwidth=&563& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&https://pic4.zhimg.com/aa16bb2ce862a99723af1bb_r.png&&&/figure&&p&就是上图这个样子,我们把它抽象成:&/p&&figure&&img src=&https://pic1.zhimg.com/77b631ab0_b.png& data-rawwidth=&227& data-rawheight=&137& class=&content_image& width=&227&&&/figure&&p&我们把上图称作“1位锁存器”,想一想,两个输入线和一个输出线都是什么意思,我上节已经解释过,来、来、来,想一想那个淘气的小朋友。&/p&&p&有了“1”,那么距离“100000”还会远吗?无非就是如何组织n个“1”,“抽象”的量级提升的过程&/p&&figure&&img src=&https://pic1.zhimg.com/fdb0e7f337c_b.png& data-rawwidth=&736& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&736& data-original=&https://pic1.zhimg.com/fdb0e7f337c_r.png&&&/figure&&p&这是8位锁存器&/p&&figure&&img src=&https://pic4.zhimg.com/e6001e7cee4fee19efb3f0e93b29c4bf_b.png& data-rawwidth=&490& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&490& data-original=&https://pic4.zhimg.com/e6001e7cee4fee19efb3f0e93b29c4bf_r.png&&&/figure&&p&简写成这种形式&/p&&p&再来看两个神奇的发明,或许你也会为发明者神奇的构思所折服&/p&&figure&&img src=&https://pic1.zhimg.com/a1b5b1067aff3bb66f5e7c4e44e41664_b.png& data-rawwidth=&590& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&https://pic1.zhimg.com/a1b5b1067aff3bb66f5e7c4e44e41664_r.png&&&/figure&&p&我想制作出这么一个元器件,他要实现这些功能。想想一下,某一天,你成了一个名人,每天前来拜访的人络绎不绝,今天呢,来了八个人,但是你时间有限,只能见一个人,那就让5号来吧(把拜访者编号,0-7),5号拜访者带来了自己的礼物(0或者1的信息)。看图,左边的三根线表示拜访者的地址(当然是二进制编码),000,001,010,011,100,101,110,111,5号就是101,这时候呢,我只需要把S0和S2通电,那么5号拜访者就进来了,献上自己的礼物(1位的信息)。&/p&&p&怎么实现这个功能呢?有兴趣的自己去研究下面实现,请记住,我们现在讨论的内容抽象的层次已经不是最最底层的实现了,而是更加关注于逻辑器件实现的功能&/p&&figure&&img src=&https://pic4.zhimg.com/5ce1334ec94cbd23fe8d2d239c75b87f_b.png& data-rawwidth=&578& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&https://pic4.zhimg.com/5ce1334ec94cbd23fe8d2d239c75b87f_r.png&&&/figure&&p&这叫“8-1选择器”&/p&&p&反过来,我有一封信需要送出去,这封信的内容是0或者1,现在我也有8个快递小哥可以选择,编号分别是000,001,010,011,100,101,110,111,我让谁去给我送信呢?那就还是5号吧,于是我把地址分别设置为101,5号小哥就去给我送信了,给出具体实现,有兴趣的自己去看吧&/p&&figure&&img src=&https://pic4.zhimg.com/c415fae875bae2918b3bddb7f29ffef7_b.png& data-rawwidth=&437& data-rawheight=&504& class=&origin_image zh-lightbox-thumb& width=&437& data-original=&https://pic4.zhimg.com/c415fae875bae2918b3bddb7f29ffef7_r.png&&&/figure&&p&这个电路名儿叫做“3-8译码器”&/p&&p&有了8-1选择器和3-8译码器,就可以制作出一个8位存储器了&/p&&figure&&img src=&https://pic2.zhimg.com/f62f1d4cbbe509c9c738fd1d5425468d_b.png& data-rawwidth=&674& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&674& data-original=&https://pic2.zhimg.com/f62f1d4cbbe509c9c738fd1d5425468d_r.png&&&/figure&&p&again,把复杂的电路实现,抽象成简单的符号表示&/p&&figure&&img src=&https://pic4.zhimg.com/fdb7fd3c8fab7_b.png& data-rawwidth=&430& data-rawheight=&171& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&https://pic4.zhimg.com/fdb7fd3c8fab7_r.png&&&/figure&&p&读/写存储器,通常叫做随机访问存储器或者叫RAM,RAM可存储8个单独的1位数据&/p&&p&如何得到16 X 1的RAM呢?相信大家都能想到,用2个 8 X 1的RAM,我仿佛回到了《计算机组成》的课堂,让我再来做一次作业吧&/p&&figure&&img src=&https://pic3.zhimg.com/bfb5aecfeee07b5be62ee_b.png& data-rawwidth=&530& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&https://pic3.zhimg.com/bfb5aecfeee07b5be62ee_r.png&&&/figure&&p&简写如下:&/p&&figure&&img src=&https://pic2.zhimg.com/733d785f5ce80d346472d_b.png& data-rawwidth=&446& data-rawheight=&196& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&https://pic2.zhimg.com/733d785f5ce80d346472d_r.png&&&/figure&&p&这种方式或许正确,但是使用了三根地址线,两根数据线,能不能使用4根地址线1根数据线呢?&/p&&p&加一个2-1选择器不就行了吗?(设计一个2-1选择器,这会儿应该不算什么难事儿)&/p&&figure&&img src=&https://pic3.zhimg.com/5bbad23c2d954426ffaa_b.png& data-rawwidth=&557& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&https://pic3.zhimg.com/5bbad23c2d954426ffaa_r.png&&&/figure&&p&再次用符号简写:&/p&&figure&&img src=&https://pic2.zhimg.com/15f7d75b93ab9fd1a53b56f_b.png& data-rawwidth=&461& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&461& data-original=&https://pic2.zhimg.com/15f7d75b93ab9fd1a53b56f_r.png&&&/figure&&br&&p&回到我们的出发点,怎么得到64K X 8的存储阵列呢?&/p&&p&无非就是努力提高8位锁存器的集成程度嘛,我可以想象,读者看到这里,脑子里全是密密麻麻的的连线,或许你还一时想象不到连线的方式,但是看到这里,64K X 8的存储阵列一定能用某种方式实现,对吧?虽然没有实现其电路图,但我也可以说,我理解了存储器工作原理,(你懂了吗?)。&/p&&figure&&img src=&https://pic1.zhimg.com/1b19ffdc0c3d5fa8bfef0230_b.png& data-rawwidth=&544& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&https://pic1.zhimg.com/1b19ffdc0c3d5fa8bfef0230_r.png&&&/figure&&p&1024 X 8RAM的符号表示,2的16次方,即64K,地址线有16根,数据线有8根&/p&&p&为了申请我的专利,我需要做出一个机器的外部壳子,和第一节中的“计算器”一样,把这个机器的壳子把我所有实现的过程封装起来,形成一个“黑盒”,只保留几个外部的接口(也就是那几根数据线,一定要记得他们的功能),我要做成的外部盒子是这个样子&/p&&figure&&img src=&https://pic1.zhimg.com/490b43bd0d0_b.png& data-rawwidth=&626& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&https://pic1.zhimg.com/490b43bd0d0_r.png&&&/figure&&p&上一排的对应16根数据线,下一排有8根数据线,这个不用解释,相信把上文看完的都能明白什么意思,takeover这个按钮表示是否使得当前控制面板处于“激活状态”,也就是说,这个开关的作用是确定由控制面板还是又外部所连接的其他电路(从来没说过,没有连接外部其他电路,或者想象下,我这个机器壳子外面有一排的针孔,外部电路可以接进去,想想电脑机箱后边的针孔,就是这个意思,Soga)来控制。如果有其他电路相连。这时候takeover为 0(图示状态),此时存储器由其他电路接管,控制面板上的其他开关不起作用,当takeover为1 时,控制面板将重新获得对存储器的控制能力。&/p&&p&最后还是给出电路实现&/p&&figure&&img src=&https://pic3.zhimg.com/ffd325ac9a32d0f0dc9e642_b.png& data-rawwidth=&655& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&https://pic3.zhimg.com/ffd325ac9a32d0f0dc9e642_r.png&&&/figure&&p&想一下,机器壳子后面的针孔连那里,控制面板的开关又连接哪里?&/p&&figure&&img src=&https://pic4.zhimg.com/b1c58ea11ed73b09e92017_b.png& data-rawwidth=&600& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/b1c58ea11ed73b09e92017_r.png&&&/figure&&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&&figure&&img src=&https://pic4.zhimg.com/41bbe01adc4e96f1c24cfcb_b.png& data-rawwidth=&719& data-rawheight=&103& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&https://pic4.zhimg.com/41bbe01adc4e96f1c24cfcb_r.png&&&/figure&&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&&figure&&img src=&https://pic3.zhimg.com/8415ede484dafc24df26_b.png& data-rawwidth=&506& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&506& data-original=&https://pic3.zhimg.com/8415ede484dafc24df26_r.png&&&/figure&&br&&p&拿一个8位的加法器和一个8位的锁存器,按上述方式相连,每次我们可以通过加法器的开关输入我们要算的数(当然要输入的数是0-255之间,计算的结果也是0-255之间,在这里可以先计算1-10的和),我们小心翼翼的拨动开关,最后下方的一排指示灯显示计算的结果。简单吧(这个器件称作累加器)可是我一不小心输错了一个数怎么办?只有重新来算,完全再来一遍,好麻烦啊,有没有可以改进的方式呢?我突然想到,不是有存储器嘛,可不可以把我要计算的数据先存入存储器,再通过读取存储器的内容,把数据传送到加法器,执行运算,最后显示结果。&/p&&p&good idea!具体该怎么做呢,我给出一种实现方案&/p&&figure&&img src=&https://pic3.zhimg.com/c84dcad0e5edd0b85ed1a_b.png& data-rawwidth=&633& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&https://pic3.zhimg.com/c84dcad0e5edd0b85ed1a_r.png&&&/figure&&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&&figure&&img src=&https://pic2.zhimg.com/8c1058d66dbedc7bbd67d_b.png& data-rawwidth=&574& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&574& data-original=&https://pic2.zhimg.com/8c1058d66dbedc7bbd67d_r.png&&&/figure&&p&这里略去了一部分,包括振荡器和清零开关。这样做是很好,但是问题来了,怎样控制RAM写入信号呢(何时存入RAM,把结果存在什么位置?)&/p&&p&假如我有一个这样的计算任务要完成:首先对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和,图示如下&/p&&figure&&img src=&https://pic1.zhimg.com/533ffcfdeb6fc903e82744_b.png& data-rawwidth=&425& data-rawheight=&343& class=&origin_image zh-lightbox-thumb& width=&425& data-original=&https://pic1.zhimg.com/533ffcfdeb6fc903e82744_r.png&&&/figure&&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&&figure&&img src=&https://pic1.zhimg.com/4c87b392ea539c41eed286cb_b.png& data-rawwidth=&580& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&https://pic1.zhimg.com/4c87b392ea539c41eed286cb_r.png&&&/figure&&p&观察要仔细啊,数据的RAM即可以通过Control Panel控制面板进行输入,也可以接受外部的数据,而存储代码RAM只能通过控制面板写入!&/p&&p&那么往存储代码的RAM里写入什么内容吧?机器又不认识load、store、add、halt这些单词。既然机器不认识,我就让他们认识!解决方式,就是编码,其实两位信息编码足够
操作码,代码
Load(加载),10h
Store(保存),11h
Add(加法),20h
Halt(停止),FFh&/p&&p&这样一来,存储代码的那个RAM里边要存的内容就一目了然了&/p&&figure&&img src=&https://pic1.zhimg.com/1f7b442f1eac20bb008f4f575ec32254_b.png& data-rawwidth=&332& data-rawheight=&363& class=&content_image& width=&332&&&/figure&&p&看到这里,读者有疑问吗?还是我最早提出的那个问题,机器是如何“理解”人类的语言的,我虽然把要操作的指令用0和1进行编码,但你把编码之后的内容拿给我们一手打造的这台机器,他还是“不明白”什么意思,去进行何种操作啊!我们转来转去又转回最初的起点,你让冷冰冰的机器去“理解”人类的指令,无异于天方夜谭,机器就是机器,永远也不可能具有思维,当初,我在这里也是困扰好久,哦,原来如此!&/p&&p&我已经把答案告诉你了,机器就是机器,永远也不可能具有思维&/p&&p&我不管你有没有思维,你必须完成我给你的任务,你把上述的任务算个结果出来,这一点儿或许能办到,嘻嘻&/p&&figure&&img src=&https://pic3.zhimg.com/e7c77b645be_b.png& data-rawwidth=&613& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&https://pic3.zhimg.com/e7c77b645be_r.png&&&/figure&&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&&figure&&img src=&https://pic4.zhimg.com/aa008dade8ed6fe728a7b082c9c3c6a3_b.png& data-rawwidth=&312& data-rawheight=&183& class=&content_image& width=&312&&&/figure&&p&相应的,机器内部实现再改造下,增加一个取反器&/p&&figure&&img src=&https://pic2.zhimg.com/baeebc0c93dcf23f0d6b1_b.png& data-rawwidth=&670& data-rawheight=&674& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&https://pic2.zhimg.com/baeebc0c93dcf23f0d6b1_r.png&&&/figure&&p&布置一道作业题,取反器的那根控制信号线接在哪里?&/p&&p&&b&数据“流水”&/b&&/p&&p&我们从继电器打造出门电路,进而实现加法器,计数器,存储器,都是为了向我们的那个终极目标一步步前进。这就像点亮科技树的过程,一步步提高,直到实现我们的终极目标--一台可编程的通用计算机,那现在来看看,我们的科技树点亮到哪一步了,现在我们亲手打造的“能读懂人类指令的计算器”,离我们的目标还有多远?&/p&&p&来看看我们这台机器能不能完成我们想要完成的任务。假设现在要把56h和2A相加,然后再从中减去38h,结果是多少呢?不是有指令了吗?来,设置指令,让机器去完成&/p&&figure&&img src=&https://pic4.zhimg.com/232af880f3e6dcbeb0533_b.png& data-rawwidth=&526& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&https://pic4.zhimg.com/232af880f3e6dcbeb0533_r.png&&&/figure&&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&&figure&&img src=&https://pic2.zhimg.com/87f0ddf5aca348e4d20f19_b.png& data-rawwidth=&123& data-rawheight=&82& class=&content_image& width=&123&&&/figure&&p&我们可以把高低位分开来算&/p&&figure&&img src=&https://pic1.zhimg.com/9c5acf7260d0dae4cdfba7b_b.png& data-rawwidth=&159& data-rawheight=&114& class=&content_image& width=&159&&&/figure&&p&低位加法&/p&&figure&&img src=&https://pic2.zhimg.com/94b774c728adf104ff28d0b647acee25_b.png& data-rawwidth=&137& data-rawheight=&99& class=&content_image& width=&137&&&/figure&&p&高位加法&/p&&p&最后把计算的结果写回存储器&/p&&figure&&img src=&https://pic3.zhimg.com/76fe75c916ebeda8fd6464a_b.png& data-rawwidth=&629& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&https://pic3.zhimg.com/76fe75c916ebeda8fd6464a_r.png&&&/figure&&p&D7h被写入地址0002h处,99h被写入地址0005h处&/p&&p&这是很理想的状况,因为,在上述的例子中把高低位分开计算,低位计算恰巧不存在进位的情况。如果要把76AB}

我要回帖

更多关于 台湾中文11ddaa 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信