抽象价值之简述

我在《实现drop函数》一文最后留了个问题:

抽象的价值是否就在于将问题映射到更简单的解空间?

这只是我的Shower Thought。但可以就其展开谈一些有趣的事。

首先,抽象这个词在中英文语境的含义不一样。其次,抽象的概念本身就很难解释(你看我一不小心就递归了:-p)。本文将从一个编程者的角度阐述一些问题。

辞源

抽象的英文是abstract,看词根就是牵拉的意思。15世纪艺术届大量使用abstract表示分离现实物质的行为。比如说抽象画,它的一大要素就是去除事物的外在特征。可能是同期艺术界千奇百怪的作品被冠名“抽象”,让这个词有了“高深”或“难以理解”的含义。

中文的抽象一词源头已经不可考,但它的含义已经被各种后现代艺术,娱乐作品转义了不知道多少次。工程上所谓的抽象出现不超过200年。

概要

数据抽象。包子,饺子,馒头都属于面食。而面食,水果,肉类都属于食物。面向对象界喜欢研究这些类型之间的关系,甚至搞出巨大的继承树。我觉得单纯的数据抽象很有艺术感,它们都试图剔除事物的特征。剔除特征的过程是不是像归纳

行为抽象。我的第一感想到的不是数字电路,而是围棋。围棋本身不过黑白子,但对于特定棋型却有冲,挡,扳,粘,挖,断等术语。这些行为就像是组合子,组成任意的棋局。这个过程是不是又像是演绎。

演变

工程上,抽象的主要目的在于简化。依我所见,抽象往往不是为了客观地简化问题,而是将问题映射到更接近现实的空间。对于编程语言,从机器到汇编,到FORTRAN/C,再到C++/Java以至于各种DSL。抽象层次逐渐提升,编程语言也更加人性化。

大多编程者入门都应写过四则运算解析器,功能是将中缀表达式转成前缀或后缀,因为当代通用计算机只接受后者。例如,1 + 3 * 4 * 5的前缀表达式就是+ 1 * * 3 4 5

中缀表达式对计算机本身何尝不是一种抽象。这种行为对初学者来说成本很低,但也受到了(Lisp)业界的批判。大多数不能重载操作符的语言不还是得写出

add(1, muti(muti(3, 4), 5))

类似的代码。这样的抽象没有错,但至少也是见仁见智。

结论

引发本文的关键词“抽象的价值”。我不觉得抽象的概念本身存在什么价值(一不小心又递归了),而且还是“抽象”。不过习惯于将问题映射到更简单的解空间确实是一个好的方法论,无论它和抽象是否相关,都是有价值的。

This entry was posted in 无用心得. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *