返回

文章详情

逆转抽象:存在主义危机

Hacker News2026年7月30日 14:34

转移思维轨迹,浪费宝贵时间 2025年11月10日 逆转抽象:存在主义危机。计算机科学通常以及语言实现特别,建立在以某种我称之为“向前”和“存在”的方式实现抽象的理念上。本文讨论这些并不是思考编程基础设施和抽象的唯一方式。理论上,你选择一些期望的抽象——这可以是编程语言、也许是抽象数据类型或其他东西。然后你找出实现方式。在编程语言的情况下,这可能是内存布局、调用约定以及生成模型这些的目标代码的编译器。对于抽象数据类型,它是某种具体的具体数据结构以及从抽象到具体操作的映射。这就是“向前”的部分。当你将实现的细节保留给自己时,它也是“存在”的。客户端代码(例如我们新语言中的源代码)知道有一个实现,但实现的选择本身是隐藏的。这反过来允许实现者改变主意,同时在事情出错时使自己免于任何后果。(我很愤世嫉俗?)我发现自己画了一个这样的ASCII艺术图。从存在到抽象 v / | \\ v //|||\\ v . . . . . . . 可能的实现 -- 选择一个!隐藏它! 到目前为止,这一切都是教科书上的内容。然而,这种隐藏并不总是做到。例如,ABI和调试器就是“选择退出”隐藏的例子。ABI选择不隐藏,而是采用公共约定:某些实现选择是公开记录的,同时在代码中具体体现。这允许独立实现进行互操作。(真可惜ABI并不常以某种更机器可读的声明形式定义。)与此同时,我之前写过的DWARF风格调试,通过在元级别上操作而选择不隐藏。调试器消耗由编译器生成的实现细节的机器可读描述。再次强调,与ABI一样,这种选择是因为独立执行的实现需要一起工作(但是……等等)。ABI的例子显然省略了“存在量化”,并留下了我们可以称之为“命题”的东西,也就是说,一组单一的、详细的实现决策。但调试器的方式更进一步。它是存在的对立面。它是一个“普遍”的程序!它消耗一个如何以抽象的方式查看具体的描述。原则上,它可以在某个讨论领域内恢复任何具体的抽象视图。它是普遍的,而不是存在的。普遍 . 抽象 ^ / | \\ ^ //|||\\ ^ . . . . . . . 可能的实现 -- 识别全部! 作为普遍和向后是强大且灵活的基础设施的重要但被忽视的能力。这似乎是解决Licklider的“与外星人交流”问题所必需的任何解决方案(我怀疑这个名称实际上是由Alan Kay的意译)。调试器与一种外星语言实现进行交流。(诚然,与调试器的交流是通过共享的元级别约定,如DWARF引导的。与真实的外星人进行交流则不现实;我们应该期望几乎没有共享。尽管如此,通过调试器,我们消除了共享基本知识的需要,即特定语言实现的知识。)我甚至敢说,传统在“普遍”和“向后”的忽视,以支持“向前”和“存在”,是软件不是软材料的部分原因。编程工件仍然脆弱,因为它们建立在固定和隐藏的命题上——对其他希望构建或与之互动的工件是不透明的。这些理想可以追溯到将编程视为纯粹数学实体的梦想。类似于通过逻辑推理“生长”的晶体,传统观点渴望软件在任何时候都是完美形成的。我们“永远不需要”去改变它,因为它的定义是完美的!但推其出其打算的对齐,它将碎裂。与生物有机体形成鲜明对比的是,生物有机体充满了探测和适应其环境的机制。几乎没有软件像这样。(显著例外:GNU autoconf。请继续关注。)同样,表型计算仍然是一个遥远而不熟悉的概念。(这个想法是Jaron Lanier的,但Clayton Lewis的分析是我知道的最好介绍。)作为一个领域,“编程语言”研究似乎特别厌恶这种“向后”方向。它的正统方法绑定于存在主义,并没有关注普遍性。在提出上述适应性和灵活性的关注时,通常的反应是:谁需要所有那些“复杂性”?这难道不是所有都“多余”吗?

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡