动手写一个能切分简单算式的分词器。
计算机基础 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
这棵树叫什么?
把 2 加 3 乘 4 画成树。
加了括号的算式,树会怎么变?
为什么这种写法直观?
再举一个语法对但语义错的例子。
作用域嵌套时符号表怎么组织?
为什么要加这一层?
x = 2 + 3 编译后会变成什么?
为什么这条很难保证?
参考答案(家长):语法树(抽象语法树)。
参考答案(家长):一个循环加几个判断就够。
参考答案(家长):括号里的整体下沉到更底层。
参考答案(家长):乘号在下层、加号在上层。
参考答案(家长):如使用了没定义的变量、函数参数个数不对。
参考答案(家长):每条语法规则对应一个函数,读代码就像读语法。
参考答案(家长):支持 m 种语言和 n 种机器时,只要写 m+n 个部分而不是 m 乘 n 个。
参考答案(家长):一层一层叠起来,查找时从内往外找。
参考答案(家长):涉及溢出、浮点、并发时,"等价"的判断很微妙。
参考答案(家长):直接变成 x = 5。
寄存器不够用怎么办?
先完成分词部分。
完成解析部分。
完成求值并测试。
加上变量支持。
给它加一个内置函数试试。
你刚做的是哪一种?
这样做的好处是什么?
为什么只编译热点?
怎么判断一块内存"不再被用"?
参考答案(家长):切出数字、运算符、括号三类单元。
参考答案(家长):暂时存回内存,需要时再取,这叫溢出到内存。
参考答案(家长):递归几行就能写完,因为树的结构已经记录了顺序。
参考答案(家长):表达式管加减、项管乘除、因子管数字和括号。
参考答案(家长):在求值时识别函数名并调用对应实现。
参考答案(家长):赋值时写符号表,引用时查符号表。
参考答案(家长):一次编译到处运行,且比纯解释快。
参考答案(家长):解释器,边解析边求值。
参考答案(家长):从根出发沿引用能到达的都活着,到不了的就是垃圾。
参考答案(家长):编译本身要花时间,只编译值得的部分才划算。
想一个你可能会写"小语言"的场景。
画出编译流程图。
说说这两门课里你最意外的一个知识点。
人多了会多出哪些问题?
为什么维护最贵?
用户说"要个搜索功能",你该问什么?
把"界面要好看"改成可验证的表述。
它的最大风险是什么?
为什么"小而完整"比"大而半成"好?
做一个记账 App,最小版本包含什么?
参考答案(家长):从源码到目标码,标出每一步的输入输出。
参考答案(家长):如配置文件格式、公式计算器、查询过滤条件。
参考答案(家长):沟通成本、代码冲突、风格不一、责任不清。
参考答案(家长):常见的是"数据库索引就是 B+ 树"和"编译器也用递归"。
参考答案(家长):搜什么、按什么搜、结果怎么排、数据量多大。
参考答案(家长):时间最长,且要在别人写的代码上改。
参考答案(家长):走到最后才发现需求理解错了,返工代价极大。
参考答案(家长):如"主要操作三步内完成""关键按钮在首屏可见"。
参考答案(家长):记一笔、看列表、算总额,三样足矣。
参考答案(家长):能真实验证,半成品什么都验证不了。