首先,編程(programming)對于各人有不同意義。
對于一般程序員來說,編程是實現(xiàn)用戶需求的過程,產(chǎn)出的是代碼和可運行的軟件。
對Knuth來說,《The Art of Computer Programming》是談編程。一般人認(rèn)為那是談算法。
對開發(fā)編譯工具的人來說,編程就是編寫合符語法的字符串,通過編譯器生成能正確執(zhí)行的程序。
對各種計算機應(yīng)用領(lǐng)域研究(計算機圖形學(xué)、計算物理、機器學(xué)習(xí)、密碼學(xué)……)的人來說,編程就是實現(xiàn)各種實驗的工具。當(dāng)然有一些部分最終也可能成為應(yīng)用軟件。
編程是計算機科學(xué)的子集。而計算機科學(xué)涉及的數(shù)學(xué)很多,以計算機所有分支(計算機圖形學(xué)、計算物理、機器學(xué)習(xí)、密碼學(xué)……)涉及的數(shù)學(xué)來說明編程需要很多數(shù)學(xué),似乎并不洽當(dāng)。
我嘗試單純從一般編程的情況,列出當(dāng)中與數(shù)學(xué)的相關(guān)性。
許多編程的構(gòu)成部分,如整數(shù)、實數(shù)、變量、常量、運算符、函數(shù)、參數(shù)、布爾運算等,都是沿自數(shù)學(xué)上的概念/名字。但在編程中,我們要知道它們和原來的數(shù)學(xué)概念不一樣的地方。
例如,由于計算機只能表示有限的數(shù)字,所使用的整數(shù)只能是整數(shù)集的有限子集,并可使用同余算術(shù)。同理,計算機也不能表示實數(shù)集,通常是使用浮點數(shù)或定點數(shù)這些有限子集。編程中的純函數(shù)基本上與數(shù)學(xué)中的函數(shù)概念相同,可以用上單射、滿射、雙射、反函數(shù)學(xué)數(shù)學(xué)概念。
有一些編程的構(gòu)成部分使用了編程專門的術(shù)語,但實際上和數(shù)學(xué)的概念幾乎一樣。例如
一維數(shù)組(1D array) -> 矢量(vector)/多元組(tuple)
二維數(shù)組(2D array)-> 矩陣(matrix)
另外,大部分編程語言不直接支符號計算(symbolic calculation),而只是對表達(dá)式進(jìn)行求值(evaluation)。
在很多場合,編程需要使用到算法,而算法涉及很多數(shù)學(xué)。但除算法以外,在一般的編程中,我想到涉及數(shù)學(xué)的部分并不多。
編程時除了考慮正確性及性能,還要考慮很多軟件工程上的因素,如內(nèi)聚性、耦合性、可讀性、可擴展性、可測試性等。一般編程需要一些基本的數(shù)學(xué)知識,但說「編程就是數(shù)學(xué)」并不洽當(dāng)。
--
補充:幾年前讀《Elements of Programming (豆瓣)》時,就因數(shù)學(xué)基礎(chǔ)不好讀不太懂,然后就去學(xué)抽象代數(shù)。不過這本書談及的內(nèi)容是否對編程很有幫助,就是見仁見智了。