.. Kenneth Lee 版权所有 2017-2020 :Authors: Kenneth Lee :Version: 1.0 从学习assert的用法开始理解如何写“专业的程序” ********************************************* 和不理解什么是基于语义进行编程的人是说不清楚assert应该怎么用的,所以,在这这一 篇前,我先写了这一篇:基于“语义”编程。 assert()的语义是什么呢?它是“断言”。“我断定它是这样的”,就用断言。“Kenneth是个 好人”,这是断言,“a必然等于4”,这也是断言。 断言在解决问题上是无用的东西,因为它不进入决策链,比如“巧克力很好吃”,这是断言 ,不产生决策,“但我现在吃饭”,这才是决策,对程序来说,大部分时候我们关心这个, 而不是巧克力好不好吃。 但断言在交流上是有用的东西,它可以让我们很快知道双方是否有分歧,从而判断是否进 入细致逻辑。比如这个论文: https://pdos.csail.mit.edu/6.828/2017/readings/linux-lock.pdf,它断言成功获取锁 等待时间是c*k/2,如果我的硬件构架和这个断言不一致,这个论文的整个结论就对我不可 靠,我就可以不看下去。 从这里就可以看出,断言的主要作用是“声称什么东西在作者的考虑范围内,什么东西不在 作者的考虑范围内”。这就是为什么我要用断言来说明怎么写“专业的程序”,“专业的程序” 要求“算无遗着”,但严格来说,“算无遗着”是不可能的,太阳黑子变化,可以导致你某个 变量的一个bit发生跳变,你每次访问这个变量的时候都去校验一下吗? 所以,断言的作用在于在一个“代码结构”之内“算无遗着”,比如我有如下代码结构::: int a[SZ_T]; for(i=0; i