Language

简介

语言的多义性决定了语言的丰富。但是对于计算机而言,描述必须精准

  • Syntax 语法
  • Semantics 语义
  • Pragmatics 语用

BNF语法图
句型: Thank sb for sth. 其中sb和sth都可以由其他东西替代(可替代部分+不可替代部分)
image.png
在BNF中,不可替代部分成为alphabet,又称作字。即:ASCII 定义了所有可以出现在程序中的字母表
如何判断标识符符合规定:

  1. deduct:“_a9”是一个identifier吗?

image.png
根据定义,利用递归,从上往下推导

  1. 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

  1. programming 是一种 science

image.png
用数学对前后置条件进行限制
image.png
经验:调试bug时要考虑数据流,而不是只是考虑输入流。看数值的变化是否满足对应的前后置的限制条件

  1. 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

image.png
simula 67 开销太大

发展历程

  1. 第一个程序设计语言 Fortran:解决了从汇编语言到高级程序设计语言的飞跃,主要问题是移植性差,从冯诺依曼结构产生出来,和机器硬件绑定太强
  2. Algol 60:把程序设计语言作为一个学科,提出了结构化程序设计语言的发展=>Algol 68
  3. CPL(combined programming language ) 和机器贴合紧密,过于注重细节=>B(bracket 闭合的语句块)CPL。把IO输入输出以库的形式提出,提出了闭合的相关概念=>B(进一步精简)=>C(写unix操作系统)
  4. 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(先进后出)仿真系统中有一些个体,并不是先创建就一定先消亡
  • 措施:
    1. 有一个可以描述行为的程序
    2. 有一个pointer能够控制实体
    3. 有些操作只能针对某些数据
    4. 需要管理者管理数据,控制其生命周期等

实现:写了一个runtime system,创建了一个关键字“SIMULA”(利用compiler先翻译为algol 60),兼容algol 60 =>SimulaI 1(不是设计语言)

Simula 67 为什么没有进一步发展?

  1. Born:在欧洲出身,缺少大量应用,科技中心在美洲
  2. Expensive
  3. 缺乏一个好的IDE,集成开发效率没有提示
  4. 没有更多的publication
  5. 程序占用体积非常大,对并发、数据类型、runtime的表述也不太好

C++的诞生

Bjarne Stroustrup

史前1979(剑桥实验室)

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

思考

image.png
哲学观(对C++的指导有一定重要作用):存在主义(与创始人-克尔凯郭尔同为丹麦人)=>尊重个体的差异性=>有用即可以包含进来=>成为各种工程师都可以使用的工具

  1. 实验更重要
  2. 不是科学家的玩物(《地下室手记》)
  3. 不是证明一种观点,而是解决一个问题,可以风格多样,而不是“真理之路 ”

1979(Bell Lab)

image.png
Bell Lab中有Unix的创始人(Ken Thompson)=>可以熟练使用C了

  • 并行用库实现
  • 舍弃常用的科学数据的支持
  • 遇到了Link问题,所以需要兼容C,利用C的link,放弃housekeeping

引入一切我觉得有用的东西,并且不轻易放弃 程序语言的设计者不替程序员做出决定

1982 发展

McIroy:做Unix的三剑客之一(RobPike、Thompson)
image.png

1983 诞生

image.png
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++的关系

  1. C++是C的超集
  2. C++支持C所支持的全部编程技巧
  3. 任何C程序都能被C++用基本相同的方法编写,并具备同等开销(时间、空间)

与可能出现的错误相比,更重要的是能做什么好的事情
Programmer needs to be trusted

补充

C语言:

  • 开发效率低
  • 易用性和安全性低(没有越界检查),是为了提高语言本身的表达能力
  • 运行效率高=>硬件效率高仍然需要软件的运行效率高 例如:3D渲染、自动驾驶、功耗控制
  • 具有不可替代性 不能保证新写的程序效果一定一样,程序正确性无法证明。早期用C语言写的,在关键领域中不能随意改变
  • 灵活、高效、可用、可移植
  • 某些语言结构不安全,没有舍弃C中的危险之处

书籍

image.png
image.png

image.png