专栏名称: 无垠王垠
分享
今天看啥  ›  专栏  ›  无垠王垠

跟很多人交流,才发现国内的计算机教育,还停留在古老的认识水平。很-20200213112558

无垠王垠  · Wei  · 程序员  · 2020-02-13 11:25

2020-02-13 11:25

跟很多人交流,才发现国内的计算机教育,还停留在古老的认识水平。很多人仍然认为学编程从 Python 之类的开始“太容易”,要从 C 这样的语言入门才够“专业”。

有一天,某位编译器工程师问我这样的问题:“我们组在考虑一个问题,这个编译器项目该用 Bison 还是 Python……” 我:“这是哪跟哪啊?Bison 和 Python 根本就不是一类东西啊。”

又有一天,另一个编译器工程师跟我聊天:“我才发现,原来用递归来写编译器里的 pass 如此容易!”

我:难道你们不是用递归来写编译器的 pass?我一直都是用的递归啊。

他:是啊,我们一直都是把递归展开成循环的方式,因为觉得递归会很慢。现在大部分国内计算机人员仍然以为递归比循环慢。

我:递归很慢,这是什么年代的思想了?[允悲] 如果语言对递归的实现正确,递归不应该比你展开成的循环花更多时间。我不推荐使用“尾递归”来表示简单的循环,但要是把遍历 AST 树用的递归展开成循环,那就太麻烦了。

他:可是递归会导致堆栈增长,溢出之类的问题啊?

我:你把递归转成循环,难道堆栈就不存在了吗?你只不过把原来放在堆栈里的信息,放到了 heap 上自己管理。实质上你还是有一个堆栈在增长,只不过在 heap 里而不是 stack。heap 和 stack 并没有本质区别,都是内存。像 Scheme 这样的语言,函数调用的堆栈根本不是放在系统 stack 段上的,而是在 heap 里面,就没有这个问题了。有些语言对堆栈深度有参数限制,所以才会溢出,你只需要把堆栈深度参数调大就行了。

他:原来如此。说递归慢,要展开成循环,似乎都是从谭浩强的 C 语言书里学来的陈旧思维。

我:递归展开成循环,不但没有带来任何好处,而且让代码变得非常复杂,难以理解和维护,这也许就是为什么很多人觉得编译器很难写?

他:是的。我们的编译器里都是这样的代码,很多年了都是这样写的,很头痛。

今天看啥 -
本文地址:http://www.jintiankansha.me/t/I8unLZdPIb