数学之美,程序之巧

计算机程序,简单来说,就是指令和数据的组合。程序可以通过算法组成相应的逻辑系统,逻辑系统可以根据编写者需求来完成各种各样的事情。

计算机内部数据处理方式是什么样?

这个问题可以从机器语言开始说起,如果要说到机器语言自然就要聊一聊编程语言喽:

编程语言(英语:programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。1

机器语言是编程语言最初的一个代表,机器语言的表示方式通常是101010的二进制方式,这也是计算机运行最底层的内容和最底层的模块,在101010的运算模式是非常适合计算机进行计算的。编程就是数据和指令的集合,而计算机就是将101010的二进制数字进行运算,计算机的运算方式通常由逻辑运算和算术运算。但是这和数学有什么关系吗?计算机的运算是数学理论产生的产物,集成电路上闪动的光波,跳动的粒子都是多少数学家理论的产物呀!

话说回来,机器语言现在几乎都不使用,都在使用高级编程语言。根据现在的情况,编程语言有大致三代。第一代编程语言是机器语言,编写非常复杂。第二代编程语言是汇编语言,编写相对机器语言简单了许多,但是仍然是比较复杂的语言。第三代编程语言是现在非常经常使用的高级编程语言,C语言,C++语言,Java语言等静态语言以及Python,PHP,Ruby,JavaScript等动态语言。发展到第三代编程语言,编程的难度大大降低。

但是,编程和数学有什么关系呢?

个人认为,编程本身是美的,数学亦是美的。编程的美是基于数学的逻辑,数学的理论和数学中的各种各样的奇妙变换。编程如果接触到了比较底层的内容,也就到了最核心的部分——数据结构和算法,而数据结构和算法很多的知识都是基于数学的思考。这里用算法里面的时间复杂度和数学中的微积分做一下对比:

$$ O(n \cdot \ln\ n) $$

$$ f(x) = n \cdot \ln \ n $$

这两个公式是非常相像的,而时间复杂度的比较其实也是基于微积分中极限的概念进行比较的。

如果要比较 $O(\ln \ n)$ 和 $O(n)$的时间复杂度,该怎么比较呢?

这里可以使用微积分中的无穷小比较来进行比较的,同样是采用微积分中的极限的思想来进行比较的:

$$ \lim_{x \to +\infty} \frac{\ln \: n}{n} = 0 $$

这个式子在微积分中是非常常见的概念,通过数学的证明来证明这个结论。根据这个结论就可以非常容易的判断出时间复杂度之间的大小。这是数学在编程算法中的一个应用。通过这个应用可以说明计算机编程和数学之间的微妙关系。

进行数学问题研究的人员往往是高深的数学家,而进行计算机编程的人员往往是秃头的程序员,程序员很少研究数学问题,但是程序员也了解一部分数学知识。而数学家和程序员之间又有什么关系呢?

程序员是敲代码,负责对功能的实现,是应用方面的。而数学家是解决数学问题的,使用数学优美的证明和严谨的逻辑来证明数学问题,是理论方面的。看起来是没有什么必然的联系,其实进行连接的中介就是计算机科学家,他们负责对计算机理论的研究和算法的创新求解,他们会整合数学家的最新的研究成功并尝试融入到计算机理论中去。程序员可以从计算机理论中的很多相关内容中,进行代码和设计方面的功能实现,优化服务。

现在的大时代趋势是万物互联,每个学科都不在是孤立存在的学科,学科之间彼此有着多重的交叉。随着时代的进步,学科交叉应该会越来越明显,而计算机和数学关系是非常密切的,应该会最先进行交叉研究,其实现在已经进行交叉研究了。

我个人认为程序员应该是有一种对于数学的热爱,看到数学优美的证明会心生惊叹,面对数学问题会竭尽全力去攻克数学问题。其实这其实也是程序员对于程序和代码的一种态度,一种专业素养。程序员往往都会追求完美,希望程序可以不断优化不断进行完善,更少的BUG,更高的性能。这无非不是对于数学赞扬和感叹。

数学之美,程序之巧,尽展心中,会现颅内。

参考

  1. 编程语言-维基百科

闲聊到此为止,来喝杯茶可好?

Q.E.D.