计算机原理 三

11.编程语言发展史

编程:二进制–>助记符–>A-0(编译器)–>FORTRAIN

二进制写程序,先纸上写伪代码,手工转二进制,然后再由计算机执行
但人们很快就厌烦了这种方式

程序员开发出一种新语言,更可读、更高层次
为每个操作码分配一个简单的名字 –“助记符”
例如写代码0和1,不如直接写LOAD_A 14。为了把助记符转二进制,编译器诞生(Assembler)

葛丽丝·霍普(Grace Hopper)–哈佛1号计算机首批程序员,海军军官

Grace设计了编程语言A-0

Grace 1952年做了第一个编译器(Compiler),实现A-0
编译器专门把高级语言转成低级语言
比如汇编或机器码(CPU可以直接执行机器码)

变量(Variables):代表内存地址的抽象

FORTRAIN由IBM在1957年发布,但只能在一种机器上运行
后来为了开发一种通用语言,可以在不同机器上通用

出现了“普通面向商业语言”–COBOL

新语言:
1960年代:ALGOL,LISP,BASIC
1970年代:Pascal,C,Smalltalk
1980年代:C++,Objective-C,Peri
1990年代:Python,Ruby,Java
等等…

12.编程基础–语句和函数

变量,赋值语句
a = 5
b = 10
c = a + b

Grace Hopper 拍虫子游戏
阻止虫子飞行继电器进行破坏
1.初始化变量
例如:关卡=1 分数=0 虫子数=5 备用继电器=4 玩家名=Andre
2.为了做成交互性游戏,程序的执行顺序要更灵活,因此需要用“控制流语句”
if判断、while循环、for循环

函数:将代码进行打包,也叫“方法”或“子程序”(有些编程语言这么叫)
RETURN语句,指明返回什么

13.算法入门

选择排序–非常基础的一种算法
首先在一堆数中选择最小的数放在第一个位置,然后再从第二个位置到最后一个位置进行遍历,找到最小的数放在第二个位置,依次循环,直到找到最后一个数结束
这意味着,大致来说,如果要排N个东西,就要循环N次,每次循环中再循环N次,共N*N,或N^2

算法的“输入大小”和“运行步骤”之间的关系叫算法的复杂度
计算机科学家们把算法复杂度叫–大O表示法
选择排序算法复杂度**O(N^2)**效率不高
例如之前的选择排序对8个数进行排序,那么就是(n=8),运行时间:8^2=64
将8变成80,运行时间也就是6400
虽然数量只增加了10倍,但是运行时间增加了100倍

归并排序
1.先检查数组大小是否>1,如果是就把数组分成两半,如果仍然大于1,那么继续往下分,直到数组大小<=1
2.然后将两个元素进行比较,按大小顺序组成一个数组,当所有单个元素比较完之后,再将有两个元素的数组进行比较大小,组合成新的四个元素的数组。直到所有元素均在一个数组就排序完成了
归并排序算法复杂度O(N*log 2(N)),其中N是需要比较+合并的次数,log2(N) 是合并步骤的次数
例如8个数进行排序,运行时间就是8log2(8)=24
将8变成80,运行时间80
log2(80)(约在6-7之间)约等于480-560之间

Dijkstra 算法–图
**O(n log10( n + I))**n是节点数,I是多少条线

14.数据结构

数组:也叫列表或向量(在其他编程语言里)
数组的值一个个连续存在内存里
为了拿出数组中某个值,我们要指定一个下标(index)
大多数编程语言里,数组下标都是从0开始,用方括号[ ]代表访问数组
例如想要加数组J的第一个和第三个元素并把结果存在变量a中就用a = J[0] + J[2]

字符串:其实就是字母,数字,标点符号等组成的数组
字符串在内存里以0结尾(告诉计算机什么时候停下),并不是“字符0”,是“二进制值0”这叫字符“null”,表示字符串结尾
字符串函数:strcat连接字符串,接收两个字符串,把第二个放到第一个结尾

矩阵:数组的数组
一个3x3矩阵就是长度为3的数组,数组里每个元素都是长度为3的数组
例如j = { {10,15,12},{8,7,42},{18,12,7}}为了拿一个值,需要两个下标,比如j[2][1]

结构体:多个变量打包在一起
不同类型的数据可以放在一起

指针:是一种特殊变量,指向一个内存地址,因此得名

链表:可以存很多节点,灵活性是通过每个节点 指向 下一个节点实现的
“null”,代表链表的尽头

队列,先进先出(FIFO)。出队和入队

,后进先出(LIFO)。出栈和入栈

,最高的节点叫“根节点”,根节点下的所有节点,都叫子节点
任何子节点的直属上层节点叫“母节点”
没有任何“子节点”的节点称为“叶子节点”
树还有一个重要性质:“根”到“叶”是单向的

,数据随意连接,包括循环

还有红黑树和堆…

15.阿兰·图灵

图灵:计算机科学之父,于1912年出生在伦敦
从小就表现出惊人数学和科学能力
他对计算机科学的建树始于1935年(23岁),当时是剑桥国王学院的硕士生
他开始解决德国数学家 大卫·希尔伯特 提出的问题,即可判定性问题

可判定性问题:
是否存在一种算法,输入正式逻辑语句
输出准确的“是”或“否”的答案
如果这样的算法存在
可以回答比如“是否有一个数大于所有数”

阿隆佐·邱奇,于1935年首先提出解决方法
开发了一个lambda算子的数学表达系统
证明了这样的算法不存在
虽然lambda算子能表示任何计算,但是他使用的数学技巧 难以理解和使用
于是图灵提出了一种假想的计算机,现在叫“图灵机”

图灵机,是一台理论计算设备,提供了简单又强大的数学计算模型
举个例子:让图灵机读一个以零结尾的字符串,并计算1的出现次数 是不是偶数
如果是,在纸带上写一个1;如果不是,在纸带上写0
图灵机是很强大的计算模型,如果时间和内存足够可以实现执行任何计算

停机问题:给定图灵机描述和输入纸带,是否有算法可以确定
机器会永远算下去还是到某一点会停机?
想象有一个假想图灵机H,输入:问题的描述 + 纸带的数据
输出Yes代表“停机”,输出No代表不会
图灵推理说:如果有个程序,H无法判断是否会“停机”,意味着“停机问题”无法解决
为了找到这样的程序,图灵用H设计了另一个图灵机
如果H说程序会“停机”,那么新机器会永远运行(即不会停机)
如果H的结果为“不会停机”,那么新机器输出No,然后“停机”
这是一个勃论,意味着“停机问题”不能用图灵机解决

邱奇和图灵证明了计算是有极限的,从1936年到1938年,在丘奇的指导下
他在普林斯顿拿到博士学位,毕业后回到建桥

1939年后不久,英国卷入第二次世界大战
图灵破解德军英格玛加密机,总共有上十亿种可能
一大缺陷是:字母加密后绝不会是自己,比如H加密后绝对不是H
于是图灵利用这个缺陷设计了一个机电计算机,叫Bombe
德国人时不时会怀疑有人在破解,然后升级英格玛机,比如加一个齿轮,创造更多可能组合

1950年,图灵设想了未来的计算机,拥有和人类一样的智力,或至少难以区分
图灵提出:如果计算机能欺骗人类相信它是人类,才算是智能,达成了智能测试的基础,如今叫“图灵测试”

图灵的个人生活:1952年调查他家的入室盗窃案时,向当局暴露了他的性取向
被起诉“行为严重不检点”
图灵被定罪,有两个选择:1.入狱 2.接受激素来压制性欲
他选择了后者,部分原因是为了继续学术工作,但药物改变了他的情绪和性格
最终图灵1954年服毒自尽,年仅41岁

图灵奖:计算机领域的最高奖项,相当于物理,化学等其他领域的诺贝尔奖

猜你喜欢

转载自blog.csdn.net/m0_56901161/article/details/116172593
今日推荐