在此之前先说一些概念:

计算机最重要的两个元件:CPU(控制器、运算器)、存储设备(寄存器、缓存、内存、硬盘)。

算法需要实现,所以有了CPU,CPU需要运行算法,所以有了指令集、程序段,高级语言编写函数代替编写程序段。

算法运行需要数据支撑,且算法本身需要存储起来,所以有了 存储设备,存储设备可以永久存储数据,程序编写中变量就是数据。永久存储速度太慢,所以有了缓存设备和存储器体系。

冯诺依曼最杰出的思想就是:把算法记录成指令,当做数据存放,于是算法和数据完美结合,产生了冯诺依曼体系计算机。这和人类似,仔细一想,人的大脑也有计算和存储功能。

杂谈:

两年前看了《黑客与画家》这本书,当时觉得非常有趣,书的后半部分 作者大力鼓吹Lisp语言,说了lisp语言是未来的编程语言,极度抽象,能非常省力的做到其他语言很难做到或根本做不到的事情。

其中举了一个很贴切的例子,他写了一段简短的lisp代码,参数是一个函数,返回值也是一个函数。也就是能够将函数当做数据进行处理。相当于把代码当做数据进行处理。

这个能力是非常有吸引力的,在C++中,代码就是.text,数据就是.data,区分的非常明显。而在lisp中,代码和数据没有明显的区分。

有人称lisp为面向语言的语言、函数式编程的鼻祖、变态的语言、非正常人使用的语言......

lisp的确吸引了我,作者说最值钱的是人力,所以把事情尽可能多的交给程序去做,lisp正是这样一门语言,它能将算法当做数据来用,所以它能在人工智能领域施展拳脚。

当我尝试去学lisp时,发现它的代码全是括号,表达式(+ 3 4)的结果是7,而正常的语言都是3+4。所以读lisp代码感觉有些困难。最后我没有使用lisp。但是我还是愿意称它为函数式编程的鼻祖。

近年来,函数式编程被众多语言接受,python就支持函数式。今天我要说的是我经常用的C++所支持的函数式。

我仔细想,为啥lisp如此灵活的把函数和数据结合起来。最后想出来,lisp和python都是动态语言,在运行时才生成指令,所以运行的时候可以动态生成代码。而C++是静态语言,在编译期就把指令定死了。所以C++如果支持函数式编程,那一定是在编译器决定下来了。

果然,从C语言的函数指针,到C++的函数对象,再到C++11的lambda、functional、bind。都是在编译器完成的函数式,及通过元编程(宏定义、模板)实现。

函数装饰器:

在《黑客与画家》中作者贴出来的lisp代码,正是一个函数装饰器,及接受一个函数,对这个函数进行修改,再返回一个新的函数。这个功能就称为函数装饰器。当时他认为C++是完全实现不了这个功能的,我尝试了很多次,的确实现不出来,但是最近在ceph代码中发现了函数装饰器的影子,虽然没有lisp的简洁,但是功能还是实现出来了:下面我就直接贴代码吧。

#include <utility>
class Decorator
{
public:
template <typename Callback, typename...Args>
decltype(auto) ret(Callback&& cb, Args&&... args)
{
//log
printf("begin\n");
printf("to do some things\n");
auto ret = std::forward<Callback>(cb)(std::forward<Args>(args)...);
//log
printf("end\n");
printf("to do some things\n");
return ret;
}
template <typename Callback, typename...Args>
void voi(Callback&& cb, Args&&... args)
{
//log
printf("begin\n");
printf("to do some things\n");
std::forward<Callback>(cb)(std::forward<Args>(args)...);
//log
printf("end\n");
printf("to do some things\n");
}
}; int add(int a, int b) { return a + b; }
void sub(int a, int b) {}
int main()
{
Decorator dec;
dec.ret(add, 1, 3);
dec.voi(sub, 1, 3);
system("pause");
return 0;
}

  

其中,ret函数模板可以封装 有返回值的函数,voi函数模板可以封装 无返回值的函数。可以自行体会, 然后根据自己的需求进行修改。

C++的发展与抽象的更多相关文章

  1. 2019滴滴java面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  2. 2019滴滴php面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...

  3. 2019头条java面试总结 (包含面试题解析)

    2019滴滴java面试总结  (包含面试题) 本人8年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是Java后端开发. 面试了很多家公司,感觉大部分 ...

  4. 2019 奥买家java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.奥买家等公司offer,岗位是Java后端开发,因为发展原因最终选择去了奥买家,入职一年时间了,也成为了面试官 ...

  5. 2019 北森java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.北森等公司offer,岗位是Java后端开发,因为发展原因最终选择去了北森,入职一年时间了,也成为了面试官,之 ...

  6. 2019 物易云通java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.物易云通等公司offer,岗位是Java后端开发,因为发展原因最终选择去了物易云通,入职一年时间了,也成为了面 ...

  7. 2019 梆梆安全java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.梆梆安全等公司offer,岗位是Java后端开发,因为发展原因最终选择去了梆梆安全,入职一年时间了,也成为了面 ...

  8. 2019 淘友天下java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.淘友天下等公司offer,岗位是Java后端开发,因为发展原因最终选择去了淘友天下,入职一年时间了,也成为了面 ...

  9. 2019 多点Dmalljava面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多点Dmall等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多点Dmall,入职一年时间了 ...

  10. 2019 浩德钢圈java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.浩德钢圈等公司offer,岗位是Java后端开发,因为发展原因最终选择去了浩德钢圈,入职一年时间了,也成为了面 ...

随机推荐

  1. 活动中台系统慢 SQL 治理实践

    作者:vivo 互联网服务器团队- Zhang Mengtao 活动中台系统作为中台项目非常注重系统性能和用户体验,数据库系统性能问题会对应用程序的性能和用户体验产生负面影响.慢查询可能导致应用程序响 ...

  2. hashtable底层

    一.单线程环境下 底层:hash表结构 (数组 + 链表) 使用无参构造创建对象时 会默认长度11的数组 加载因子0.75 Hashtable<Object, Object> hashta ...

  3. 加减法计算在RB中的应用(比如计算库存)(should be equal as integers指令的使用)

    订单测试过程中,对库存的校验是很关键的步骤 下面这个案例即实现对订单前后库存检查.公式计算.结果匹配,输出测试结果.具体脚本如下图 步骤如下: 1.获取订单前的库存 2.订单流程 3.获取订单后的库存 ...

  4. Java 的 CMS 垃圾回收流程

    Java 的 CMS 垃圾回收流程 CMS(Concurrent Mark-Sweep)垃圾回收器 是一种并发垃圾回收器,旨在减少垃圾回收时的停顿时间,适用于对低延迟要求较高的应用.CMS 主要通过并 ...

  5. 关于php里怎么把字符串‘false’转成boolean的false

    都知道php里类型转换常用的是settype($str,'boolean')和(bool)$str 但是,他们将字符串'false'和'true'转成boolean后都是true,可能这不是我们需要的 ...

  6. kali安装docker环境

    Docker需要Linux内核大于 3.10 并且是 64位 的,可以用 uname -a 可以查看是否符合要求 uname -a Linux kali 4.17.0-kali1-amd64 #1 S ...

  7. FastJSON序列化扩展接口与特性详解

    结论先行 FastJSON 的 SerializeFilter 接口通过 动态拦截和修改序列化过程,可实现字段名重命名.敏感数据脱敏.字段过滤等高级功能.其核心子接口包括 PropertyPreFil ...

  8. 跨境电商 | 踏浪出海:我的Allegro跨境电商实战全景

    作者:追梦1819 (同名公众号),本职:高级软件工程师:副业:Allegro跨境电商.运营同名公众号(左上二维码),专注分享成长.跨境电商经历与经验. 版权声明:本文为博主原创文章,转载请附上博文链 ...

  9. 【记录】IDA|IDA设置text view为默认,并解决IDA7.6打开新固件卡顿的问题

    版本:IDA Pro 7.6 Graph View(控制流视图)其实我真的看得很少,因为遇到分析难题时总是是因为间接调用,它根本分析不出来.但是一开IDA它就自动分析这个特别卡.所以今天想彻底解决一下 ...

  10. RPC实战与核心原理之业务分组

    业务分组:如何隔离流量 回顾 RPC 中常用的保护手段"熔断限流" 熔断是调用方为了避免在调用过程中,服务提供方出现问题的时候,自身资源被耗尽的一种保护行为: 而限流则是服务提供方 ...