【知乎问题】如何让不懂编程的人感受到编程的魅力

【知乎问题】如何让不懂编程的人感受到编程的魅力

  • 「MoreThanJava」 张扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在连系各方面的知识之后,对 Java 基础的一个总回首,旨在 「辅助新同伙快速高质量的学习」
  • 固然 岂论新老同伙 我信赖您都可以 从中获益。若是以为 「不错」 的同伙,迎接 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!

知乎问题:若何让不懂编程的人感受到编程的魅力?

链接:https://www.zhihu.com/question/406408447

Part 0. 前言

问一个类似的问题:「若何让不懂篮球的人感受到篮球的兴趣?」

【知乎问题】如何让不懂编程的人感受到编程的魅力

很显著,谜底取决于人。

对于某些人来说,编码可能是乏味而艰难的,但对于有些人则是异常有趣且有益的。

通常情况下,编写好代码之后,我们很难评判编码的历程是无聊照样有趣的。

然则我们可以通过更好地领会 「盘算机编程是什么」,因此您可以自己来评判这是否让你感应兴趣。

就现代的生长水平来说,只要有电的器械就会涉及到编码;

Part 1. 盘算机生长简史 | 解决现实的问题

【知乎问题】如何让不懂编程的人感受到编程的魅力

一切的劈头 | 织布机

衣食住行是人类的基本需求,天下各地都有纺织和织机的发现。

若何提升纺织的效率,成为一个很主要的课题。

【知乎问题】如何让不懂编程的人感受到编程的魅力

「针织物」 差别,「机织物」 由两条或两组以上的相互垂直的两个系统纱线或丝线组成,纵向的纱线经纱横向的纱线纬纱

通过两条线差别纪律的交织,就会形成差其余颜色和排列的转变,也就会带来差其余纹样。

【知乎问题】如何让不懂编程的人感受到编程的魅力

最原始的织机是手动完成的。

厥后人们发现,织物纹样的转变总是凭据一定纪律排列完成的,到了战国时期,就发现了 多综式提花织机,通过 综框 来完成这一项事情:

【知乎问题】如何让不懂编程的人感受到编程的魅力

这或许就是最原始的 编码:通过把 提起纪律相同的经纱 穿入 同一个综框的综丝 中,来到达当某一个综框提起时 (通过脚踏板完成),表达某一个特定纹路的线被提起,也就完成了 特定纹路的编织,加速了事情效率。

织布机的更进一步 | 束综提花织机

不外接纳综框也有一个显著的限制,那就是 无法织出对照重大的纹样,由于纹样重大则代表着需要更多的经纬纱以及经纱提升的纪律更重大,意味着可能引入成百上千次纬纱才气完成一个循环。

若是仍然接纳综框控制纱线提升,则可能需要成百上千个综框,这在机械上实现是异常难题的,因此便有了 束综提花织机

【知乎问题】如何让不懂编程的人感受到编程的魅力

束综提花织机没有综框,而是被 设计成两层,每一根经纱会穿入综丝中实现 单独的控制上层 的人将需要提起的经纱提起,而 下层 的人则再经纱提起后通过梭子将纬纱送入织口,并用打纬装置将引入的纬纱打牢。

然而通常来说,这类织机上会有成千上万根纬纱,纹样重大,于是伶俐的老祖宗们发现了 花本

【知乎问题】如何让不懂编程的人感受到编程的魅力

简朴来说,花本存储了纹样信息。

图中花本的竖线毗邻穿入了经纱的综丝,横线存储了每一次引入纬纱时提花信息,当竖线越过横线笼罩在横线前方时,解释对应的经纱要被提起。

这就有点儿 编码规则 的意思。

会语言的「机械」 | 雅卡尔织布机

上面说到的束综提花织机虽然是一大提高,但可想而知的是,它仍然效率缓慢而且织布工人的劳动量异常大,也异常辛劳。

时间来到 18 世纪的欧洲。1725 年,布乔 开拓性的使用 打孔纸带 来控制经线的提起和放下,从而让织出名堂成为一种半自动化的事情:

【知乎问题】如何让不懂编程的人感受到编程的魅力

历史上第一次,机械能够读出存储介质中的内容,而且照其行事。

在布乔提出构想 65 后的 1790 年,约瑟夫·玛丽·雅卡尔 凭据前人的功效设计了新式织机,最终于 1805 年完成了首台 自动提花织机

【知乎问题】如何让不懂编程的人感受到编程的魅力

雅卡尔将 穿孔纸带 改善为 穿孔卡片,凭据纹样图案在卡片上打孔,通过孔的有无 动员一系列机械运动装置来 控制经纱的提升,一张卡片对应循环内一次引纬时经纱提升的信息,引纬完成后,可通过脚踏板控制卡孔卡片转动,下一张卡片翻转至事情位置以控制新一次引纬的提花:

【知乎问题】如何让不懂编程的人感受到编程的魅力

雅卡尔织机大幅度节省了时间和事情量 (全自动且效率是之前的二十五倍),而且只需一位工人,很快就被普遍使用在工厂生产中,雅卡尔也荣获了拿破仑授予的声誉勋章。

穿孔卡片控制织物纹样的设计成为了程序设计头脑的萌芽,为信息手艺的生长开展了一条新的门路。

程序设计头脑最先萌芽 | 差分机

【知乎问题】如何让不懂编程的人感受到编程的魅力

时间来到 19 世纪初,法国人 巴贝奇 (Chanles Badbbage) 在贾卡织机的启发下,设计并制造了 差分机

故事靠山

18 世纪末,法国政府在开创米制之后,决议在数学中统一接纳十进制,竟奇葩地想把原本 90 度的直角划分成 100 度、把原本 60 秒的 1 分钟划分成 100 秒,只管从现在看来这样的想法绝逼是一种倒退,但他们在那时真就实行了。这一改制带来的不光是人们在使用时直观上的别扭,原本制作好的数学用表 (如三角函数表) 都需要所有重制。

法国政府将这项丧心病狂的工程交给了 数学家普罗尼 (Gaspard de Prony),普罗尼正头疼着要若何才气完成这项艰难的义务,突然想起著名经济学家 亚当·斯密 (Adam Smith) 的那本《富国论》,他决议接纳书中提出的 劳动分工 的做法,将制表的事情职员分成三组:

  • 第一组 由五六名牛逼的数学家组成,他们卖力制订运算中所需的公式;
  • 第二组 由九到十个善于数学的人组成,他们卖力盘算出一些要害数据,并把第一组制订好的公式举行简化;
  • 第三组 由约一百名盘算职员组成,他们行使第二组提供的要害数据和公式,做最简朴的加减操作就能得出最终效果。

第三组的事情简朴到什么水平,就是他们甚至都不知道自己正在算什么玩意儿,事实上他们的文化水平大部门都不高,里头许多多少都是理发师、失业职员什么的。可见即便文盲都能完成的盘算,在谁人时代照样得依赖人力去做。

而为了保证用表的准确性,普罗尼要求 每个数至少算两遍,而且 要在法国的差别地址用差其余方式盘算。这项劳民伤财的工程整整举行了十年才完成,然而不幸的是,最终的内外仍然有错。说到这一点,可以说,谁人时代基本没有一版数学用表是完全准确的,有些版本甚至错误百出,要知道数学用表失足有时结果会很严重,好比航海表一失足就可能直接导致船毁人亡。

巴贝奇 在领会到普罗尼的事迹后泣如雨下,决心要做一套完全准确的数学用表,为达目的,他尝试了种种削减错误的手段,好比调整纸张和墨水的颜色以提高数字的识别度,直接拿现有的多个版本的表举行誊抄、比对、让差别职员频频校对,在 1827 年出书了一个版本,效果里头照样有错。只要是人为的就没有完善的,巴贝奇彻底跪了,他立誓要造一台机械,让机械去生产数学表。

这就是史上著名的 差分机 了。

伦敦科学博物馆·差分机设计图纸&半成品:

【知乎问题】如何让不懂编程的人感受到编程的魅力

第一台真正意义上的电脑 | 剖析机

只管没能亲手实现差分机,但巴贝奇并不会气馁,或者说他原本就是基本停不下来的那种人。明知实现不了,巴贝奇仍在一刻一直地改善着自己的设计,直到有一天,他构想出了一种空前的机械——剖析机,正式成为现代盘算机史上的第一位伟大先驱。 (Father of computing)

1834 年,剖析机观点降生之际,巴贝奇自己都为之感应无比震惊。在此之前,任何一台盘算机械都只能完成其被预定赋予的盘算义务,要么是简朴的加减乘除,要么像差分机那样只能做差分运算,它们都属于 calculator,而剖析机才是真正的 computer,它不局限于特定功效,而竟然是可编程的,可以用来 盘算随便函数——现代人无论若何也无法想象在一坨齿轮上写程序是怎样一种体验吧!

巴贝奇设计的剖析机主要包罗三大部门:

  1. 用于存储数据的计数装置,巴贝奇称之为 “堆栈”(store),相当于现在 CPU 中的存储器,这部门是从差分机上的计数装置改善而来的,我们很容易想象它的容貌;
  2. 专门卖力四则运算的装置,巴贝奇称之为 “工厂”(mill),相当于现在 CPU 中的运算器,这部门的结构相对重大,巴贝奇针对乘除法还做了一些优化;
  3. 控制操作顺序、选择所需处置的数据和输出效果的装置,巴贝奇没有起名字,由于其呈桶状,我们可以叫它 “控制桶”,控制桶显然相当于现在 CPU 中的控制器

以上三部门,加上巴贝奇并没有疏漏的输入输出装备,我们惊讶地发现,剖析机的组成部门和现在冯·诺依曼架构所要求的五大部件一模一样!

巴贝奇另一大了不起的创举就是将 穿孔卡片(punched card) 引入了盘算机械领域,用于控制数据输入和盘算,从那时起,到第一台电子盘算机降生为止,时代险些所有的数字盘算机都使用了穿孔卡片。

【知乎问题】如何让不懂编程的人感受到编程的魅力

整个剖析机就是在类似这样的齿轮和拉杆作用下实现可编程运算的:先从数据卡片读入数据到存储器,再将存储器中的数据传输到运算器,运算器算完后又将数据传回存储器。

惋惜的是,巴贝奇穷其一生也没能真正把剖析机做出来,留给后世的又是一台模子机和两千多张图纸,以及这样一段遗言:

「若是一小我私家不因我一生的借鉴而却步,仍然一往直前制成一台自己具有所有数学剖析能力的机械……那么我愿将我的声誉绝不小气地让给他,由于只有他能够完全明白我的种种起劲以及这些起劲所得功效的真正价值。」

伦敦科学博物馆·剖析机设计图纸&模子机:

【知乎问题】如何让不懂编程的人感受到编程的魅力

穿孔时代的到来 | 制表机

1790 年最先,美国每 10 举行一次人口普查。百年间,随着人口繁衍和移民的增多,从 1790 年的 400 万不到,到 1880 年的 5000 多万,人口总数呈爆炸式地增进。

【知乎问题】如何让不懂编程的人感受到编程的魅力

不像现在这个的互联网时代,人一出生,种种信息就已经电子化、挂号好了,甚至还能数据挖掘,你无法想象,在谁人盘算装备简陋得基本只能靠手摇举行四则运算的 19 世纪,万万级的人口统计就已经成了那时政府的 “不能蒙受之重”

1880 年最先的第 10 次人口普查,历时 8 年才最终完成,也就是说,他们在休息两年之后就要最先第 11 次普查了,而这一次普查,需要的时间恐怕要跨越 10 年,那第 12 次、13 次呢?原本就是 10 年一次的统计,若是每次耗时都在 10 年以上,这件事情就变得没有意义了。

这可愁煞了那时的人口观察办公室,他们决议面向全社会招标,追求能减轻手工劳动、提高统计效率的发现。正所谓机遇都是给有准备的人的,一位结业于哥伦比亚大学的年轻人 赫尔曼·霍尔瑞斯 (Herman Hollerith) 带着他在 1884 年申请的专利从众多方案中脱颖而出。

【知乎问题】如何让不懂编程的人感受到编程的魅力

制表机

他发现的机械叫 制表机 (tabulator/tabulating machine),顾名思义,就是专门用来制作数据统计表的机械。制表机主要由示数装置、穿孔机、读卡装置和分类箱组成。

示数装置包罗 4 行、10 列共 40 个示数表盘,每个盘面被平均地分成 100 格,并装有两根指针,和钟表十分相像,“分针” 转一圈可计 100,“时针” 转一圈则计 10000。可见,整个示数装置可以表达很重大的数据。

【知乎问题】如何让不懂编程的人感受到编程的魅力

制表机的事情是围绕穿孔卡片睁开的:操作员先使用穿孔机制作穿孔卡片,再使用读卡装置识别卡片上的信息,机械自动完成统计并在示数表盘上实时显示效果,最后,将卡片投入分类箱的某一格中,举行分类存放,以供下次统计使用。

穿孔卡片的应用

此前的某一天,霍尔瑞斯正在火车站排队检票,眼光不经意落到检票员手中咔咔直响的打孔机上。他发现,检票员会特意凭据搭客的性别和年龄段,在车票的差别地方打孔。越来越多的人过检,他进一步确认了这个纪律。一个灵感朝他袭来:若是有一张更大的卡,上面有更多的位置可以打孔,就可以用来示意更多的身份信息,包罗国籍、人种、性别、生日等等。

这就是用在 1890 年人口普查中的穿孔卡片,一张卡片纪录一个住民的信息。卡片设计长约 18.73cm,宽约 8.26cm,正好是那时一张美元纸币的尺寸,由于霍尔瑞斯直接用财政部装钱的盒子来装卡片。

【知乎问题】如何让不懂编程的人感受到编程的魅力

卡片设有 300 多个孔位,与雅卡尔和巴贝奇的做法一样,靠每个孔位打孔与否来示意信息。只管这种形式颇有几分二进制的意味,但那时的设计还远不够成熟,并没有用到二进制真正的价值。举个例子,我们现在一样平时用 1 位数据就可以示意性别,好比 1 示意男性,0 示意女性,而霍尔瑞斯在卡片上用了两个孔位,示意男性就其中一处打孔,示意女性就在另一处打孔。实在性别还拼集,示意日期时虚耗得就多了,12 个月需要 12 个孔位,而通例的二进制编码只需要 4 位。固然,这样的局限也与制表机中简朴的电路实现有关。

仔细的读者可能发现卡片的右下角被切掉了,那不是残缺,而是为了制止放反而专门设计的,和现在的二维码只有 3 个角是一个原理。

这类适用的细节设计在穿孔机上显示得更为精彩。下图为一位操作员正在使用穿孔机给卡片打孔的情景,她并不需要在卡片上吃力地征采孔位,而是直接对着孔距更大的操作面板打孔,一根杠杆将两者的孔位一一对应。操作面板还做成了弧形,颇有一分现在人体工程学键盘的风姿。

【知乎问题】如何让不懂编程的人感受到编程的魅力

在制表机前,穿孔卡片(或纸带)多用于存储指令而不是数据。对照有代表性的,一是雅卡尔提花机,用穿孔卡片控制经线提沉;二是自动钢琴,用穿孔纸带控制琴键压放。美剧《西部天下》中,每次故事循环的最先,都会给一个自动钢琴的特写,弹奏起看似平静清闲、实则诡异违和的靠山乐。

是霍尔瑞斯将穿孔卡片作为 数据存储介质 开来,并开启了一个崭新的 数据处置纪元。厥后人们也把这类卡片称为霍尔瑞斯卡片,穿孔卡片和穿孔纸带作为输入输出载体,统治了盘算领域整整一个世纪。

单元纪录时代

在制表机的高效运转下,1890 年的人口普查只花了 6 年时间。1896 年,霍尔瑞斯确立制表机公司(The Tabulating Machine Company)并不停改善自己的产物,先后与英国、意大利、德国、俄罗斯、澳大利亚、加拿大、法国、挪威、美国波多黎各、古巴、菲律宾等多个国家和地区互助开展了人口普查。

1914 年,制表机公司天天生产的穿孔卡片多达 200 万张。不多久,一些竞争对手逐渐起身,历史迎来了繁荣的数据处置时代。它们的产物也不再局限于人口普查,逐渐扩展到会计、库存治理等一些同样需要跟大数据打交道的领域,这些机械作为制表机的后裔被统称为单元纪录装备(unit record equipment)。

围绕穿孔卡片的制卡、读卡、数据处置和卡片分类是它们的尺度功效,穿孔机、读卡器、分类器是它们的尺度设置。这些部件的自动化水平越来越高,好比手动的读卡装置很快被自动读卡机所取代,读卡速率从每分钟 100 张逐步提高至每分钟 2000 张。随着识别精度的提高,卡片的孔距也越来越小,具有 80~90 列孔位的卡片成为主流,有些卡片的孔位甚至多达 130 列。

【知乎问题】如何让不懂编程的人感受到编程的魅力

机械的功效也逐渐壮大,不再只是简朴地统计穿孔数目,减法、乘法等运算能力陆续登场。1928 年,哥伦比亚大学的科学家们甚至用单元纪录装备盘算月球的运行轨迹,他们在 50 万张卡片上打了 2000 万个孔,彰显着单元纪录装备的无限潜力。

机械的电路实现越来越重大,但同时也越来越通用。1890 年所用的那台制表机的 线路是牢固的,遇到新的统计义务,革新起来十分贫苦。

1906 年,霍尔瑞斯便引入了接插线板(plugboard)——一块充满导电孔的板卡,可通过改变导线插脚在板上的位置改变线路逻辑。试想一下,接插线板的内部已经布好了具有种种功效的线路,但它们都处在断开状态,各自毗邻着接插线板上的某两个孔位,像一窝嗷嗷待哺的小鸟长大着嘴巴,外部的导线就像鲜味的虫子,当虫子的头尾划分与小鸟的上喙和下喙接触,线路就被导通,这只小鸟就最先事情了。云云,每次使用就可以激活差其余 “小鸟”,从而完成差其余义务。这已经是一种可编程性的体现。

【知乎问题】如何让不懂编程的人感受到编程的魅力

1911 年,制表机公司与另外 3 家公司合并确立 CTR 公司 (Computing-Tabulating-Recording Company),制表机公司作为其子公司继续运营到 1933 年。

1924 年,CTR 更名为 国际商业机械公司International Business Machines Corporation),就是现在赫赫有名的 IBM 公司。可见,在现在众多年轻的 IT 公司中,拥有百年历史的 IBM 是位当之无愧的先辈,它完整地介入和见证了整个现代盘算机的生长史。IBM 保持了制表机公司在单元纪录市场的龙头职位,到 1955 年,其天天生产的穿孔卡片多达 7250 万张。

1937 年最先,单元纪录装备逐步电子化,与电子盘算机的界线逐渐模糊,并最终为后者让路。随着 1976 年 IBM 一型最焦点的单元纪录产物的停产,短暂的单元纪录时代也宣告谢幕,它似乎是电子盘算时代来临前的预演和铺垫,许多设计被沿用下来,好比穿孔卡片和接插线板。

有趣的是,纵然电子盘算机逐渐普及,许多机构由于用惯了单元纪录装备,迟迟不愿替换,少数机构甚至一直用到了 21 世纪。

一句话总结

编程能够辅助我们解决一些异常现实的问题,用一种异常酷的方式。

【知乎问题】如何让不懂编程的人感受到编程的魅力

感兴趣也可以扩展阅读一下:改变天下的代码行

Part 2. 二进制和 CPU 原理 | 编码中蕴藏的智慧

【知乎问题】如何让不懂编程的人感受到编程的魅力

原来,我们是这样计数的

在讨论「二进制」和「CPU 若何事情」之前,我们先来讨论一下我们生涯中最希罕平时的 数字,我们与之频仍地打交道:一个约定的时间、一件商品的价钱、一小我私家的身高….却很少有人细细想过,这些数字是若何表达出来的?为什么你天经地义地把 1024 明白为「一千零二十四」而不是其余寄义?

也许你从未想过,在这简朴的记数中,沉淀着人类的大智慧。

一进制计数法

早在数字的观点发生之前,人类就学会了使用树枝、石子、贝壳等自然界随处可见的小物件示意猎物的、果实的、部落人口的数目。好比在某个角落堆上一堆石子,每打到 1 只猎物,就扔 1 颗石子进去,每吃掉 2 只猎物,就从中取走 2 颗石子。他们并不在意石子的总数,只是时不时地瞅一眼,心底大致有数。

实在这是一种最质朴的记数方式,数学家称之为 一进制记数法(unary numeral system)。我们把它符号化一下,好比用斜杠 / 来示意:

  • 1 就是 /
  • 2 就是 //
  • 4 就是 ////

似乎没偏差,我们平时掰手指用的就是这种记数法,但数字一大,排场就要失控了。

符值相加记数法

为领会决纪录大数的问题,于是我们得发现一些其他符号来示意更大的数值,好比用横杠 - 示意 10,用十字 + 示意 100。那么:

  • 16 就是 -//////;
  • 32 就是 ---//;
  • 128 就是 +--////////;

漂亮….这种靠符号类型和符号数目示意数字的方式被称为 符值相加记数法(sign-value notation),古埃及和古罗马用的都是它,只不外符号各不相同。

古埃及的记数符号:

1 10 100 1000 10000 100000 1000000
【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力 【知乎问题】如何让不懂编程的人感受到编程的魅力

1024 在古埃及就写作:

【知乎问题】如何让不懂编程的人感受到编程的魅力

你会发现,符值相加记数法的一大优点是,符号的顺序可以随便打乱,数字寄义不受影响。我国藏族曾用石子示意 1、木棍示意 10、果核示意 100、蚕豆示意 1000、瓦片示意 10000,那么,当你把 1 颗蚕豆、2 根木棍和 4 颗石子胡乱地攥在手里,别人依然知道它们是 1024

古罗马的做法略有差别,他们对五进制情有独钟:

1 5 10 50 100 500 1000
I V X L C D M

这些符号沿用至今,想必人人(至少对前 3 个)都对照熟悉,许多钟表仍保留着使用罗马数字的习惯,1~12 划分示意为:IIIIIIIVVVIVIIVIIIIXXXIXII。你会发现,罗马记数法是符值相加记数法的变种,由于它不光「相加」,还「相减」。这种方式就不允许符号乱序了,IVVI 示意的是差其余数字。

那罗马人何苦要使用这种更重大的记数法呢?无非是为了读写利便。同样示意 9IXVIIII 更简练。

实在有一种更好使的方式——用另外一些列符号来示意符号的数目。好比用 A 示意 1 个符号,用 B 示意 2 个符号,以此类推,用 I 示意 9 个符号。

云云,上文示意 256++-----////// 就可以写作 B+E-F/。你一定感受莫名其妙,这种写法那里利便了。实在中文的数字示意就是这种形式,只不外我们用得太习惯了,以至于没有发现。

在中文中, 取代了 /-+,而 取代了 ABC256 就写作 二百五十六个 对照累赘,我们通常把它省略了。

实在像日语、英语用的也同样是这种记数法,简练、优雅。

美中不足的是,这种形式虽便于读写,却不便于盘算。中国古人为算筹和算盘这类经典算具搭建起广漠的舞台,却没给笔算留出一席之地。想象一下,若是让你把这些汉字写在草稿纸上,列个竖式,你的心里一定异常别扭。

位值制记数法

公元5世纪,印度数学家阿耶波多(Aryabhata 476–550)创立了现在普遍使用的 位值制记数法(positional notation/place-value notation),该记数法使用的主要符号,是同为印度人发现的阿拉伯数字:0123456789

与符值相加记数法类比,位值制中的 123 取代的是 ABC,那 /-+ 呢?是 靠阿拉伯数字的位置来示意的。众所周知,最右位相当于 /,次右位相当于 -靠每个位置上的数值来示意数字,故名位值制。

ffmpeg播放器实现详解 – 视频显示

严谨的数学家用一种多项式高度归纳综合了位值制记数法的本质,在十进制中,这个多项式是这样的:

【知乎问题】如何让不懂编程的人感受到编程的魅力

【知乎问题】如何让不懂编程的人感受到编程的魅力

这是一个 n 位十进制数,ai 就是第 i 位上的数值。为便于直观明白,举个 1024 的例子吧:

【知乎问题】如何让不懂编程的人感受到编程的魅力

由于我们熟悉了十进制,这样费心艰苦的睁开可能会让你以为可笑,但当我们把它推广到其他进制时,这个多项式的价值就体现了出来。n 位 b 进制数的位值制示意:

【知乎问题】如何让不懂编程的人感受到编程的魅力

【知乎问题】如何让不懂编程的人感受到编程的魅力

1024 用二进制怎么示意?

【知乎问题】如何让不懂编程的人感受到编程的魅力

因此,1024 的二进制写作 10000000000

除了最普遍的十进制和盘算机中的二进制,常见的另有七进制(如 17 天)、十二进制(如 112 个月)、十六进制(如古代 116 两)、六十进制(如六十甲子)等等,只要有意义,任何进制都可以为你所用。

为什么使用二进制

至此,你对「二进制」或许不再那么生疏,它仅仅是数制的一种而已。

可为什么一定是二进制呢?使用人类习惯的十进制不好吗?

理由一:物理上易于实现

盘算机依赖电力事情,这也就意味着需要将数字信号映射到电信号,实现这种映射最简朴的方式是:

  • 0 – 没有电(0 V)
  • 1 – 有点(5 V)

二进制在手艺上最容易实现。这是由于具有两种 稳固状态 的物理器件许多,如门电路的导通与停止、电压的高与低等,而它们正好可以对应示意 “1” 和 “0” 这两个数码。如果接纳十进制,那么就要制造具有 10稳固状态 的物理电路,而这是异常难题的。

理由二:机械可靠性高

为什么使用更重大的数字系统是一个问题?

假设我们使用三元(3 位数字)数字系统涉及盘算机,若是我们具有从 0 V5 V 的电压,那么我们可以举行以下的映射:

  • 0 – 0 V;
  • 1 – 2.5 V;
  • 2 – 5 V;

【知乎问题】如何让不懂编程的人感受到编程的魅力

看起来合理吧?然则,想象一下,我以 2.5 V 的电压发送了一个数字。然则由于电路中的一些噪声,我在输出端获得 2.3 V 的电压,因此将其视为 0。效果是?

有人给我发送了 1,但我将其视为 0。数据丢失可是一个异常严重的问题。

使用二进制则可靠得多,由于电压的高和低、电流的有和无等都是一种 质的转变,两种物理状态稳固、明白,因此,二进制码传输的抗干扰能力强,鉴别信息的可靠性高。

为什么盘算机系统必须有时钟

【知乎问题】如何让不懂编程的人感受到编程的魅力

确立数字系统的目的是 仅在某些时间点测试开/关(二进制)值,这使电线(或其他装备)有时间替换。这就是盘算机系统有时钟的缘故原由。

时钟会周期性地举行信号的丈量,图中所示的 T1 和 T2 就是可以丈量信号的时间点。

时钟行使所有这些时间点来保持同步。更快的时钟意味着每秒可以对电线举行更多次测试,而且整个系统运行得更快。2 GHz 处置器每秒检查二进制值 20 亿次。在这些时间之间,允许值改变并稳固下来。处置器芯片速率越快,每秒可以测试的次数就越多,每秒可以做出的决议就越多。

理由三:运算规则简朴

数学推导已经证实,对 N 进制数举行算术求和或求积运算,其运算规则各有 N(N+1)/2 种。如接纳十进制,则 N=10,就有 55 种求和或求积的运算规则;而接纳二进制,则 N=2,仅有 3 种求和或求积的运算规则,以上面提到的加法为例:

0+0=0,0+1=1 (1+0=1),1+1=10

因而可以大大简化运算器等物理器件的设计。

理由四:逻辑判断利便

接纳二进制后,仅有的两个符号 “1”“0” 正好可以与逻辑命题的两个值 “真” 和 “假” 相对应,能够利便地使用逻辑代数这一有力工具来剖析和设计盘算机的逻辑电路。

虽然在 1950 年月就造出了加倍高效的三元盘算机,但在效率和重大度的取舍上,始终抵不外二进制。二进制仍然在当今天下中长期存在。

CPU 的现实事情方式简朴演示

上面我们领会到盘算机以二进制的形式运行,它们只有两种状态:开(1)和关(0),为了执行二进制盘算,我们需要接纳一种特殊的电子元器件,称为 「晶体管」。暂时我们把它明白为一种开关吧,通电就打开,没电流通过就关闭。

行使「开关」搭建逻辑电路

我们知道,给电灯通上电,它就会亮:

【知乎问题】如何让不懂编程的人感受到编程的魅力

于是,连系上开关,我们就能搭建出最基础的 与门或门

与门

【知乎问题】如何让不懂编程的人感受到编程的魅力

该电路的逻辑是:只有当 A 和 B 同时开启时,LED 灯才会亮,也就是以为输出 1,我们可以行使电信号来简朴模拟一下:

A B Y
0 0 0
1 0 0
0 1 0
1 1 1

或门

【知乎问题】如何让不懂编程的人感受到编程的魅力

该电路的逻辑是:当 A 或者 B 开启时,LED 灯就会亮,也就是以为输出 1,我们可以行使电信号来简朴模拟一下:

A B Y
0 0 0
1 0 1
0 1 1
1 1 1

其他门

类似地,我们可以借助更多的电子元器件来缔造出基础的 7 种逻辑门电路:

【知乎问题】如何让不懂编程的人感受到编程的魅力

这里需要特别提一下 异或门,我们需要先知道有一种电子元器件可以行使电气特征对 输入取反,也就是说输入 1 则输出 0,输入 0 则输出 1,那么我们就可以 简朴模拟 出异或门逻辑电路(现实会更重大些,这里仅展示出异或的意思):

【知乎问题】如何让不懂编程的人感受到编程的魅力

A'B' 划分示意 AB 开关的反值,从图中我们很容易知道只有当 AB 只存在一个输入 1 时,整个电路才会输出 1

行使逻辑门制作简朴加法器演示

OK,上面我们领会到我们能够行使 “开关” 来模拟逻辑的运算,我们接下来试着还原一个简朴的加法运算器是若何实现的:

【知乎问题】如何让不懂编程的人感受到编程的魅力

仅需两个门,就可以完成基本的二进制加法运算。上图是行使 logic.ly 建立的半加法器,AB 相当于使我们盘算的两个数,最后一块相当于是我们的数显芯片,它的功效是凭据输入显示数字,从上到下的引脚(也就是图中输入的地方,通常我们这样称谓)划分对应了 20=121=222=423=8 的输入,没有任何输入时显示为 0,若是 引脚 1(对应 20=1)像上图一样有输入,则显示 0 + 1 = 1

我们来明白一下上方的电路:

  • 若是仅打开一个输入,但差别时打开两个输入,则此处的 XOR 门(异或门)将打开,此时对应输入 引脚 1,显示 数字 1(类似于 1 + 0 和 0 + 1);
  • 若是两个输入均打开,则 AND 门(与门)将打开,此时对应输入 引脚 2,显示 数字 2(类似于 1 + 1);
  • 若是没有输入,则 AND 门和 XOR 门都保持关闭,此时显示 数字 0(类似于 0 + 0);

因此,若是两个都打开,则 XOR 保持关闭,而且 AND 门打开,得出准确的谜底为 2

【知乎问题】如何让不懂编程的人感受到编程的魅力

但这只是最基础的半加法运算器,不是太有用,由于它只能解决最简朴的数学问题之一。但若是我们把它们两个与另一个输入毗邻,就会获得一个完整的加法器:

【知乎问题】如何让不懂编程的人感受到编程的魅力

仔细思索几遍,你就会得知这个三个输入的加法器已经可以盘算 3 个二进制数字的加法运算了,我们如法炮制,可以通过毗邻更多的”进位”来使这个加法器能够运算更多的数,这固然也意味着这个盘算链条更长。

大多数其他数学运算都可以加法完成。乘法只是重复加法,减法可以通过一些奇异的位反转来完成,而除法只是重复减法。而且,只管所有现代盘算机都具有基于硬件的解决方案以加速更重大的操作,但从手艺上讲,您可以使用完整的加法器来完成所有操作。

一句话总结

编码随同探索和学习新知的历程,若是愿意,我们能从中获取许多类似于解出一道数学题的兴趣。

【知乎问题】如何让不懂编程的人感受到编程的魅力

Part 3. 机械指令到高级语言 | 站在先驱巨人的肩膀

【知乎问题】如何让不懂编程的人感受到编程的魅力

机械指令

我们已经领会了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着细小的 「电子操作」,例如:从内存读取一个字节的数据到 CPU 又或者判断字节中的某一位是 0 照样 1

CPU 自己有一组 规定好的 可以执行的 「基本动作」(被称为 机械指令):

  1. 读取指令;2. 执行指令;3. 写寄存器;

这险些就是 CPU 事情的所有了。 这些动作虽然每次只能执行一次,然则每秒可以执行数十亿次,这个数目级的「小操作」累加成为一个大的「有用的操作」。

处置器所做的一切都是基于这些细小的操作!幸运的是,我们已经不再需要领会这些操作的详细信息就可以编写和使用各种程序。诸如 Java 这一类的 「高级语言」目的 就是 将这些细小的电子操作组织成由人类可读的「程序语言」示意的大型有用单元

只管机械语言有一些反人类,但至少我们可以用它来来编写代码了,如:

00000001 00000010 00000001
00000100 00000100 00000000

似乎看着这一段儿代码有点迷糊,而且 可读性太差了

云云你就会感知到 上个世纪 的程序员使用 打孔卡片

【知乎问题】如何让不懂编程的人感受到编程的魅力

使用 纸带

【知乎问题】如何让不懂编程的人感受到编程的魅力

甚至是 直接插拔线路 or 按下开关

【知乎问题】如何让不懂编程的人感受到编程的魅力

是一件何等硬核的事情…

汇编语言

PU 的指令都是 二进制 的,这显然对于人类来说是 不可读 的。为领会决二进制指令的可读性问题,工程师将那些指令写成了 八进制。二进制转八进制是易如反掌的,然则八进制的可读性也不行。

很自然地,最后照样用文字表达,加法指令写成 ADD。内存地址也不再直接引用,而是 用标签 示意。

这样的话,就多出一个步骤,要把这些文字指令翻译成二进制,这个步骤就称为 assembling,完成这个步骤的程序就叫做 assembler。它处置的文本,自然就叫做 aseembly code。尺度化以后,称为 assembly language,缩写为 asm,中文译为 汇编语言

汇编语言演示

举个简朴的例子,我们需要盘算:

(1 + 4) * 2 + 3

我们凭据 「后缀示意法」 举行一下转换:

1,4,+,2,*,3,+

我们平时使用的方式是 「中缀示意法」,也就是把盘算符号放中心,例如 1 + 3,后缀则是把符号放最后,例如 1, 3, +

这样做的利益是没有先乘除后加减的影响,也没有括号,直接运算就行了。(例如 1, 3, +,先把 13 保存起来碰着 + 知道是加规则直接相加)

OK,我们重新最先使用汇编语言来编写一下程序,首先第一步:把 1 保存起来(放入寄存器):

MOV  1

之后是 4, +,那就直接加一下:

ADD 4

然后是 2, *,那就直接乘一下(SHL 是向左移动一位的意思,二进制中左移一个单元就相当于乘以 2,例如 01 示意 1,而 10 则示意 2):

SHL 0

最后是 3, +,再加一下:

ADD 3

完整程序如下:

MOV  1
ADD  4
SHL  0
ADD  3

这似乎看起来比 00001111 这样的二进制要好上太多了!程序员们感动到落泪:

【知乎问题】如何让不懂编程的人感受到编程的魅力

高级语言

摆脱了 二进制,我们有了更可读的 汇编语言,但仍然十分繁琐和重大,每一条汇编指令代表一个基本操作,例如:「从内存 x 位置获取一个数字并放入寄存器 A」、「将寄存器 A 中的数字添加到寄存器 B 的数字上」。这样的编程气概既费时又容易失足,而且一旦失足还很难发现。

例如,我们来看一看 「1969 年阿波罗 11号登月设计」 用来 防止登月舱盘算机耗尽自身资源 的 BAILOUT 代码:

POODOO    INHINT
    CA  Q
    TS  ALMCADR
 
    TC  BANKCALL
    CADR  VAC5STOR  # STORE ERASABLES FOR DEBUGGING PURPOSES.
 
    INDEX  ALMCADR
    CAF  0
ABORT2    TC  BORTENT
 
OCT77770  OCT  77770    # DONT MOVE
    CA  V37FLBIT  # IS AVERAGE G ON
    MASK  FLAGWRD7
    CCS  A
    TC  WHIMPER -1  # YES.  DONT DO POODOO.  DO BAILOUT.
 
    TC  DOWNFLAG
    ADRES  STATEFLG
 
    TC  DOWNFLAG
    ADRES  REINTFLG
 
    TC  DOWNFLAG
    ADRES  NODOFLAG
 
    TC  BANKCALL
    CADR  MR.KLEAN
    TC  WHIMPER

似乎不太容易读的样子…

阿波罗登月设计的源代码在 Github 上已经公然,有兴趣的可以去下方链接膜拜一下(可以去感受一下那时程序员的工程能力):

另外附一下那时代码的设计卖力人 Margaret Heafield Hamilton(女程序员)和完成的堆起来跟人一样高的代码量:
【知乎问题】如何让不懂编程的人感受到编程的魅力

第一个高级语言:FORTRAN

John Backus1950 年以一名科学程序员的身份加入 IBM 时,已经可以使用诸如 ADD 之类的助记词取代数字代码来编写程序,也就是我们的汇编语言。这使编程变得容易一些,然则纵然是一个简朴的程序也需要数十次操作,而且仍然很难找到错误。

巴克斯以为,应该有可能建立一种编程语言,使一系列盘算可以用类似于数学符号的形式来表达。然后,使用特定的翻译程序(以今天的术语来说是编译器)可以将其转换为盘算机可以明白的数字代码。

Backus 在 1953 年向他的司理提出了这个想法。他获得了预算,并被激励招聘一个小团队来测试该想法的可行性。三年后,该团队公布了一本手册,其中形貌了 IBM Mathematical Formula Translating System(简称 FORTRAN)。不久之后, IBM 向 IBM 704 的用户提供了第一个 FORTRAN 编译器。

【知乎问题】如何让不懂编程的人感受到编程的魅力

Backus 和他的团队缔造了天下上第一种高级编程语言。科学家和工程师将不再需要将其程序编写为数字代码或冗长的助记符

FORTRAN 代码演示

下面演示盘算并输出 8 * 6 的代码实例:

program VF0944
implicit none

integer a, b, c
a= 8
b= 6
c= a*b

print *, 'Hello World, a, b, c= ', a, b, c
end program VF0944

对比汇编代码,是不是看上去要清晰(人类可读)多了呢?

FORTRAN 的意义

FORTRAN 的问世在盘算机史上具有划时代的意义,它使盘算机语言从原始的低级汇编语言走出来,进入了更高的境界,使得 盘算机语言不再是盘算机专家的专利,使宽大的工程手艺职员有了举行盘算机编程的手段。

由此盘算机更快地深入到了社会之中,它在工业部门中初露头角,更是在火箭、导弹、人造地球卫星的设计中大显身手,因此有人称 FORTRAN 语言使盘算机的工业应用成了可能,是推动第二次天下大战以后西方工业经济苏醒和进入第二次工业革命的无形气力,是 “看不见的蒸汽机”。

一句话总结

盘算机先驱们已经为我们架设好了盘算机的天下,站在先驱巨人们的肩膀,我们现在很容易也可以看得更高和更远。

【知乎问题】如何让不懂编程的人感受到编程的魅力

Part 4. 构建自己独占的程序(天下)

【知乎问题】如何让不懂编程的人感受到编程的魅力

编码的兴趣有许多,把自己的想法着手实践就是其中一个。

例如网友玩儿游戏流动需要一直点鼠标,于是写了一个鼠标连点器:

【知乎问题】如何让不懂编程的人感受到编程的魅力

例如给自己心爱的妹子写一个恋爱纪念网站:

【知乎问题】如何让不懂编程的人感受到编程的魅力

例如给 FlappyBird 加一个强化学习算法让它自己学习若何航行:(图示已经能自己飞 4527 步了)

【知乎问题】如何让不懂编程的人感受到编程的魅力

例如网友自己写的文言文语言:(使用文言文写代码)

// HelloWorld 程序演示
吾有一數。曰三。名之曰「甲」。
為是「甲」遍。
	吾有一言。曰「「問天地幸亏。」」。書之。
云云。

运行输出:

問天地幸亏。
問天地幸亏。
問天地幸亏。

一句话总结

我们可以着手通过编程把我们的许多想法付诸于实现 (条件是不停探索和学习),并在迎接挑战和最终实现的历程中获得无限的兴趣。

【知乎问题】如何让不懂编程的人感受到编程的魅力

小总结

总体而言,IT 是令人兴奋的。

素有「软件吞噬天下」的说法,我们也正生涯在盘算机当道的天下。

而且编程并不是每小我私家都具备的手艺,借助手艺,一切皆有可能,而且现在互联网时代比以往都更有机遇学习和建立「自己的天下」。

【知乎问题】如何让不懂编程的人感受到编程的魅力

  • 本文已收录至我的 Github 程序员发展系列 【More Than Java】,学习,不止 Code,迎接 star:https://github.com/wmyskxz/MoreThanJava
  • 小我私家民众号 :wmyskxz,小我私家自力域名博客:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您配合发展!

【知乎问题】如何让不懂编程的人感受到编程的魅力

异常感谢列位人才气 看到这里,若是以为本篇文章写得不错,以为 「我没有三颗心脏」有点器械 的话,求点赞,求关注,求分享,求留言!

创作不易,列位的支持和认可,就是我创作的最大动力,我们下篇文章见!

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/22934.html