在此之前先说一些概念:

计算机最重要的两个元件: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. 【Linux】1.1 Linux课程介绍

    Linux课程介绍 1. 学习方向 linux运维工程师: 维护linux的服务器(一般大型企业) linux嵌入式工程师: linux做驱动开发,或者linux的嵌入式 linux下开发项目 2. ...

  2. 【Java】(机考常用)类集

    类集框架(集合框架)是一个用来代表和操纵集合的统一架构.所有的类集框架都包含如下内容: 接口:是代表类集的抽象数据类型.之所以定义多个接口,是为了以不同的方式操作集合对象. 例如:Collection ...

  3. 学习unigui【28】UniGUI接收POST/GET

    小儿科问题,直接上流程代码: 1 procedure TUniServerModule.UniGUIServerModuleHTTPCommand( 2 ARequestInfo: TIdHTTPRe ...

  4. 垂直模型和AI Workflow是开AGI的历史倒车

    提供AI咨询+AI项目陪跑服务,有需要回复1 RL 之父 Rich Sutton在 2019 年的文章<苦涩的教训>中指出: 70 年的 AI 研究历史告诉我们一个最重要的道理:依靠纯粹算 ...

  5. 2025dsfz集训Day3:DFS搜索与剪枝

    DAY3: DFS搜索与剪枝 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 深搜 深度优 ...

  6. 前端传字符串,需要转List对象

    前端传字符串,需要转List对象 import com.alibaba.fastjson.JSONObject; List<LogySbjsJdsbqxxxAccount> param = ...

  7. EFCore学习(二)——添加,修改,删除,查询操作及将EFCore语句编译成sql

    实质: EFCore的底层实际是将关于实体类的的操作编译成sql,然后让ado.net去执行 在Program.cs里使用SchoolContext 说明:需要SchoolContext.cs声明实体 ...

  8. Java--Calendar类,Date类的简单使用,日期的格式化

    package demo; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; / ...

  9. Filter与Interceptor的区别

    前言 在看springboot项目时,其中的会话持续时,了解到token,session,jwt等方法,但是接着我就了解到过滤器(Filter)以及拦截器(Interceptor),感觉这两个东西真的 ...

  10. k8s之statefulset控制器

    operator: statefulset:有状态副本集 特点 运行在: 1,稳定且唯一的网络标识符 2,稳定且持久的存储 3,有序,平滑地部署和扩展 4,有序,平滑地删除和终止 5,有序的滚动更新 ...