从零开始的自我提升计划:计算机科学(五)

本系列为作者学习记录
感谢Jack-Cui视频的启发
视频地址:【计算机科学速成课】[40集全/精校] - Crash Course Computer Science

系列文章目录

从零开始的自我提升计划:计算机科学(一)
从零开始的自我提升计划:计算机科学(二)
从零开始的自我提升计划:计算机科学(三)
从零开始的自我提升计划:计算机科学(四)



前言

本文内容包括:

  1. 阿兰·图灵-Alan Turing
  2. 软件工程-Software Engineering
  3. 集成电路与摩尔定律-Integrated Circuits & Moore’s Law
  4. 操作系统-Operating Systems
  5. 内存和储存介质-Memory & Storage

一、阿兰·图灵

阿兰·图灵
计算机科学之父,阿兰·图灵,对计算机理论贡献巨大。他对计算机科学的建树始于1935年,开始着手解决“可判定性问题”:是否存在一种算法,输入正式逻辑语句,输出准确的“是”或“否”答案。他提出了一种假想的计算机——“图灵机”来解决这个问题,图灵机十分简单,它有无限长的纸带来存储符号、读写头来读取和写入符号、状态变量来保存当前状态,以及一组规则来描述机器的工作,规则根据当前状态和读写头看到的符号来决定机器做什么(工作方式有点类似数字逻辑中的Mealy型状态机,根据当前状态和输入来决定下一状态)。这个机器如果有足够的时间和内存,可以执行任何计算,是一台通用的计算机。如果一系列的操作数据的规则可以用来模拟图灵机,则称它为“图灵完备”的,现代计算系统几乎都是图灵完备的。
为了解决可判定性问题,阿兰·图灵将图灵机用于“停机问题”,简单来说就是给定图灵机描述和纸带,是否有算法可以确定图灵机是一直运行下去还是会在某点停机。图灵证明了停机问题是无法解决的:
先假设一个图灵机有问题的描述和纸带数据作为输入,输出“是”代表会“停机”,输出“否”代表“不会停机”,将其命名为H;然后假设另外一个图灵机,若H输出“停机”,则新的机器则不会停机,若H输出“不会停机”,则新的机器则会停机,实际上就是与H输出相反。我们还需要在机器前加一个分离器,让机器只接收一个输入,这个新机器称为Bizzaro(异魔,在DC漫画中与超人能力相反的反派角色)。若把Bizzaro的描述作为本身的输入,就相当于在问H,当Bizzaro的输入是自己时会怎样,如果H说Bizzaro会停机,那么Bizzaro则不会停机,如果H说Bizzaro不会停机,那么Bizzaro则会停机(与罗素悖论比较相似),因此H不能正确判断停机问题。
同样解决可判定性问题的还有另一位数学家,阿隆佐·丘奇,使用“Lambda算子”证明,但是使用的数学技巧十分困难。
可判定性问题的解决实际上证明了不是任何问题都可以用计算解决的,计算机的能力有极限,发展了可计算性理论,现在称为“丘奇-图灵论题”。
图灵的才能很快被应用到战争中,起先是破译德国使用英格玛机加密的情报,他发明了一个机电计算机,名为Bombe,利用英格玛机加密后的密文一定不会是本身的缺陷,对加密消息尝试多种组合,删除那些不可能的组合,提高破译效率。战后,图灵对计算机科学的发展贡献很大,最有名的贡献在于“人工智能”。

如果计算机能够欺骗人类相信它是人类,才算是智能。
                            ——阿兰·图灵

这成为了现在智能测试的基础,称为“图灵测试”。图灵对计算机科学领域贡献最大,有许多东西都以他命名,例如图灵奖,是计算机领域的最高奖项。

二、软件工程

软件工程
在写大型程序时,通过上节中的模块化思想,可以打包成若干个函数,但是函数的数量往往也还是太多,因此将函数打包为层级,把相关的代码都放在一起,打包成对象。对象可以包含其他对象、函数以及变量,将函数打包成对象的思想叫“面向对象编程”。“程序编程接口(API)”帮助程序员之间的合作,当需要调用其他对象的函数时,只需要知道使用方法即可,无需了解具体实现细节。API可以哪些函数和数据可以让外部访问,哪些仅供内部使用,在定义时指定函数是“public”或者“private”来设置权限。面向对象变成的核心是隐藏复杂度,选择性的放开功能,对于大型项目十分有效。C++、Python、Java等都是面向对象的编程语言。现在有许多专门用来写代码的工具,集成了许多功能,称为“集成开发环境(IDE)”。
这些IDE可以帮助程序员调试(debug)代码,防止问题的出现或解决已出现的问题。另外一个重要的工作是给代码编写文档注释,帮助使用者快速理解代码的功能。在编写大型程序时,往往有源代码管理来管理所有代码,程序员需要编写或者修改代码时从服务器中check out一段代码,修改测试没有问题后再提交,这样就可以有多名程序员同时编写代码,大大提高了效率。

三、集成电路与摩尔定律

集成电路与摩尔定律
之前我们提到,早期的电子计算机往往需要很多器件,需要很多真空管、电阻等,如果想要提升性能,就要加入更多的器件,导致更多线路、系统更加复杂,这就是“数字暴政”。晶体管的出现使电脑更快更小、但是它仍然是分立元件,并没有解决数字暴政的问题。1958年,Jack Killby将电路的所有组件都集成在一起,将多个组件打包起来,变成一个新的独立组件,这就是“集成电路(IC)”。几年后,Robert Noyce的仙童半导体使用硅来制作,使集成电路变为现实,他也被公认为现代集成电路之父。虽然IC集成了许多器件,但是还是需要连接起来,创造更大更复杂的电路,所以工程师们再次创新,产生了印刷电路板(PCB),它可以大规模生产,并且无需焊接或者使用大量的线。将PCB与IC结合,可以大幅减少独立组件和电线。
早IC的组件虽然很小,但是还是很难将多个晶体管集成到一个IC上,为了实现更加复杂的设计,“光刻”出现了(光刻的详细过程见视频)。光刻可以制作晶体管、电阻、电容等器件,同时还能制作好相互连接的电路。
1965年,戈登·摩尔看到了电子设备的进步趋势:得益于材料和制造技术的发展,每经过两年,在同样的大小空间,可以放入两倍数量的晶体管,这就是“摩尔定律”。晶体管更小密度更高有诸多好处,例如功耗更低、延迟更小等。但是现在进一步小型化已经遇到了问题,一是光刻的精度已经几乎达到极限,二是小型化导致的量子隧穿效应,现在科学家和工程师们正在努力解决这两个问题。

四、操作系统

操作系统
早期的计算机都是通过人手动放入卡片来进行运算,在运算速度还不是很快的时候,这种方式勉强可以接受。但是随着计算机的速度越来越快,放入卡片的时间可能比程序运行的时间都要久,因此我们需要一种让计算机自动运作的方式,“操作系统”就诞生了。
第一个操作系统优化了程序加载的方式,可以一次给予多个程序,将运行完一个程序后自动运行下一个,这叫作批处理。最早,我们编程通常只是针对单个计算机的,因此对它的打印机等外部设备的细节十分了解;但是当计算机越来越普及时,很多计算机可能使用的外部设备不相同,使得程序员在编写程序时还需要考虑不同的外部设备,这带来了诸多问题。为了使变成更加容易,操作系统充当了软件和硬件之间的媒介,提供API来抽象硬件,称为“设备驱动程序”,可用标准化的输入输出接口(I/O)与硬件交互。
通过操作系统,软件与硬件的交互更加简单,但是程序运行时通常都会在硬件设备上耗费大量时间,然而在硬件设备运作时CPU则什么都不做,为了解决这个问题,英国曼彻斯顿大学研究了一个名为“Atlas Supervisor”程序,不仅可以像批处理系统自动加载程序,还可在单个CPU上同时运行几个程序,通过调度来完成这个操作。使多个程序同时运行,在单个CPU共享时间,操作系统的这种能力叫“多任务处理”。同时运行多个程序时需要给每个程序分配固定的内存块以防止在切换时数据丢失,但是这种内存块可能是不连续的,因此操作系统会将内存地址虚拟化,这叫“虚拟内存”,使得内存地址总是从地址0开始,实际的物理位置被操作系统隐藏并抽象了。这种机制使得程序的内存大小可以灵活增减,称为“动态内存分配”,有利于多个程序的运行。这种分块的内存同时也可以在某个程序出错时对内存的错误修改,不至于影响到其他程序,这叫“内存保护”,同时也可以一定程度防止恶意程序。
1970年代,计算机使用多个“终端”来连接到主机,终端只是连接到主计算机的键盘和屏幕,没有处理能力。为了确保某个用户不会占满资源,开发了“分时系统”,每个用户只能使用一部分处理器和内存,最出名的是Multics系统,它是第一个从设计时就考虑到安全的操作系统,不希望恶意用户访问不该访问的数据,使得它的复杂度也超过当时的平均水平。
后来两个Multics的研究院开发了一个新的操作系统——Unix,他们把系统分为两部分,一是例如内存管理、多任务、输入/输出管理等核心功能称为“内核”;二是例如程序和运行库等有用的工具。Unix系统当系统发生错误时,就让内核“恐慌(PANIC)”,当调用它时,机器就会崩溃,这使得系统更加简单,这种简单性让Unix可以在更便宜更多的硬件上运行。
经过一步步发展,就有了现代操作系统,例如Windows、Linux、iOS、Android等,这些操作系统仍然具有“多任务”、“虚拟内存”、“内存保护”等功能。

五、内存和储存介质

内存和储存介质
这节讲到的是存储,与内存不同,存储器中的数据直到被覆盖或者删除,会一直保存,断电也不会丢失。以前我们认为内存的速度要比存储的速度快,但随着技术发展,二者的差距越来越小。
最早的存储器是打孔纸卡以及打孔纸带,缺点是读取慢,并且只能写入一次。在建造ENIAC时,J. Presper Eckert发明了“延迟线存储器”,顾名思义,是利用延迟来存放数据,它的缺点也十分明显,即每个时刻只能读一位数据,并且需要顺序读取,因此又称为“顺序存储器”或“循环存储器”。
显然这种顺序读取不是我们想要的,我们想要的是可以随时访问任何位置的存储。1950年代中期出现了性能更优的存储器——“磁芯存储器”,利用磁化方向来表示数据,断电后磁化方向仍保持原状,利用行线和列线控制每个位置的存储。
后来,“磁带”出现了,通过控制磁带中“写头”的电流,磁化磁带中的一小部分产生电流,利用电流方向存储信息,然后使用“读头”来在不破坏的前提下检测极性。磁带的缺点主要在于读取速度,因为它是连续的,必须快进或者倒退到特定位置。有个类似于磁带的技术是“磁鼓存储器”,在金属圆筒上覆盖满磁性材料来记录数据,但是它有数十个读写头,且转速很快,提高读写效率。
虽然磁鼓已经不再生产,但是它刺激了“硬盘”的发展,使用盘替代磁鼓中的圆筒,因此得名。因为盘很薄,因此可以叠在一起存储数据,在读写数据时,一个读写磁头上下移动找到正确的磁盘然后滑进去再找到当前磁盘内所要查找的数据位置。软盘除了磁盘是软的,其他与硬盘几乎一致,因为比较便捷而在1970~1990年比较流行。
光学存储器在1972年开始出现,最具代表性的即“光盘”,光盘上有许多小坑,造成光的不同反射来存储数据。
如今存储技术在朝着固态前进,没有机械活动的部件,例如固态硬盘(SSD)


总结

本文介绍了阿兰·图灵、软件工程、集成电路与摩尔定律、操作系统以及内存和储存介质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值