2021/12
图灵机
Brainfuck 在线编译 https://copy.sh/brainfuck/
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
| 字符 | 含义 | | ---- | ------------------------------------------------------------ | | > | 指针加一 | | < | 指针减一 | | + | 指针指向的字节的值加一 | | - | 指针指向的字节的值减一 | | . | 输出指针指向的单元内容(ASCⅡ码) | | , | 输入内容到指针指向的单元(ASCⅡ码) | | [ | 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 | | ] | 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
Lambda演算(λ)
Beta「规约」:是把标识符用参数值替换;执行任何可以由机器来完成的计算。
(lambda x . x + 1) 3 == 3 + 1
(lambda y . (lambda x . x + y)) q == lambda x . x + q
(lambda x y. x y) (lambda z . z * z) 3 == (lambda z . z * z) 3 == 3 * 3
//只有在不引起绑定标识符和自由标识符之间的任何冲突的情况下,才可以做Beta规约
lambda z . (lambda x . x + z)
(lambda z . (lambda x . x + z)) (x + 2) == (lambda z . (lambda y . y + z)) (x + 2) == (lambda y . y + x + 2) 3 == 3 + x + 2
数字:丘奇数都是带有两个参数的函数
0是“ lambda s z . z
“
1是“ lambda s z . s z
“
2是“ lambda s z . s (s z)
x + y
let add = lambda s z x y . x s (y s z) == lambda x y . (lambda s z . (x s (y s z)))
形如 if / then / else
语句的表达式
let TRUE = lambda x y . x
let FALSE = lambda x y . y
let IfThenElse = lambda cond true_expr false_expr . cond true_expr false_expr
let BoolAnd = lambda x y . x y FALSE
let BoolOr = lambda x y. x TRUE y
let BoolNot = lambda x . x FALSE TRUE
“柯里化”(Currying)
图灵机引出了命令式编程
λ演算引出了函数式编程
2021/5
计算机历史
自上而下的规划设计,自下而上的进化体系
软件设计所需要的能力(抽象能力,洞察力)
软件危机
软件复杂性,复杂性四个原因:
克服人类能力的限制
抽象的意义
类型的意义
封装的意义
模块化的意义
紧凑型和正交性(复杂度是否能装入人脑;操作的不相关性,修改每个属性的方法有且只有一个)
并发的意义
复杂软件系统设计的要素
表示法(编程语言,影响复杂度)(表现力,阿拉伯数字表示法)
设计过程(分解;抽象;层次结构)
工具(IDE,log ,性能分析,编码格式规范,代码管理,单元测试等等)
编程语言历史,随着硬件能力的增长
命名和绑定(一切抽象的起始)
静态分配内存
动态分配内存(有分配有回收)
作用域规则
控制流
表达式求值
结构化和非结构化的流程
迭代和递归
应用序和正则序求值
数据类型(bit + 上下文 == 信息)
类型系统
类型等价:
结构等价
名字等价(现代编程语言大都基于名字等价)
通用类型:java的Object ,C中的void*,go 的 interface{}
数组
字符串
指针
值模型,引用模型
面向对象特征(认为事物的关系 is a , has a)(对象之间不共享的状态远大于共享状态时,面向对象编程比较好)
函数式编程特征
数据驱动编程的核心是数据结构(建模),而不是算法
元语言抽象(创造一种新语言,逻辑式语言,SQL,正则表达式)
编程的本质就是控制复杂度
unix文化
开源文化:linux apache mysql 。。。(unix历史的教训,距离开源越近越繁荣)
作为编程语言,创造世界的工具,go语言一些特点(助于我们学习和使用go语言)
80年代c;为什么是java;为什么是go(主流工业级系统开发基本没有小型系统了;编程语言作为被选型的用来描述和创造虚拟世界的工具)
推荐书: