“计算机之父”冯·诺依曼是20世纪最重要的数学家之一,现代计算机、博弈论、核武器和生化武器等领域的科学全才,他在设计制造第一个电子计算机时提出了“冯·诺依曼”结构。
在这篇文章中,你将学习到以下内容
一、冯·诺依曼结构:
“冯·诺依曼”结构
计算机硬件有五大部分
- 运算器:进行算术和逻辑运算;
- 控制器:控制计算机持续协调运行;
- 存储器:存储数据和程序;
- 输入设备:从计算机外部获取数据;
- 输出设备:将计算结果反馈给外界。
基本步骤
- 控制器从存储器中取出程序语句和额外数据;
- 数据齐全的语句交给运算器进行算术或者逻辑运算;
- 3运算结果再存回存储器;
- 控制器确定下一条程序语句,回到步骤1继续。
- 控制器从存储器中取出程序语句和额外数据;
- 数据齐全的语句交给运算器进行算术或者逻辑运算;
- 3运算结果再存回存储器;
- 控制器确定下一条程序语句,回到步骤1继续。
二、编程语言的发展:
- 非结构化语言:编号或标签,GOTO,子程序可以有多个入口和出口;有分支,循环;
- 结构化语言:任何基本结构只允许是唯一入口和出口,有顺序、分支、循环,废弃GOTO。例如C语言:
- 面向对象语言:更加接近人类认知世界的方式,万事万物抽象成对象,对象间关系抽象成类和继承;有了封装、继承、多态;
静态语言:包含了很多计算机的底层细节,没有学过这些语言还是难以看懂,C语言也是静态语言。
例如C++:C++和C看起来很相似,但是特性完全不同
Java和C#是C和C++的接班人,解决了缺点但是代码冗杂、写起来诸多限制
动态语言:不需要在使用变量前进行声明,这些语言允许你使用更少的代码做更多的事。
许多年来,Perl一直是一门万能的动态语言,但是它的语法非常难用
PHP在web开发领域非常流行
最后就是我们的Python了
还有一种函数式语言,是古老的编程范式,应用在数学计算、并行处理的场景;函数是“一等公民”。Python在后面会经常用到函数,这在之后会讲到。
基本计算
基本计算语句
- Python语言的赋值语句很好地对应了“运算”和“存储”;
- 赋值语句的执行语义为:计算表达式的值,存储起来,贴上变量标签以便将来引用。与计算机运行过程中的“计算”和“存储”相对应;
- “控制器确定下一条程序语句”即对应“控制”。
- 在计算机运行过程中,“下一条语句”决定了计算机是能够自动调整、自动反复操作,还是只能像计算器那样一步接着一步计算。这种决定“下一条语句”的机制,在程序设计语言中称作“控制流程”
位运算符
二进制中,常用的位运算符有:&(与)、|(或)、~(取反)、^(异或)、<<(左移)、>>(右移),“与”就相当于乘,“或”相当于加(都是0相加为0,有1就是1),32//4相当于32>>2(在二进制中右移2位)
- 原码:5->0b101,1->0b1,-1->-0b1;
- 反码:正数的反码与原码相同,负数的反码符号位不变,其余按位取反;
- 补码:正数的补码与原码相同,负数的补码符号位不变,其余按位取反后+1,补码的补码是原码;
- 负数表示法:负数在计算机中使用补码存储,-1的补码为1111 1111;(5-1)->5+(-1),直觉上是0b101-0b1,其实计算机中是0b101+0b11111111,溢出位舍弃。
例:~12为什么是-13?
00001100 -> 11110011(此时是负数,除了第一位1是表示负号不变,其余位+1) -> 10001101 -> -13