什么是堆和栈

如果你一直都是是用动态语言,比如 Python、Javascript 这种,你很可能并不会注意到栈和堆的区别。因为这些语言有垃圾收集器(Garbage collector,GC)存在,会自动帮你做好内存管理,你只要集中注意力编程即可。坏消息是 GC 并不是没有成本的事情,实际上设计再好的 GC 算法,也会降低代码的性能。如果你接触编程的时间足够久,那么想必你可能会听到过什么“递归层数太深栈爆炸了”这种话,此时你可能会点开搜索引擎稍微了解一下栈和堆的区别,有可能你就刚好点进了这一篇文章 :)

Vim Macro 101

在我学习 Vim 的过程中,最具有启发意义的一句话是:

Vim 其实是一门“编程语言”

很早之前我就接触过 Vim,但是当时 Vim 的按键组合对我来说很难记,再加上 Vim 的界面实在太过于复古,于是我就转向了比较现代的文本编辑器。但当我学完 Missing semester 这门课程的时候,我对 Vim 的看法有了改观:它远远不止是一个文本编辑器,各种 Vim 的命令的排列组合更像是在写代码,背后都是有逻辑的!

How to use the semantic actions to generate the symbol tables in ANTLR4

当 Parser 处理输入的代码的时候不仅要判断是否语法和句法都正确,还可以执行一些有用的操作,这些操作就叫做 Semantic actions。其实也就是一段代码,一般嵌入在在语法文件的规则里面。那么当 parser 应用这个规则的时候就会执行你设置的这段代码。换个角度理解,semantic actions 其实就是“触发器”,触发条件就是 parser 应用了对应的规则。

摩尔投票法


今天又做到了 Leetcode 169. 多数元素 这一道题. 我依稀记得最优的解法叫做什么摩尔投票法. 但是我对它的印象竟然只有这个名字本身了 Orz. 对于这个算法本身倒是忘得一干二净. 于是我打算系统性地学习一下这个算法的原理, 并将它总结出来写成这篇博客. 不知道在哪里看到的一句话 :