Python

恭喜你,已经浏览完了cs61a的大部分内容,剩下的都是一些介绍性质的,即使我再去看着以前的笔记也想不起什么…


科班应该是专门有一节课讲编译原理的,不过显然我没有去学习与了解过,不过cs61a的精髓不在笔记上,也不在概念上,我倒觉得精髓在习题上,尤其那一道找硬币的递归算法,感觉递归被这门课完成花了。简要的总结下:



状态机由两个部分组成

  1. 状态
  2. 状态的流转

与之对应的就是编程语言的值(value)与表达式(expression)

在python这门语言的值就是:int、float、bool、str、tuple、NoneType、list、dict、set

在java中则是基本类型:byte、short、int、long、float、double、char、boolean

函数(function)在python中也是值,可以作为参数传递给其他函数,或者说函数本质就是一串表达式的集合。函数的语法说明就是signature(方法名称+参数)标明了如何调用函数。函数的语义说明就是a.前置条件-对调用者的约束,需要有哪些参数等条件才能调用。b.后置条件-函数的实现保证了函数的功能。


状态的初始化:

变量定义了状态

赋值语句、定义函数时将函数赋值给了名称、调用函数时的参数传递


状态的流转:

可以简化理解为表达式的求解(递归求值)+ 变量的求值

变量的求值,又进一步涉及到一个概念–环境(命名空间):变量一定是在一定的背景环境下求值的。不同的命名空间下的变量a,其值是不同的


默认情况下我们总是顺序执行指令,引入“语句(statement)”概念,语句就是控制求值顺序的,其本身不涉及求值,诸如if、while等

值+表达式+函数+环境+语句这一套概念,基本实现了一个编程语言的抽象,可以通过编程语言描述一个状态机。



再进一步,我们引入了ADT(abstract data type):抽象数据类型,封装一些数据+对数据的操作。

这门课还有一个非常重要的概念:REPL(read-eval-print-loop)


恭喜你,不应该对任何编程语言感到恐惧了🤒(只要我的抽象层级足够高🤣)