读普林斯顿计算机公开课04编程(上)

1. 编程

1.1. 算法和程序之间的区别就像图纸和建筑物之间的区别:一个是理想化的,另一个是具体存在的

  • 1.1.1. 算法是一个精确而没有歧义的“菜谱”

    • 1.1.1.1. 是用一组确定的基本操作来表达的,这些操作的含义是完全已知并且明确的
  • 1.1.2. 程序绝不是抽象的,它是对真正的计算机为了完成一项任务必须执行的每一步的具体表述

1.2. 程序又是以计算机能够直接处理的某种形式表达出的一个或多个算法

1.3. 程序必须考虑实际的问题,比如内存不足、处理器速度不快、无效或恶意的输入数据、错误的硬件、网络连接中断,以及人性的弱点

1.4. 世界上没有足够的程序员来完成如此大量的编程工作,以使得计算机能完成我们想要或需要的一切

1.5. 计算机领域一个持续的主题就是利用计算机来处理越来越多的编程细节

1.6. 管理一台计算机的资源也十分困难,尤其是在现代硬件越来越复杂的情况下

  • 1.6.1. 让计算机来掌控自己的操作,而由此就有了所谓的操作系统

1.7. 编程语言是我们告诉计算机做什么的方式

2. 汇编语言

2.1. 对于第一台真正可编程的电子计算机来说,编程实在是一个费力的过程

  • 2.1.1. 威尔克斯是EDSAC的设计者和实施者,EDSAC是最早的存储程序计算机之一,于1949年投入使用

  • 2.1.2. 莫里斯·威尔克斯于1967年获得了图灵奖,并在2000年被封为爵士

2.2. 用一个程序操纵另一个程序

  • 2.2.1. 执行具体操作的程序被称为汇编器(assembler)

    • 2.2.1.1. 最初也用来组装(assemble)程序中由其他程序员事先写好的部分

    • 2.2.1.2. 相应的语言叫作汇编语言,而这个层次上的编程叫作汇编语言编程

2.3. 汇编器使得修改程序变得容易许多,因为汇编器会跟踪每条指令和数据值在内存中的位置,程序员就不必手工来记录了

2.4. 针对特定处理器架构的汇编语言只能用于该架构,汇编语言通常与处理器的指令一一对应,它知道指令以二进制编码的特定方式,以及信息如何存储在内存中

  • 2.4.1. 如果要将汇编语言程序从这些处理器中的一个转换到另一个,程序必须完全重写

3. 高级语言

3.1. 高级语言使人们能够使用更接近人类表达的方式来表达计算

  • 3.1.1. 高级语言编程接近人类的思维方式,因此更易于学习和使用

  • 3.1.2. 人们不需要熟悉特定处理器的指令表,就可以使用高级语言高效地编程

3.2. 用高级语言编写的代码经过一个翻译程序,可被翻译为特定目标处理器的汇编指令

  • 3.2.1. 这个翻译程序通常被称作编译器,同样是一个不能传达太多洞见信息的老术语

3.3. 在实际情况下,编译器内部可能划分成一个“前端”和多个“后端”​

  • 3.3.1. ​“前端”负责把高级语言的程序转换为某种中间形式

  • 3.3.2. “后端”则负责把中间表现形式转换成针对特定体系结构的汇编指令

  • 3.3.3. 这种组织方式要比使用多个完全独立的编译器更简单

3.4. 高级语言程序独立于各种体系结构,通常同一个程序无需任何修改即可在不同的体系结构上运行

  • 3.4.1. 程序可以只编写一次,便能在不同计算机上运行了

  • 3.4.2. 编译器生成的汇编代码远不如一个熟练的汇编程序员写得精简而高效

  • 3.4.3. 编译器作者付出了很大努力,使得生成的代码能够达到手写代码一样好,而这有助于高级语言的流行

3.5. 编译环节也为发现各种拼写错误、语法错误等疏漏提供了机会

  • 3.5.1. 程序员必须在生成可执行程序之前纠正这些错误

3.6. 第一类高级语言专注于特定的领域

  • 3.6.1. FORTRAN

    • 3.6.1.1. 最早的一门语言之一叫作FORTRAN,这个名字来源于“公式翻译”​,现在写成“Fortran”​

    • 3.6.1.2. Fortran是由约翰·巴库斯(John Backus)领导的IBM团队开发的,在科学和工程计算方面非常成功

3.6.1.2.1. 巴库斯1977年获得图灵奖,其中部分原因就是他关于Fortran方面所做的工作

  • 3.6.1.3. 自1958年以来,Fortran经历了几次大的变革,但其核心仍是同一种语言

    • 3.6.2. COBOL
  • 3.6.2.1. 20世纪50年代末的第二个主要的高级语言是COBOL(Common Business Oriented Language,面向商业的通用语言)​

  • 3.6.2.2. 格蕾斯·霍普(Grace Hopper)对汇编语言高级替代品的研究对它产生了重大影响

  • 3.6.2.3. COBOL是专门针对商业数据处理的语言,其语言特征非常适合表达管理库存、准备发票、计算工资等方面的数据结构和计算

  • 3.6.3. BASIC

    • 3.6.3.1. Beginner's All-purpose Symbolic Instruction Code,初学者通用符号指令代码

    • 3.6.3.2. 约翰·凯梅尼(John Kemeny)和汤姆·库尔茨(Tom Kurtz)于1964年在达特茅斯开发出来的同时代的另外一门语言

    • 3.6.3.3. 设计目标是要成为教授编程的简易语言

    • 3.6.3.4. 特别简单,只需要非常有限的计算资源,因此也成为第一批个人计算机上可用的第一门高级语言

    • 3.6.3.5. 微软公司的创始人比尔·盖茨和保罗·艾伦的发迹,也是始于为1975年的Altair微型计算机编写BASIC编译器,这个编译器是微软公司的第一个产品

  • 3.6.4. FORTRAN、COBOL和BASIC获得成功的部分原因,是它们都专注于某个特定的应用领域,而且有意不去试图处理所有可能的编程任务

3.7. 专门为“系统编程”开发的语言

  • 3.7.1. 20世纪70年代,出现了专门为“系统编程”开发的语言

  • 3.7.2. 最成功的是C

    • 3.7.2.1. 由丹尼斯·里奇(Dennis Ritchie)于1973年在贝尔实验室开发,至今仍然是最流行和广泛应用的编程语言之一

    • 3.7.2.2. 从那时到现在,C的变化不大,今天的一段C程序与30或者40年前的相比,几乎没有多大差别

    • 3.7.2.3. 汽车、飞机、宇宙飞船和武器上的控制系统

3.7.2.3.1. 紧凑、快速的代码很重要,所以像C这样高效的语言仍然会被使用

  • 3.7.3. 20世纪80年代C++语言问世,C++语言由比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)同样在贝尔实验室开发,定位是应对大型程序开发过程中的复杂性

    • 3.7.3.1. 大多数情况下,C程序也是有效的C++程序

    • 3.7.3.2. 今天,我们在计算机中使用的主要软件都是用C或C++编写的

  • 3.7.4. Java

    • 3.7.4.1. 最初的目标是开发小型嵌入式系统

    • 3.7.4.2. Java也是编写Android程序的主要语言

  • 3.7.5. JavaScript

    • 3.7.5.1. 是C衍生语言大家族的一员,但它与C的差别非常大

    • 3.7.5.2. 是布兰登·艾奇(Brendan Eich)于1995年在网景公司开发的

    • 3.7.5.3. 除了共享部分名称外,JavaScript与Java没有任何关系

  • 3.7.6. Python

    • 3.7.6.1. 由吉多·范罗苏姆(Guido van Rossum)于1990年在阿姆斯特丹的荷兰国家数学和计算机科学研究学会(Centrum Wiskunde &Informatica, CWI)开发并推出

    • 3.7.6.2. 从一开始就注重可读性

    • 3.7.6.3. 很容易学习,并且已经成为所有语言中使用最广泛的语言之一,拥有丰富的软件库集合,几乎可以用于任何可以想到的编程任务

3.8. 所有语言在形式上都是等价的,因为都可以用于模拟图灵机或者被图灵机所模拟,但这绝不是说它们都适用于所有的编程任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值