程序优化的几个层次

计算机是人类发明的最强大的工具,而程序是人和计算机交流的工具,从我们遇到的一个问题到最终cpu中进行的电位运算,整个个过程大致可以分为四个步骤:建模、编码、翻译、执行。这几个过程完成的质量关系到我们的问题是否能够解决,以及解决的速度是否足够快。所以要想编写正确高效的程序,需要对这几个部分分别把控。实际上,现在我们已经有很多学科是在研究这些过程,目的就是能更好的完成它们。下面我们就来看看这些过程都涉及了哪些学科和技术。

先来说一下建模,建模是解决问题的第一步。模型既要能够正确反映问题的实质,又要尽量简练。不能刻画问题实质的模型是没有意义的,对于一个排序的问题,肯定要用到排序的算法和数据结构,也就是一个容器(一般是一个数组)和对容器的各种操作(一般是交换位置)。用一个变量,和加减法操作是肯定不能完成排序问题的。这一部分就是我们数据结构和算法课程里学到的东西。我们的算法是否高效,数据结构是否恰当,是我们建模成功与否的标志。很多问题不能正确求解,就是我们还没有找到合适的模型来刻画这个问题,比如说计算宇宙到底有多大,以现在的科学技术水平,我们还没有一个确定的方法来完成这个任务。但可以想象有一天,科学家可能会发现星球数量和发的光的强度等信息与宇宙大小之间的某种关系,那我们就可以用这个关系建立一个模型,然后求出宇宙有多大了。还有一些问题是可以正确建模,但模型不太适合求解的情况。比如常说的NP难问题,这些问题都可以用穷举法来完成,但由于计算量非常大,所以现在还不能正确求解。假如有一天有人为这些问题建立了新的模型,可以大大降低他们的时间复杂度,那这些问题也就可以求解了。这部分优化的过程就是为问题找时间复杂度更低的算法以及选择最合适的数据结构的问题。

其次是编码,当我们的算法和数据结构选定后,剩下的就是编写代码了,这里主要有两个问题,一是选择的语言,二是编码的质量。用C语言编写的代码,与用Java编写的代码效率肯定是不同的,这也就是为什么会有C语言比Java快的说法。而编码质量也是一个重要的问题,没经验的新手可能会申请过多的变量,做一些冗余的操作等等,比如排序过程中对边界的控制不严谨。在语言的选择上,开发速度和运行速度大多数情况是不可兼得的,这也就是为什么现在会有这么多编程语言的原因,每种语言的优势不同,可以解决不同类型的问题,所以一味地争论那种语言好是没有意义的。必须根据实际情况来决定。

再然后是翻译,也就是编译器的工作了,这一部分能否发挥作用一是看编译器算法是否够好,二是要看源代码的可优化程度。要想翻译效果好,一是要研究编译器的算法,即编译原理中学到的东西,二是要书写编译器容易优化的代码,这就要求一般的程序员对编译器的运行机制也有所了解。这一部分涉及的知识主要就是编译原理与编码的良好习惯。

最后是执行,这一部分也是涉及两个方面,一是芯片微语言的规则,二是具体的硬件的物理特性。什么样的二进制码有更好的运行速度,比如RICS与CICS之争,这是CPU设计者必须考虑的问题。这一部分研究的人相对较少,要求也相对较高,目前只有几家注明的芯片厂家再做相关研究。最后一部分是更基础的物理硬件选择,比如现在正在研究的光子计算机与量子计算机,因为电气元件的物理特性,其速度必然受到限制,而其他物理载体可能会以指数的速度加快程序运行效率。当然,这一部分还处在研究阶段,是科学家是事情了。

最后的最后,在物理层的下面,那就是哲学的范畴了,如果世界是非物质的,那也许会有某种超出现代人认知的力量,能够省去一切的步骤,直接得出答案。这一部分的研究,,,额,从古至今一直没有停歇,但目前还没有成果公开发表,本着一切皆有可能的科研态度,我们还是祝福这些为人类开路的人吧。

你可能感兴趣的:(杂项)