第一课 发展历程
Language
简介
语言的多义性决定了语言的丰富。但是对于计算机而言,描述必须精准
- Syntax 语法
- Semantics 语义
- Pragmatics 语用
BNF语法图
句型: Thank sb for sth. 其中sb和sth都可以由其他东西替代(可替代部分+不可替代部分)
在BNF中,不可替代部分成为alphabet,又称作字。即:ASCII 定义了所有可以出现在程序中的字母表
如何判断标识符符合规定:
- deduct:“_a9”是一个identifier吗?

根据定义,利用递归,从上往下推导
- reduce:按照递归树从下往上推导
语言是建立在一定的字母表上,按照一定的规则,所构成的符号串的集合。(集合是无穷无尽的,因为包含了递归)
编译器:完成识别的过程,判断语言是不是符合对应的规则。把程序员所写的语言程序等价翻译为机器语言
语言分类
语言的约束越强,对应的集合越小
- RG:Regular Grammer 正则语法 — FA:finite automata 有限状态自动机
- CFG: Context Free Grammer —PDA:push down automata
- CSG:context sensitive Grammer —LBA: linear bounded automata 线性界限自动机
- PSG —TM:
程序语言:词法符合RG,语法大多数符合CFG
Programming
- programming 是一种 science

用数学对前后置条件进行限制
经验:调试bug时要考虑数据流,而不是只是考虑输入流。看数值的变化是否满足对应的前后置的限制条件
- programming 是一种 art “The Art of Computer Programming”
类比:以法国人的思维说法语
Progarmming Paradigm
命令式程序设计 imperative programming
清楚的知道内存中数据的表示,每一条指令都是清晰的
- Procedural
- Object-Oriented
declarative programming
- Functional: side effect函数副作用,函数发挥作用时受上下文环境影响。在此处的function不能有side effect。f() g()可以并行地发挥作用,前后顺序不影响结果
例如:在排版系统中,加粗和调整字体都是functional programming
- Logical programming paradigm:根据已知的规则和事实进行判断 prolog
Development History

simula 67 开销太大
发展历程
- 第一个程序设计语言 Fortran:解决了从汇编语言到高级程序设计语言的飞跃,主要问题是移植性差,从冯诺依曼结构产生出来,和机器硬件绑定太强
- Algol 60:把程序设计语言作为一个学科,提出了结构化程序设计语言的发展=>Algol 68
- CPL(combined programming language ) 和机器贴合紧密,过于注重细节=>B(bracket 闭合的语句块)CPL。把IO输入输出以库的形式提出,提出了闭合的相关概念=>B(进一步精简)=>C(写unix操作系统)
- Simula 67
C++:
- 结构化程序设计基因:Algol 60
- 系统程序设计基因:CPL
- object-oriented programming OO思想:Simula 67
OO的诞生-Simula 67
- Simulation System:需要求的数值,但是没有现实的模型。需要映射出一个模型,通过实验的手段,在人为营造的环境中让系统不断演变
- 背景: Nygaard 做核反应堆铀棒直径的计算,需要做一个simulation system
用新的表述方法(simulation language)去描述仿真系统中的活动,而不是人为的去用代码描述
- 选择:Fortran or ALGOL 60
后者:有块结构+优良的程序安全,问题更少+欧洲情结(Fortran在美洲)
- 入手:打破LIFO(先进后出)仿真系统中有一些个体,并不是先创建就一定先消亡
- 措施:
- 有一个可以描述行为的程序
- 有一个pointer能够控制实体
- 有些操作只能针对某些数据
- 需要管理者管理数据,控制其生命周期等
实现:写了一个runtime system,创建了一个关键字“SIMULA”(利用compiler先翻译为algol 60),兼容algol 60 =>SimulaI 1(不是设计语言)
Simula 67 为什么没有进一步发展?
- Born:在欧洲出身,缺少大量应用,科技中心在美洲
- Expensive
- 缺乏一个好的IDE,集成开发效率没有提示
- 没有更多的publication
- 程序占用体积非常大,对并发、数据类型、runtime的表述也不太好
C++的诞生
Bjarne Stroustrup
史前1979(剑桥实验室)

PASCAL??为什么不选择–类型系统的支持太弱
但是,遇到了灾难:缺点-性能差,无法从模拟器中获取数值,模拟器没有提供他所需要的数值
问题:Linker 不适合大程序 原因:运行中 的类型检查和废料收集消费了80%
第二阶段:BCPL 缺点:太复杂,Debug难
不使用C:对C语言不熟悉
BCPL不是一个合适的工具,并且目前对C不熟悉
所以此时并没有发明C++的想法,有做一定的思考
思考

哲学观(对C++的指导有一定重要作用):存在主义(与创始人-克尔凯郭尔同为丹麦人)=>尊重个体的差异性=>有用即可以包含进来=>成为各种工程师都可以使用的工具
- 实验更重要
- 不是科学家的玩物(《地下室手记》)
- 不是证明一种观点,而是解决一个问题,可以风格多样,而不是“真理之路 ”
1979(Bell Lab)

Bell Lab中有Unix的创始人(Ken Thompson)=>可以熟练使用C了
- 并行用库实现
- 舍弃常用的科学数据的支持
- 遇到了Link问题,所以需要兼容C,利用C的link,放弃housekeeping
引入一切我觉得有用的东西,并且不轻易放弃 程序语言的设计者不替程序员做出决定
1982 发展
McIroy:做Unix的三剑客之一(RobPike、Thompson)
1983 诞生

cPP:pre Process 预处理:做editor工作。define<=>find & replace 编辑不是编译
Cpre:C with class 翻译成C。如果出错则即使返回。由C compiler判定有无语法上的错误
Cfront:C++的语法检查器,此时C compiler不做语法上的检查
C++是C的扩充,编译时不是直接翻译成机器代码的,而是C,需要依靠C的link
- ANSI:科学家+工程师+工具的开发者。业界专业人士认可
- ISO:国际组织
正交性:功能上的冲突
C和C++的关系
- C++是C的超集
- C++支持C所支持的全部编程技巧
- 任何C程序都能被C++用基本相同的方法编写,并具备同等开销(时间、空间)
与可能出现的错误相比,更重要的是能做什么好的事情
Programmer needs to be trusted
补充
C语言:
- 开发效率低
- 易用性和安全性低(没有越界检查),是为了提高语言本身的表达能力
- 运行效率高=>硬件效率高仍然需要软件的运行效率高 例如:3D渲染、自动驾驶、功耗控制
- 具有不可替代性 不能保证新写的程序效果一定一样,程序正确性无法证明。早期用C语言写的,在关键领域中不能随意改变
- 灵活、高效、可用、可移植
- 某些语言结构不安全,没有舍弃C中的危险之处
书籍


