2014年3月10日星期一

探索那些不常见的控制流(3)

[关键字]
goto, goto with parameters, stack, stackless, continuation

[参考资料]

http://c2.com/cgi/wiki?ContinuationsAreGotos
http://c2.com/cgi/wiki?ContinuationsInCee
http://c2.com/cgi/wiki?SingleUseContinuation

[正文]

这是一个不常见控制流的系列,把参考资料优先放在头部也是不常见的。

最早我们接触编程语言里的的goto,然后我们被告知不要使用goto,使用goto会破坏结构化程序设计。我记得第一次学计算数学的《计算线性代数》、《数值分析》等计算数学入门课程时,我们书上很多算法都是用为代码形式给出,这类算法很多都是迭代型的,只有迭代收敛或超时超出迭代次数就退出。用编程语言的写法,如果没有提供循环这种特性,就只能用1、1、label+goto是实现迭代;2、递归做法。所以递归当然可以完成迭代的任务,这是另一回事。所以goto我们是很熟悉的。实际上if-else-then、while、for、call-function都可以用goto做到。只是由于直接使用goto会导致代码及其难读和不可维护,所以才出现结构程序设计。但即使如此,大部分语言都保留了goto的能力以备不时之需。

我觉得非计算机系的人学语言挺亏的,就像非数学系的人学高等数学很亏一样(当然后面可以弥补,但如果一开始就从正确的入口进去,何必走弯路?)。之所以这么说,是因为数学分析会先把极限的概念、episode-xigema收敛证明法讲解的非常透彻,然后基于这个坚实的概念再往上学微积分,这样学微积分,如果你想剖丁解牛,你就有机会分解下层抽象去做推理,这也解释了另一个软件术语的含义「抽象泄漏法则」,你不得不透过抽象背后的逻辑去理解事物的本质。编程也是这样的,C语言的函数调用直接从汇编的层面看,函数调用栈是一个非常重要的概念,这样能理解函数调用的栈顶保存,参数传递顺序,函数返回前的清空函数栈、恢复上层函数栈顶等动作。从而对函数调用开销有直观的理解,并且也容易去区分和理解栈上变量、堆上变量之间生命周期的区别,并且对寄存器有直观的理解。

<未完待续,这节不好写,慢慢来>








没有评论:

发表评论