原视频作者链接:

【从图灵机到 Lisp:编程语言的起点|编程语言发展史 #1】


观前提示:

为了让讲解更加直观,作者将编程语言的发展过程抽象成为:

为了解决怎样的问题 - 提出/发明怎样的概念/编程语言来进一步解决这些问题

即 提出问题 - 发明结构 - 解决问题


编程语言的起点

1. 图灵

总结:图灵思想的贡献
  • 图灵机 为计算提供了最简洁的模型。

  • 图灵完备性 告诉我们不同编程语言和系统在能力上的等价。

  • 停机问题 揭示了计算的极限:它不仅说明了机器能算什么,也清楚地划定了机器永远无法算出的范围。

这是人类第一次为 计算的能力与局限 画下了清晰的边界。


1936 年, 图灵

他思考的核心问题:究竟什么可以被计算?有没有一种最简洁的模型可以揭示计算的本质?

于是提出了 图灵机

图灵机

设想中的 图灵机 结构:

  • 一条无限长的纸带 —— 就像无限的内存变量空间,用来存储数据
  • 一个读写头,能在纸带上移动 —— 像数据指针那样读取/写入符号
  • 一张状态转移表 —— 最早的程序逻辑,定义在不同状态和符号下该执行什么操作
  • 后来所有的计算机设备在计算能力上与图灵机等价;它们都能模拟通用图灵机。

图灵完备性
  • 如果一个系统能够模拟图灵机,就称其 图灵完备

这意味着,从 Python、C、JavaScript,到 Excel,在理论上都能表达同样复杂的计算过程。

差别不在于 “能不能算”,而在于 “计算效率如何,表达是否简洁”。


停机问题

图灵还提出了一个更深刻的问题 - 停机问题

是否存在一个万能程序,能够判断任意程序最终会不会停机?

结论是:不存在这样的通用算法

借助 理发师悖论 来理解这一点:

想象一个小镇,有一位理发师,只给村里”不给自己理发的人理发”。

  • 如果理发师给自己理发,那他就是给自己理发的人,就违反了他的规则。

  • 如果他不给自己理发,那他就是不给自己理发的人,就应该给自己理发。

这就陷入了逻辑矛盾。

回到停机问题,图灵的推理与此类似。

首先,假设存在一个万能判定器H,可以判定任意程序是否停机;

接着,构造一个特殊的程序D。它的规则是:

  • 如果H说它会停机,D就偏偏不停;
  • 如果H说它不会停机,D就立即停下。

最后,当我们让D判断自身时,矛盾出现了:无论判定器H给出怎样的答案,答案都会与事实相反。

这意味着,所谓的万能判定器并不存在。、

更严格的表述是:

  • 对于某些特定程序,我们仍然能分析出是否停机;

  • 但不存在一个通用算法,能对所有程序都给出正确答案。


随着第一批电子计算机的诞生,人类进入了真正的可编程的时代。

最初,所有的指令必须直接写成二进制。每一道程序都从手工排列的0与1开始。

为什么是0和1?

因为在最底层,计算机就是无数个开关,开关只有两种状态——通电或断电;在电路里对应高电平与低电平,换成符号就是1和0。

这些开关组成逻辑门——与门、或门、非门。

正是这三种最基本的逻辑,构建出加法器、乘法器,乃至整个CPU。

这就是为什么0与1足以表达所有计算。