编程是数学的一个子集吗?

66
我听说过很多次编程实际上是数学的一个子集。有些人建议面向对象编程在其根源上是基于数学的,但除了一些明显的例子外,我不理解这种联系:

  • 使用归纳法证明递归算法,
  • 形式化正确性证明,
  • 函数式语言,
  • λ演算,
  • 渐近复杂度,
  • 确定有限状态自动机、非确定有限状态自动机、图灵机和理论计算等,
  • 以及盒子里的所有内容都是二进制的事实。

我知道数学对编程非常重要,但我对这种“子集”观点感到困惑。编程在哪些方面是数学的一个子集?

如果有足够强的联系,我希望得到一个与企业/OO开发相关的解释。


39
编程也是艺术。 - ryw
3
每个计算机程序都可以在图灵机上编写,这是一种纯数学工具。它证明了编程是数学的一个子集。 - rafek
6
数学也是一种艺术。 - Andreas Rejbrand
1
我听过很多人说编程是数学的一个子集。但我从来没有听过任何了解编程、数学或两者都了解的人这么说过。 - Jon Hanna
微积分学(如牛顿微积分学)可以被视为“低层数学”(极限和牛顿导数的定义)到“高层数学”(牛顿微积分学)的抽象,这种抽象类似于面向对象范式中的抽象。 - user1300214
显示剩余2条评论
29个回答

4

我们所做的一切都建立在数学基础之上。

幸运的是,我们不需要精通数学本身才能做到这一点。就像你不需要理解物理学就可以开车甚至驾驶飞机一样。


事实上,在不了解基本物理学的情况下驾驶飞机是很困难的。所有问题都关乎能量、动量、力矢量、速度矢量,以及与速度平方成正比的因素等等。 - Mike Dunlavey
4
不,我曾经开过飞机(简单地)。这很容易,而且我对其背后的物理知之甚少。你只需要保持机翼水平就可以了。 - CodeRedick
是的,我也做过那个,而且在正常情况下并不那么复杂。当然,如果飞机驾驶员至少了解物理基础知识,我会更加放心 ;) - nico

3
“编程”和“纯数学”的区别在于“状态”的概念。可以参考http://en.wikipedia.org/wiki/Dynamic_logic_(modal_logic),这是一种通过时间来分析事物变化的数学方法。此外,“Hoare三元组”是一种形式化程序输入输出行为的方法。通过处理涉及程序顺序组合和赋值方式的公理,可以以严谨的数学方式处理随时间而变化的状态。如果您所掌握的数学知识不足以应对问题,请“发明”一些新的数学方法来解决。牛顿和莱布尼兹为分析(也就是微积分)做到了这一点,因此在计算和编程领域也没有理由不能这样做。

2
编程可能最初是数学的准子集,但随着时间的推移,领域的日益复杂化使编程成为创建信息处理和计算的良好抽象的艺术和科学。
编程确实涉及数学、工程和对良好设计和实现的审美感。算法是数学的延伸,系统工程方面与其他工程学科有一定的重叠。然而,数学和其他工程领域都没有同样需要复杂、灵活且易于理解的抽象,这些抽象可以在许多不同的层次上用于解决新的和不断发展的问题。
正是对有用、灵活和动态抽象的需求,首先导致了函数库、类/组件库的创建,近年来还出现了设计模式和面向服务的架构。虽然后者更具有设计重点,但它们是对建立高级抽象桥梁的反应,以连接编程问题和解决方案。
由于所有这些原因,编程既不是数学的子集也不是超集。它只是另一个使用数学的领域,其根源比其他领域更深。

2
您列出的主题是理论计算机科学中的主题,而它是纯数学的一个分支。编程是一门应用科学,它使用理论计算机科学。编程本身不是数学的一个分支,但编程语言基于的Lambda Calculus/计算理论/形式逻辑/集合论等是数学理论。
此外,我完全不同意Dijkstra的观点。这要么是自负,要么是Dijkstra被误引用/断章取义。纯数学是非常非常难的领域。它是如此抽象,以至于没有任何应用数学的分支可以与之相比较。这是一个需要巨大想象力的领域。我在计算机科学方面获得了第一个学位,专注于理论CS和编程、操作系统、编译器等应用领域。我还获得了电气工程学位——可能是最困难的工程分支之一——并在应用数学的困难领域(如马克思韦尔方程、控制理论和偏微分方程等)工作。
我还进行过应用和纯数学的研究,直到今天我仍然认为应用数学更容易。至于纯数学家,他们是完全不同的品种。
现在有一种趋势,即有人学习一两年的微积分而没有应用,就得出纯数学很容易的结论。他们不知道自己在说什么。独立于应用地学习微积分甚至是拓扑并不能让你对纯数学家所做的事情有任何了解。实际证明这些定理的任务是如此深奥难懂,以至于我会请一位计算机科学家指出区别: “如果P = NP,则世界将与我们通常认为的完全不同。在‘创造性飞跃’中没有特殊价值,在解决问题和识别解决方案之间没有根本性差异。每个欣赏交响乐的人都会成为莫扎特;每个能够遵循逐步论证的人都会是高斯……”—Scott Aaronson(麻省理工学院理论计算机科学家)

2
我不认为编程是数学的子集。即使您提供的链接只是一种提议的编程方法(并未声称它是数学的子集),维基页面中也有很多争议。
编程需要(至少一些)应用数学。数学可以用来帮助描述和分析程序和程序片段。编程与数学有非常密切的关系,并且大量使用数学和其中的概念。但是子集?不是。
我很想看到有人确实声称它是一个数学对象,并给出一些清晰的理由。我不认为我曾经这样做过。
“仅仅因为您可以使用数学来推理某些事情,并不意味着它本质上是一个数学对象。数学用于推理内燃机、放射性衰变和杂耍模式。使用数学并不等同于进行数学。”

2

我认为...

IT技术在某种程度上涉及到数学,特别是在理论层面。想象一下设计高效的搜索/排序/聚类/分配/优化算法,这都是数学...从数论到统计学,应有尽有。

另外,IT技术也涉及到工程学。复杂系统很难达到理想的性能和可靠性水平,软件也不例外。很多软件开发工作都是为了在不可靠的硬件和人员面前实现稳健性。

最后,IT技术也是一门艺术。创造性和个性化的软件设计经常会带来伟大的新思路...比如汇编语言、多任务操作系统、图形用户界面、动态语言和网络。

以上仅供参考...


2

数学 + 艺术 + 逻辑


我学了代数...感觉一点都不合逻辑 - 哈哈 - hugoware

2
你可以说,数学中的逻辑证明形式与编程类似。可以查看Curry-Howard correspondence来了解更多信息。这可能更符合数学家的思考方式,但我认为这恰如其分。

2

我认为数学为程序员提供了一组工具,他们在抽象层次上使用这些工具来解决现实世界的问题。


1

数学是最纯粹的真理形式。一切都源于数学。

阿门。


当然,但这并不总是有用的。 - Matt Joiner
这是一门高深的科学,谁会考虑有用性呢? - zubinmehta
很难说这是一门科学,更像是一门艺术。 - JeremyKun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接