抽象,Abstraction.
Lampson也在图灵奖获奖演讲时曾说过一句话:Any problem in computer science can be solved with another level of indirection. (有人也说是David Wheeler说的)。 如由于计算机体系结构与资源是“赤裸丑陋”的,于是抽象出来一层操作系统进行计算机资源的管理与操作。而为了与操作系统交互,于是抽象出来了Runtime Library层,方式是System Call。而浏览器、编译器、Office等上层应用则仅需Runtime Library层交互即可,方式是Operating System API。
Application | | OS API Runtime Library | | System Call OS | | Hardware Specification Hardware
清晰、简洁、漂亮!
而在程序语言的发展中,抽象的思想也是无处不在,如C++17的Concept就是一个很好的例子。在如今的模板当中,我们的模板参数T没有任何语意,所以出错信息总是那么的长。
如
template<typename R, typename T> bool exist(const R& range, const T& value) { for (const auto& x : range) if (x == value) return true; return false; } vector<string> vec {}; exist(vec, 47); // BUG!
GCC 5.2的报错信息长达180多行。既然如此,那么我们就为C++模板参数增加约束,抽象出来一个Concept (概念),对类型参数赋予类型约束。
template<typename R, typename T> requires Equality_comparable<T, Value_type<R>>() bool exist(const R& range, const T& value) { for (const auto& x : range) if (x == value) return true; return false; } vector<string> vec {}; exist(vec, 47); // BUG!
使用Concept的GCC报错信息只有3行!
可参考我在GitHub的演讲PDF查看相关Concept的定义:
presentation/pdf at master · FrozenGene/presentation · GitHub清晰、简洁、漂亮!
而抽象的思想也体现在已经广为流传的面向对象思想,在真实世界与程序世界之间,桥梁即抽象。如想表达女朋友的概念,提取出相关条件,然后进行程序表达即可
class GirlFriend { public: bool hasLongHair() const {//...} private: std::string name_; unsigned age_; //... };
清晰、简洁、漂亮!
香农在1938年发表的伟大论文
A Symbolic Analysis of Relay and Switching Circuits(《对继电器和开关电路中的符号分析》)将开关、继电器、二进制、布尔代数联系起来。