问题

为什么在计算机科学领域及编程中不使用现代数学建立的符号体系进行操作?

回答
你这个问题非常有意思,触及到了计算机科学和编程语言设计中的一个核心矛盾:理论的优雅与实践的现实之间的权衡。简单来说,我们之所以在日常编程中很少直接使用现代数学建立的符号体系,并不是因为它们不好,而是因为它们在很多情况下,并没有直接解决我们编程时最迫切的需求,甚至会带来不必要的复杂性。

让我来详细拆解一下其中的原因:

1. 目标与关注点的不同:理论的“是什么”与编程的“怎么做”

数学符号体系(如集合论、逻辑学、抽象代数等): 这些体系旨在描述和证明“什么”,它们追求的是形式上的严谨性、普遍性、简洁性和抽象性。比如,一个数学定理可能用寥寥数语和符号就能概括一个深刻的数学真理。它们关注的是概念的本质、结构以及它们之间的关系。
计算机科学与编程: 我们的目标是“怎么做”,是如何构建一个能够执行的系统,解决实际问题。我们更关注的是算法的效率、数据的存储与处理方式、程序的行为、硬件的交互、可读性、可维护性以及易用性。

举个例子:集合论中的集合关系(并集、交集、差集)在数学上非常优美,但直接用集合论的符号来描述一个数据库查询就显得过于抽象和冗长。我们更倾向于使用SQL语句中的`UNION`、`INTERSECT`、`EXCEPT`,或者Python中的`|`、`&`、``运算符来表达这些操作,因为它们更贴近我们操作数据的直觉和代码的执行流程。

2. 计算模型与执行环境的限制

数学的抽象世界: 数学可以处理无限集合、连续变量、完美逻辑。很多数学概念本身就是抽象的,不受物理限制。
计算机的实际世界: 计算机是有限的、离散的、有实际性能限制的机器。它们拥有固定大小的内存、有限的处理器速度、以及可能出错的硬件。

现代数学的一些符号体系,比如微积分中的无穷小、无穷大,在编程中很难直接实现。我们通常需要用离散的近似方法(如数值积分)来模拟。即使是像“无限循环”这样的概念,在数学上可能是一个定义,但在编程中我们通常会避免,或者将其转化为带有终止条件的迭代。

再比如,数学中的函数可以有任意的实数输入,但计算机中的函数输入必须是某种特定的数据类型(整数、浮点数、字符串等),并且有范围限制(如整数的最大值)。

3. 历史演进与实践的反馈

计算机科学作为一个年轻的学科,它的发展很大程度上是沿着解决实际问题的路径前进的。早期计算机的限制(内存小、速度慢、编程困难)迫使人们设计出更易于操作、更高效的编程语言和抽象。

低级语言(汇编): 非常接近硬件,直接操作内存地址、寄存器,但符号化程度很低,难以理解和维护。
高级语言(Fortran, COBOL, C, Java, Python等): 随着发展,编程语言逐渐引入了更高级的抽象,如变量、函数、类、对象、模块等,这些抽象是为了让程序员更容易地表达思想,管理复杂性,而不是直接复制数学的符号体系。

我们使用的变量名 `x`, `y`, `count`, `total` 等,虽然不如数学中的 `α`, `β`, `Σ` 那么“数学化”,但它们更具有描述性,更容易理解变量的含义和用途。数学符号的简洁性有时会牺牲可读性,尤其是在代码量庞大的项目中。

4. 语境(Context)的差异与歧义的规避

数学符号体系往往高度依赖于特定的数学领域和上下文。同一个符号在不同的数学分支可能有截然不同的含义。

编程语言需要明确性: 编程语言设计的首要任务之一就是消除歧义。我们不希望编译器或解释器猜测我们的意图。因此,编程语言倾向于使用具有单一、明确含义的关键字和操作符。
例如,数学中的 `+` 可以表示加法,也可以表示向量加法、矩阵加法等等。在编程中,`+` 通常就被严格定义为对应数据类型的加法操作(整数相加、浮点数相加、字符串连接)。如果我们需要更复杂的运算,我们会使用专门的函数或库。

5. 可读性、可维护性与协作

大规模软件开发: 现代软件项目通常由多人协作完成,代码需要被成千上万的人阅读、理解和修改。
数学符号的门槛: 强行在编程中使用晦涩的数学符号体系会大大增加代码的学习成本和理解难度,对非数学专业背景的程序员尤其不友好。这不利于团队协作和项目的长期维护。

想象一下,如果一个团队的代码都像一篇复杂的数学论文,充斥着各种高级希腊字母和抽象的数学算子,即使是数学系毕业的程序员也需要花费大量时间去解读。而使用清晰的英文关键字和有意义的变量名,则能大大降低沟通成本。

6. 现有符号体系的局限性与领域特定语言(DSL)的兴起

尽管如此,现代数学的符号体系并非完全没有影响。

某些领域: 在图形学(矩阵变换)、科学计算(线性代数、微积分)、机器学习(张量运算)、形式验证等领域,数学符号及其背后的思想确实被广泛借鉴和应用,甚至诞生了专门的领域特定语言(DSL)或库(如NumPy, TensorFlow, PyTorch, MATLAB)。这些领域与纯粹的通用编程有所不同,它们需要直接处理数学概念。
逻辑学与类型系统: 在计算机科学的理论基石,如类型系统、形式化方法、可计算性理论中,逻辑学和集合论的符号体系扮演着至关重要的角色。它们帮助我们定义语言的结构和程序的正确性。但这些通常是在研究和编译器设计层面,而不是直接暴露给最终用户程序员。

总结一下,为什么不直接用现代数学符号体系进行操作:

关注点不同: 数学追求“是什么”,编程追求“怎么做”。
计算模型差异: 数学可以无限抽象,计算机受硬件限制。
历史与实践驱动: 编程语言是为了降低复杂性,提高效率和易用性而演进的。
需要清晰明确: 编程需要消除歧义,避免上下文依赖。
可读性与协作: 易于理解和维护的代码更有利于团队协作。

我们使用的是一种面向执行、面向抽象、面向沟通的“编程语言符号体系”,它吸收了数学的某些思想和简洁性,但更侧重于工程化、实用化和人机交互的便捷性。这是一种务实的取舍,是在理论的优雅与软件工程的现实之间找到的平衡点。

网友意见

user avatar

其实是有的,比如 Lean:

我们可以试着在 Lean 里面用类似题图里的符号表达集合的相关概念

       constant e: ℕ                -- 引入一个自然数 `e` constants S S': set ℕ        -- 引入两个由一些自然数组成的集合 `S`, `S'`  #check e ∈ S                 -- `e` 属于 `S` #check {a | odd a ∧ a ∈ S}   -- `S` 中的所有奇数 #check S = S'                -- `S` 等于 `S'` #check S ⊆ S                 -- `S` 包含于本身 #check S ∩ S'                -- 交集 #check S ∪ S'                -- 并集 #check S  S'                -- 差集     

Lean 没有内置笛卡尔积的符号,但是要定义一个也是很简单的

       notation S₁ ` ⨯ ` S₂:75 := {a: _ × _ | a.fst ∈ S₁ ∧ a.snd ∈ S₂}  #check S ⨯ S'   -- 笛卡尔积     

你可能会好奇在代码里面引入这么多花里胡哨的符号到底要怎么打出来,那当然是得有 IDE 支持了

当然说到底虽然可以用 Lean 来进行各种应用场景的编程,但它还是主要用来做交互式定理证明的,或许你会觉得这只能归在数学领域内,那就见仁见智了

user avatar

这个问题看起来简单,实际上涉及到上个世纪数学哲学的基本纷争:

为什么以布尔巴基原语出发的现代数学符号语言没有统一,同化以类型论原语出发的编程语言?

而答案也很简单:因为类型论原语确实持有关于“逻辑”本身的一系列真理,久经各种工业场景磨练,布尔巴基原语这种“不修”逻辑基础的何德何能将类型论原语吃掉?

所以,返回原题。为什么在计算机科学领域及编程中不使用现代数学建立的符号体系进行操作?原因其实和以前豪门争产九子夺嫡一样,纯属历史偶然。

如果当初胜利的是直觉主义者,你现在问的就是“为什么存在少数数学领域不使用编程语言写数学证明?”

如果在二次世界大战之前就出现成熟的类型论体系,你甚至还有可能会问出“现代标准汉语如此像编程语言,那为什么英语法语等西方主要语言不用编程语言重塑自己的母语”之类的问题。


Q1:现代数学符号用的人多,这就是人心向背!

A1:当我们讨论学科哲学的人心向背的时候,显然并不是在讨论一种文革带字报式的比谁声音大的人心向背。而布尔巴基学派音量最大的地方就在于,他能让大多数一般通过人产生一种“编程语言不是现代数学符号系统的成员”的错觉。LaTeX式的符号系统的出现是一个很晚期的事情,要搞辈分帽子批发大家同样跑不掉。

同样的,“人心向背”也不应该是苏联式的那种调动所有政治能量学术能量资本能量的你死我活式的皇城pk式的人心向背。要不然直接给全世界的数学从业者和计算机科学从业者每人发一把西瓜刀约在巴黎对砍得了,其中不少人还得先自己砍自己。

Q2:编程语言比数学符号难入门!

A2:你既然相信8岁能够搞少儿编程,那么你完全可以相信初中生可以通过编程学会整个初等数学。

你完全可以设想一个真正的“编程从娃娃抓起”的神国。小学开始学编程,初中完成初等数学的学习。中考高考用上电子自动阅卷。觉得本科的实分析复分析教材太过猪鼻可以直接git clone个新的教材。什么你说你学不会?中考还有个50%的腰斩筛呢。

Q3:用编程语言写数学证明太长了!

A3:一个巨大代码量的项目变得不可读,其失败是代码管理工程的失败,而不是因为它代码写的长而失败。

而且偷偷告诉你一件事,其实二十世纪的大中小学阀都不用自己亲自写论文,是可以叫徒子徒孙合同工钟点工做人力语音输入的。你以为还是中世纪教授还得担心今年的羊皮够不够造纸?

Q4:编程语言太多括号了!

A4:你有没有想过其实写证明就是需要很多括号,而你只是为了自己的“可写性”方便而省略了他们?通过定义别名,自动宏,命令式编程你一样可以省下大量括号。

而且这种为了“可写性”的“优化”是有代价的。如果你的证明确实是对的,那么可能确实省下了那么一点篇幅,提高了那么一点相关领域的可读性。如果你的证明其实是错的,有gap的,甚至就比如望月新一的ABC猜想证明。那么你甚至开几次研讨会都没有什么作用。

但基于类型论原语的编程语言就没这种屁事。是一个内定理就是,不是就不是,编译器一定可以递归的判定证明的类型。

user avatar

第一感觉,数学领域那些符号是设计用来徒手演算的,那些符号用计算机输入并不方便。

不过,如果要深究这件事情,你会发现:常规的数学领域跟计算机使用的计算,完全不是一回事。

请思考一下,为什么常用的计算器,科学计算与程序员计算是两个不同的栏目?


编程领域定义的一个 int,它与数学领域的整数概念一致吗?

我提示一点:数学领域的整数,取值范围与数量都是无限的,编程领域的整数,其取值范围与数量都是有限的。

所以程序员的计算器里 2000000000+2000000000=-294967296,而科学计算器可不是这种结果。

所以对程序员来说 x>y 跟 x-y>0 不等价,但对数学家来说 x>y 跟 x-y>0 大概率等价。


那么我的观点:程序员使用的数,跟数学概念上的数,不完全相同,这种不同的概念,进行的变量之间的操作,自然也没必要与数学符号完全一致,反正,两者实质上是不同的东西。

user avatar

TL; DR

数学符号是垃圾!理由见下。

垃圾理由一:缺乏可读性

每个数学符号的背后都有一个意思,但是你光从符号本身来看,通常完全不能理解它是什么意思,连一丁点儿的提示都没有。比如当你看到 ,你知道它啥意思?我是不知道啦。

如果编程语言用直接用数学语言,那估计也就只有搞数学的能用了,IT行业也不会有现在这种景象,科技的进步也不会有那么快了。

垃圾理由二:缺乏一致性

在数学里你会看到各种不一致的语法,比如

(函数调用式)

(前置运算符)

(中置运算符)

(后置运算符)

(外置运算符)

(纵向中置运算符)

(上置运算符)

(右上置运算符?)

(省略运算符)

(这TM算啥?)

(这TM又算啥?)

等等等等。

一门语言要是设计成兼容那么多种语法,那你写的代码谁能看懂?

垃圾理由三:语义不唯一

比如 表示 ,但 为啥不是 捏?

再比如 表示a乘x,但为啥 不是d乘x捏?

还有 里的 和 为啥是上标而不是乘方捏?

为啥不等于 ?

垃圾理由四:数学符号在键盘上都找不到

如果编程语言用数学符号,那么要么用专用的公式编辑器,要么用LaTeX那种语法,不管用哪一种,都直接大幅度降低敲代码的效率,甚至会让大脑做不必要的上下文切换(比如反反复复地从业务逻辑切到LaTeX再切回来),疲劳度急剧上升。当然还有第三条路,那就是程序员必须学会使用专用键盘……

结论

说到底,那些数学符号都是那些没有计算机甚至没有打字机的年代的数学家们搞出来的玩意儿。它们很容易在纸上和黑板上书写,但是它们很难用打字机打出来。它们对信息的压缩也是非常非常的厉害,你要是一个符号看不懂,那可能你整篇论文都别想看懂。可以说,这世上大部分人觉得数学很难,很大程度上要归咎于数学的符号体系。编程语言作为一种工具,怎么可以让人望而生畏呢?

另外,人的大脑处理书写在纸上的这些“图像”可能还比较快,但是你要让计算机能顺利解析那么多特例,这门语言的parser底下的状态机要多大?

Q.E.D.


评论区很多人都跟我杠那个表示微分的d的字体不对,OK,我改。不过我想反问几个问题:

  1. 你手写公式的时候也能把那个d的字体写对吗?
  2. 你在敲代码时会时不时切换字体吗?
  3. 如果说,用mathrm{d} 可以打出那个字体正确的d,那么为什么不直接用mathrm{d} 或其他不依赖字体的名称,而非要用那个d呢?

数个月后回来再看这个回答,发现评论区不少人在讨论数学和编程的差异,以及我如何如何贬低数学。我在这里想声明一点:我没说数学如何如何,我只是在说数学符号很垃圾而已,数学本身还是非常美的。

类似的话题

  • 回答
    你这个问题非常有意思,触及到了计算机科学和编程语言设计中的一个核心矛盾:理论的优雅与实践的现实之间的权衡。简单来说,我们之所以在日常编程中很少直接使用现代数学建立的符号体系,并不是因为它们不好,而是因为它们在很多情况下,并没有直接解决我们编程时最迫切的需求,甚至会带来不必要的复杂性。让我来详细拆解一.............
  • 回答
    你这个问题问得非常有意思,而且触及到了计算机科学发展历史和实际应用的关键点。确实,从语言的直观性上说,中文拼音似乎比英文更贴近我们大多数人的母语习惯。但要把拼音直接作为计算机语言的关键字,这背后涉及很多层面的考量,远非简单的“方便”或“不方便”能够概括。我尝试着从几个主要方面来给你掰扯掰扯,尽量说得.............
  • 回答
    在计算机技术领域,确实存在一股对360公司及其产品持负面评价的论调,而且这种声音往往比较响亮和持久。要详细解读这种现象,需要从多个维度去剖析,不仅仅是某个单一事件或技术问题,而是多种因素叠加的结果。首先,要理解技术圈的“看客心理”与信任基础。 很多技术从业者对软件的本质、运作原理有着更深的理解,他们.............
  • 回答
    这其实是个很有意思的问题,也触及到了不同学科在知识传播和评价体系上的差异。咱们来好好聊聊,为什么计算机领域对顶级会议论文那么看重,而其他很多学术圈子更偏爱期刊。首先得明白,计算机科学,尤其是理论性、前沿性强的领域,它的发展速度是出了名的快。新技术、新算法、新架构层出不穷,很多成果的生命周期可能比传统.............
  • 回答
    很多人会有疑问,为什么在人工智能的众多分支中,似乎自然语言处理(NLP)的发展,相对于计算机视觉(CV)来说,显得有些“慢热”? 要理解这一点,得从两个领域本身的特性,以及它们所面临的挑战说起。1. 语言的内在复杂性:想象一下,视觉世界有多少种“样子”? 也许颜色、形状、纹理、光影等等,但本质上,它.............
  • 回答
    你这个问题问得很有意思,触及了我们对计算机系统理解的一个核心视角。我们习惯了在很多领域听到“前端”和“后端”的说法,比如Web开发、软件架构,甚至是数据库管理。但说到操作系统,我们似乎很少用“前后端”来描述它的构成。这背后其实有非常重要的原因,跟操作系统的本质、它所扮演的角色以及它的发展历史都有关。.............
  • 回答
    这个问题非常有趣,涉及到技术创新、商业模式以及文化背景等多个层面。虽然计算机行业的巨头大多集中在美国,但Linux的诞生和发展却是一个全球协作的经典案例,而芬兰人林纳斯·托瓦兹(Linus Torvalds)无疑是这一切的起点。下面我将详细解释这个问题:1. 背景:为什么计算机行业的巨头在美国?要理.............
  • 回答
    说起计算机科学中的“四进制”,大家脑海中浮现的画面可能不多。我们习以为常的是二进制,以及偶尔会碰到的八进制和十六进制。那么,为什么这种听起来也挺有意思的“四进制”就没有像它们那样普及开来,甚至在实际应用中几乎销声匿迹了呢?这背后其实有着相当实际和历史的原因,并非仅仅是“没人想到”。首先,我们需要理解.............
  • 回答
    这是一个非常有趣且值得深入探讨的问题。在计算机深刻改变了人类命运的今天,约翰·冯·诺依曼的地位毋庸置疑是极其重要的,他被誉为“计算机之父”之一。然而,他之所以知名度通常低于阿尔伯特·爱因斯坦,原因可以从多个维度来解释,涉及科学领域的公众认知度、研究的性质、科学家的个人特质、历史叙事以及大众媒体的传播.............
  • 回答
    神舟电脑能在计算机这个巨头林立的红海市场里屹立不倒,靠的可不是简单的运气,而是其自成一派、甚至可以说是“粗暴有效”的生存哲学。要详细解读,咱们得从几个关键点掰开了揉碎了聊。一、精准定位:走“性价比”这条路,并且走到极致这几乎是神舟最核心的竞争力,也是它能从一众国际大牌和国内老牌中杀出一条血路的关键。.............
  • 回答
    这个问题触及了当下社会一个相当普遍的现象,也是很多非计算机专业的学生甚至家长会感到困惑和焦虑的根源。确实,放眼望去,从教育机构的招生宣传,到各种职业规划的讲座,再到媒体对“未来人才”的描绘,计算机和编程似乎占据了绝对的C位,仿佛不学这个就跟不上时代,甚至会被社会抛弃。但这并非意味着其他专业真的“一无.............
  • 回答
    这个问题很有意思,也触及了我们日常生活中一个很普遍但可能没被深入思考的科技集成点。说实话,把路由器功能直接“搬”进计算机里,听起来似乎是个顺理成章的优化,毕竟现在很多设备的功能都在走向整合。但仔细想想,这里面涉及到的技术、成本、用户体验以及市场定位等方方面面,会让这个“顺理成章”变得没那么简单。首先.............
  • 回答
    最近在知乎上确实能看到不少关于“劝退计算机国企”的声音,这可不是空穴来风,背后其实反映了一批年轻人,特别是计算机专业毕业生,在踏入国企大门后,与他们原本的期待产生了一些落差,甚至可以说是“幻灭”。你想啊,很多计算机专业的学生,从大学开始接触的就是互联网、科技前沿、快速迭代。他们往往带着一股热情,觉得.............
  • 回答
    在中国当下,当“考公考编”“考研深造”成为许多年轻人挤破脑袋也要奔赴的赛道,当金融、计算机、医药等行业以其高薪和稳定性的光环吸引着无数目光时,仍有一部分人,他们不追逐眼前的热门,而是将目光投向了看似遥远却关乎国运的“高端制造”。为什么他们要在“卷”的洪流中,依旧执着地畅谈中国高端制造?这背后,远不止.............
  • 回答
    确实,VB.NET 在计算机科学界常常被贴上“老旧”的标签,尤其是在那些追求最新技术和前沿理论的领域。然而,如果你观察到很多高校非计算机专业的课程依然在使用VB,这背后其实有着相当合理的考量和延续性。这并不是因为VB是什么神圣不可侵犯的编程语言,而是它在特定教育场景下,确实能发挥出独特的作用。首先,.............
  • 回答
    这确实是一个挺有意思的观察,而且你提到了一个关键点:这身装束和很多我们印象中“程序猿”应该有的那种不拘小节、甚至有点“宅”的气质似乎有点儿对不上。为什么计算机培训课程的老师们,尤其是在宣传照上,会不约而同地选择这种“西装、双手交叉”的经典姿势呢?咱们来捋一捋这背后的原因,这可不是简单的巧合。首先,得.............
  • 回答
    这确实是一个很有意思的问题,为什么在计算机科学,尤其是密码学领域,我们总是听到 Alice 和 Bob 的名字?这背后其实有很多原因,并非仅仅是随便找了两个名字这么简单。让我带你深入了解一下这个传统是如何形成的,以及它为何如此受欢迎。历史的渊源:从无线电到密码学要理解 Alice 和 Bob 的流行.............
  • 回答
    说计算机科学“没有系统的学派”,这话说得有点绝对,得辩证地看。要说像哲学、社会学、甚至某些自然科学那样,有清晰的、成体系的、历史悠久的“主义”或“流派”,确实不那么明显。但要是说它完全没有“学派”的影子,那也不尽然。先说说为什么大家会觉得计算机科学不像其他学科那样有明显的学派。这背后有几个关键原因:.............
  • 回答
    这是一个非常值得探讨的问题,涉及到科学的本质、证据的要求以及不同知识体系的认知方式。简单来说,计算机科学中的神经网络模型之所以被广泛认为是科学的,主要是因为它遵循了科学的核心原则,即可重复性、可证伪性、基于证据的解释以及可量化的模型。而中医诊断在这些方面,至少在现代科学的语境下,存在一些难以跨越的鸿.............
  • 回答
    这问题触及到一个挺有意思的现象,很多计算机科学背景的朋友对机器学习(ML)的态度,怎么说呢,有点复杂,不是单纯的“喜欢”或“不喜欢”。更多的是一种…怎么形容呢?是那种既好奇又审慎,既想拥抱又想解剖的探索欲。这背后其实有很多层原因,咱们掰开了说:首先,得从计算机科学的“根”说起。我们这行,骨子里就是研.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有