首先,编程(programming)对于各人有不同意义。
对于一般程序员来说,编程是实现用户需求的过程,产出的是代码和可运行的软件。
对Knuth来说,《The Art of Computer Programming》是谈编程。一般人认为那是谈算法。
对开发编译工具的人来说,编程就是编写合符语法的字符串,通过编译器生成能正确执行的程序。
对各种计算机应用领域研究(计算机图形学、计算物理、机器学习、密码学……)的人来说,编程就是实现各种实验的工具。当然有一些部分最终也可能成为应用软件。
编程是计算机科学的子集。而计算机科学涉及的数学很多,以计算机所有分支(计算机图形学、计算物理、机器学习、密码学……)涉及的数学来说明编程需要很多数学,似乎并不洽当。
我尝试单纯从一般编程的情况,列出当中与数学的相关性。
许多编程的构成部分,如整数、实数、变量、常量、运算符、函数、参数、布尔运算等,都是沿自数学上的概念/名字。但在编程中,我们要知道它们和原来的数学概念不一样的地方。
例如,由于计算机只能表示有限的数字,所使用的整数只能是整数集的有限子集,并可使用同余算术。同理,计算机也不能表示实数集,通常是使用浮点数或定点数这些有限子集。编程中的纯函数基本上与数学中的函数概念相同,可以用上单射、满射、双射、反函数学数学概念。
有一些编程的构成部分使用了编程专门的术语,但实际上和数学的概念几乎一样。例如
一维数组(1D array) -> 矢量(vector)/多元组(tuple)
二维数组(2D array)-> 矩阵(matrix)
另外,大部分编程语言不直接支符号计算(symbolic calculation),而只是对表达式进行求值(evaluation)。
在很多场合,编程需要使用到算法,而算法涉及很多数学。但除算法以外,在一般的编程中,我想到涉及数学的部分并不多。
编程时除了考虑正确性及性能,还要考虑很多软件工程上的因素,如内聚性、耦合性、可读性、可扩展性、可测试性等。一般编程需要一些基本的数学知识,但说「编程就是数学」并不洽当。
--
补充:几年前读《Elements of Programming (豆瓣)》时,就因数学基础不好读不太懂,然后就去学抽象代数。不过这本书谈及的内容是否对编程很有帮助,就是见仁见智了。