C++的发展与抽象
在此之前先说一些概念:
计算机最重要的两个元件: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++的发展与抽象的更多相关文章
- 2019滴滴java面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...
- 2019滴滴php面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人6年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是既有php也有Java后端开发,最终选择去了滴滴 ...
- 2019头条java面试总结 (包含面试题解析)
2019滴滴java面试总结 (包含面试题) 本人8年开发经验.今年年初找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.滴滴等公司offer,岗位是Java后端开发. 面试了很多家公司,感觉大部分 ...
- 2019 奥买家java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.奥买家等公司offer,岗位是Java后端开发,因为发展原因最终选择去了奥买家,入职一年时间了,也成为了面试官 ...
- 2019 北森java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.北森等公司offer,岗位是Java后端开发,因为发展原因最终选择去了北森,入职一年时间了,也成为了面试官,之 ...
- 2019 物易云通java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.物易云通等公司offer,岗位是Java后端开发,因为发展原因最终选择去了物易云通,入职一年时间了,也成为了面 ...
- 2019 梆梆安全java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.梆梆安全等公司offer,岗位是Java后端开发,因为发展原因最终选择去了梆梆安全,入职一年时间了,也成为了面 ...
- 2019 淘友天下java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.淘友天下等公司offer,岗位是Java后端开发,因为发展原因最终选择去了淘友天下,入职一年时间了,也成为了面 ...
- 2019 多点Dmalljava面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多点Dmall等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多点Dmall,入职一年时间了 ...
- 2019 浩德钢圈java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.浩德钢圈等公司offer,岗位是Java后端开发,因为发展原因最终选择去了浩德钢圈,入职一年时间了,也成为了面 ...
随机推荐
- 深入掌握FastAPI与OpenAPI规范的高级适配技巧
title: 深入掌握FastAPI与OpenAPI规范的高级适配技巧 date: 2025/03/30 01:16:11 updated: 2025/03/30 01:16:11 author: c ...
- 【虚拟机】VirualBox安装macOS系统
[虚拟机]VirualBox安装macOS系统 零.创建虚拟机 类型选择 Mac OS X 版本选择 macOS 10.13 High Sierra (64-bit) 注意:这边我设置的名称为 Mac ...
- SQL Server 查看版本信息
SQL Server 查看版本信息3种方法: 1) 使用命令行查看 [Win + R]键 -> 打开cmd 2) 使用SSMS查看 打开并连接SSMS后查看 3) 通过服务器属性查看 使用SSM ...
- Devops相关考试和认证
Devops相关考试和认证 Red Hat Certified System Administrator (RHCSA) 能够执行以下任务: 了解和运用必要的工具来处理文件.目录.命令行环境和文档 操 ...
- Web前端入门第 33 问:CSS 元素外观常用属性(边框、阴影、轮廓、透明度)
background 作为元素外观里的重点功臣介绍完毕,本文再一览其他常用的外观属性. 本文示例中,盒子基础样式: .box { font-size: 20px; margin: 20px; padd ...
- 华为od机考2025A卷真题 -寻找重复代码
题目描述与示例 题目 小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码. 重复代码查找方法:以字符串形式给出两行代码text1,text2(字符串长度1 ...
- 康谋方案 | 基于AI自适应迭代的边缘场景探索方案
构建巨量的驾驶场景时,测试ADAS和AD系统面临着巨大挑战,如传统的实验设计(Design of Experiments, DoE)方法难以有效覆盖识别驾驶边缘场景案例,但这些边缘案例恰恰是进一步提升 ...
- Spring Boot 根据配置决定服务(集群、单机)是否使用某些主件
比如:在集群模式下,我想用 Nacos 组件,单机版不想用它. server: name: VipSoft Server Dev port: 8193 cloud: nacos: discovery: ...
- 云备份技术解析:备份删除&合并原理
本文分享自天翼云开发者社区<云备份技术解析:备份删除&合并原理>,作者:沈****军 在删除备份副本时,需要根据备份副本包含的数据块以及数据块的引用关系来进行空间的释放.当云硬盘的 ...
- 一个用原生JavaScript实现的日历小工具,开箱即用
---------------- 用原生JavaScript实现的一个日历小工具,开箱即用,可用于做签到记录.日程等显示控件,具体自己发挥啦 效果如下图,可以自行美化 >>点击体验< ...