惰性有什么好处?
计算机原理 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
它有什么实用价值?
现代语言用哪种?
闭包捕获的是值还是引用?
怎么避免?
举三个常见的高阶函数。
类型能不能是一等公民?
读取当前时间的函数纯吗?
代价是什么?
这靠什么数据结构实现?
参考答案(家长):能先判空再访问,避免空指针。
参考答案(家长):能定义无限序列,只取需要的部分。
参考答案(家长):不同语言不同,这也是常见的坑。
参考答案(家长):几乎都用静态作用域,因为读代码就能确定。
参考答案(家长):映射、过滤、归约。
参考答案(家长):每轮创建一个新的局部变量再捕获。
参考答案(家长):不纯,同样调用返回不同结果。
参考答案(家长):有些语言可以,那叫依赖类型系统。
参考答案(家长):树,改一个叶子只需重建它到根的路径。
参考答案(家长):可能产生更多对象,需要结构共享来优化。
能完全没有副作用吗?
这样测试有什么好处?
为什么必须是最后一步?
类型的价值是什么?
各适合什么场景?
举一个弱类型的坑。
推导不出来时怎么办?
没有泛型怎么办?
这个原则叫什么?
为什么参数要逆变?
参考答案(家长):不用搭数据库和网络,跑得快也稳定。
参考答案(家长):不能,程序总要和外界交互,但可以把它集中隔离。
参考答案(家长):把一类错误从运行时提前到编译期。
参考答案(家长):否则返回后还要做事,栈帧不能被复用。
参考答案(家长):字符串和数字相加,结果取决于语言的隐式规则。
参考答案(家长):大型长期项目偏静态,快速脚本和原型偏动态。
参考答案(家长):要么每种类型抄一遍,要么用不安全的通用类型。
参考答案(家长):需要程序员标注,通常在函数签名处。
参考答案(家长):接受更宽泛的参数才能替代原函数,反之不行。
参考答案(家长):里氏替换原则。
现代语言怎么解决?
什么是穷尽检查?
它和 switch 的区别?
为什么类型比注释可靠?
举一个例子。
各自的代价是什么?
这解决了什么?
这条规则防止了什么?
为什么这很重要?
这有什么问题?
参考答案(家长):编译器检查你是否处理了所有可能的情况。
参考答案(家长):用可选类型,把"可能为空"明确写进类型,逼你处理。
参考答案(家长):注释会过期,类型不会 —— 不匹配就编译不过。
参考答案(家长):能匹配结构而不只是值,还能自动检查是否遗漏分支。
参考答案(家长):容易出错、有运行时开销、学习曲线陡。
参考答案(家长):用"要么是错误要么是结果"的类型,就不会同时有值和错误。
参考答案(家长):数据竞争 —— 一边写一边读。
参考答案(家长):既没有垃圾回收开销,又不会忘记释放或重复释放。
参考答案(家长):容易忘记处理,出错路径不明显。
参考答案(家长):并发 bug 难复现难调试,能提前挡住价值极大。