重温“卡马克谈functional programming in c++”

Functional Programming in C++ (2018.11出版,PDF格式) Functional Programming in C++ teaches developers the practical side of functional programming and the tools that C++ provides to develop software in the functional style. This in-depth guide is full of useful diagrams that help you understand FP concepts and begin to think functionally. about the book Functional Programming in C++ helps you unleash the functional side of your brain, as you gain a powerful new perspective on C++ coding. You’ll discover dozens of examples, diagrams, and illustrations that break down the functional concepts you can apply in C++, including lazy evaluation, function objects and invokables, algebraic data types, and more. As you read, you’ll match FP techniques with practical scenarios where they offer the most benefit. 立即下载

这里写图片描述
正在准备些关于overwatch的gameplay architecture的blog,里面的观点也让我想起12年时候看的carmack谈的functional programming in c++这个文章。
就回去重温了下,过去了5年,很多地方也有了不同的感触。
原先的blog这里:http://blog.youkuaiyun.com/toughbro/article/details/7725450
carmack的原文链接现在不太好访问了,可以看gamasutra上面的转载:http://www.gamasutra.com/view/news/169296/Indepth_Functional_programming_in_C.php

对于state变化的控制和实际情况中的妥协的火候的把握,可以说5年后重读文章最有共鸣的地方。

状态变化,functional programming & OO programming
可以说程序的复杂度和state的变化是非常相关的。
对于state变化的控制力,可以说是程序员对于整个系统控制力最重要的方面之一,而对于state变化模糊不清也是我们程序员会出现大量系统缺陷的重要原因。
而这里,object oriented programming就倾向于把state变化封装起来,而functional programming倾向于将state变化显示呈现,进而增强我们对于state变化的控制力。
这个就是functional programming的力量所在。

所以carmack建议:在可以的情况下,我们应该尽量的使用functional programming去简化程序的复杂度,显示呈现state的变化。
当然这里并不绝对,object oriented programming有它好的地方,我们围绕为什么去鼓励functional programming(显示呈现state变化)来判定应该怎么做就好。

pure function
pure function可以看下专门的wiki:https://en.wikipedia.org/wiki/Pure_function
pure function在c++中并不是一个语法定义,在D语言里倒是有关键字定义。
在carmack这里的定义包括:

  • 只读参数,然后返回结果,不会修改参数
  • 没有自己的内部状态,不修改global变量,不做IO

wiki上面提到一些例子就是像sin(x)这样的函数。
它有这样一些好处:

  • 线程安全,如果参数是value parameter,这就是一个写线程安全代码的非常强大的方式
  • 易读,易测,易懂,易于维护

c++中class的const函数就是非常好的一个关键字,我们应该尽可能多的使用这个,来提升函数的pure性质。

实践中的妥协与不完美
这个部分可以说是5年之后再读的时候发现共鸣最多的部分,道理虽然很棒,但是实际用的时候还是讲求一个火候,纯粹的情况实在太少太少。

绝对pure与比较pure

实际中就是难以做到纯粹,把所有函数那弄成pure function更是不可能。
carmack的看法是把一团乱麻的情况,弄到比较pure这个过程是意义极大的,把比较pure弄到绝对pure意义就有限了,实际项目中,根据具体情况,我们自己把握火候就好。
就像class中的const关键字一样,不一定非得pure functional programming才行,class中使用const的function就让state的变化控制好很多,就已经大大提升了。

性能因素
性能因素也是妥协的一个重要原因,比较典型的functional programming都是返回一个结果的copy,这个在结果是大数据量的时候显然是需要权衡的了。
在性能紧张的情况下,必须要牺牲复杂度来引进性能的因素了。
我个人对此的信条是“以不hack来hack”,就是要尽可能的降低系统的复杂度,尽可能不要hack,然后在一些非常需要hack来获得性能的地方,提供hack的budget。
比如在天刀中,后期做的一个优化就是把entity中的graphic component单独从其他component中提取出来,从:

class Entity
{
component* GetComponent<T>(){}//一个for循环取component
vector<component*> mComponents;
};

到这种专门把graphic component单独处理,因为它明显是读取频率最高的component,做成inline读取,省去了一个带for的function call,性能优势异常的明显

class Entity
{
component* GetComponent<T>(){}//一个for循环取component
component* GetComponent<GraphicComponent> { return mGraphicComponent; }
vector<component*> mComponents;
GraphicComponent* mGraphicComponent;
};

但是这个做法的关键是一定要保证entity实现的复杂度要控制的足够好,否则这样的hack会极大地破坏entity的设计,在关键数据结构上复杂度失控可不是好玩的。
可以说通过良好的实现,积累出一些复杂度余量,然后用在这种能够大量提升性能的地方,但不能多用。

编程多年之后的看点
之前也有和刚工作的同学一起聊编程很多年之后,有什么不一样,看什么的东西。
总体说来很多了,包括不限于:会越来越多的透过具体的技术,做法和语法,更多的关注这种复杂度的控制,state变化的控制,火候的妥协了。

Functional Programming in C++ Functional Programming in C++ teaches developers the practical side of functional programming and the tools that C++ provides to develop software in the functional style. This in-depth guide is full of useful diagrams that help you understand FP concepts and begin to think functionally. Well-written code is easier to test and reuse, simpler to parallelize, and less error prone. Mastering the functional style of programming can help you tackle the demands of modern apps and will lead to simpler expression of complex program logic, graceful error handling, and elegant concurrency. C++ supports FP with templates, lambdas, and other core language features, along with many parts of the STL. Functional Programming in C++ helps you unleash the functional side of your brain, as you gain a powerful new perspective on C++ coding. You’ll discover dozens of examples, diagrams, and illustrations that break down the functional concepts you can apply in C++, including lazy evaluation, function objects and invokables, algebraic data types, and more. As you read, you’ll match FP techniques with practical scenarios where they offer the most benefit. What’s inside Writing safer code with no performance penalties Explicitly handling errors through the type system Extending C++ with new control structures Composing tasks with DSLs 立即下载

相关推荐

Functional programming in Java.pdf

With the introduction of Java 8, many functional programming techniques have been added to the language. However, functional programming may seem unfamiliar to developers who are used to using imperative and object-oriented techniques. The new additions to Java 8 offer the opportunity to develop more maintainable and robust applications than that offered by earlier versions of Java. The goal of this book is to introduce functional programming techniques to developers who are not familiar with this technology. You will be guided through the use of functional programming techniques with the help of numerous examples. Older imperative and object-oriented approaches will be illustrated and contrasted with equivalent functional programming solutions.

In-depth: Functional programming in C++ - 在C++上面使用函数式编程

原文作者為遊戲界的傳奇人物John Carmack 本譯文張貼已經過作者同意 原文網址: http://gamasutra.com/view/news/169296/Indepth_Functional_programming_in_C.php 譯者: 網路上有很多關於用FP風格寫C++的文章,其中John Carmack所寫的這一篇Functional programm

ToyAuthor的博客 1212

银河麒麟桌面操作系统V10(SP1)ssh服务安装与配置

在国产化的大背景下,各种国产操作系统逐步进入运维人员的视野,ssh作为linux远程连接工具,是运维人员必需的工具之一。本文主要介绍在银河麒麟桌面操作系统V10(SP1)上安装和配置ssh服务。

zhengshaolin128的博客 7811

Functional Programming in Java

Java的函数式编程,lambda表达式,forEach,以及命令式编程和声明式编程的区别。

阿正的梦工坊 1155

开源项目 ruoyi-sso-oauth2(一)环境配置

Ruoyi若依实现单点登录SSO、oauth2认证

Xiaoweidumpb 9684

STM32实战:5分钟搞定CanFestival协议栈下的CANopen心跳报文配置(附避坑指南)

本文详细介绍了如何在STM32平台上使用CanFestival协议栈快速配置CANopen心跳报文,包括硬件准备、协议栈移植、心跳报文配置及常见问题解决方案。通过实战步骤和避坑指南,帮助开发者高效实现节点状态监控,提升工业控制系统的可靠性。

win55的博客 747

卡马克谈Functional programming in C++

http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/ 这个在《程序员》杂志上有译文,也很不错。 functional programming is good 卡马克根据自己的实践得出的结论是,软件开发过程中的很大一部分的不足来自开发者对于自己程序将会运行于哪些可能的状态(state)认识不足,而这样的认识不足...

tulunta 207

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6565

函数式编程(Functional Programming,简称FP)是一种编程范式,强调将计算视为数学函数的求值,避免可变状态和副作用

C++作为多范式语言,支持函数式编程的某些特性,尤其在C++11及之后通过lambda表达式、标准库算法和高阶函数等增强了支持。2.3 函数对象与std::functionstd::function(C++11)用于存储可调用对象(如函数、lambda、函数指针),支持高阶函数。2.1 Lambda表达式(C++11)Lambda表达式是C++中实现函数式编程的核心,允许定义匿名函数,支持高阶函数和闭包。3.1 纯函数C++通过const成员函数和不可变数据结构(如std::tuple)实现纯函数特性。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1051

iTunes登录协议逆向与自动化实现

本文详细解析了iTunes登录协议的逆向工程与自动化实现方法,涵盖请求体构造、签名生成和会话管理等关键技术。通过XML结构解析、X-Apple-ActionSignature生成原理及完整登录流程实现,帮助开发者高效完成iTunes自动化登录,提升工作效率。

weixin_26938645的博客 940

机器人控制仿真软件:MATLAB Simulink Control System Toolbox_(1).MATLAB基础知识

MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能数值计算和可视化软件。它广泛应用于科学计算、工程设计、信号处理、控制系统设计、图像处理等领域。强大的矩阵运算能力:MATLAB的核心是矩阵运算,能够高效处理大规模的数值数据。丰富的工具箱:MATLAB提供了大量的工具箱,如Control System Toolbox、Simulink、Signal Processing Toolbox等,这些工具箱覆盖了多个应用领域。易于使用的图形界面。

kkchenjj的博客 907

c#函数式编程 Functional Programming in C# [10]

2.4 计算的纯度和进化   我希望本章使函数纯度的概念不再那么神秘,并说明了为什么扩展纯代码的足迹是一个有价值的目标,提高代码的可维护性和可测试性。   软件和硬件的进化也对我们如何看待纯度产生重要影响。我们的系统越来越分散,因此我们程序的 I/O 部分越来越重要。随着微服务架构成为主流,我们的程序不再进行计算,而更多地将计算委托给其他服务,它们通过 I/O 与之通信。   I/O 要求的增加意味着纯度更难实现。但这也意味着对异步 I/O 的需求增加,正如您所见,纯度可以帮助您处理并发场景,其中包括处理异

unity尧明的博客 313

一站式讲解Wireshark网络抓包分析的若干场景、过滤条件及分析方法

本文详细讲解常用的抓包工具、抓包分析的网络场景、分析抓包时的多种过滤条件以及如何结合常用的协议去分析排查问题,给大家提供一个借鉴或参考。

dvlinker的技术专栏 5万+

Functional Programming in C++ 学习笔记FPpr4&3

学习笔记5爷忘记保存了,吐了 这是4的笔记 //C++template泛型编程(模板) #include <iostream> #include <string> using namespace std; template <typename T>//这个名称可以在函数定义中使用,就和int list一样,作为一种新的数据类型 inline T const& Max(T const& a, T const& b) { return a

fanhaoxiang1的博客 370

电子元器件-接口电路篇:RS-232、RS485/422、I2C、SPI、USB、网口

以上规定说明了RS-232C 标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的传输的电平为-3V~-15V,逻辑“0”传输的电平为+3V~+15V;对于控制信号;接通状态(ON)即信号有效的电平为+3V~+15V,断开状态(OFF)即信号无效的电平为-3V~-15V,也就是当传输电平的绝对值大于3V 时,电路可以有效地检查出来;

qq_60226558的博客 890

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java8-09-functional 函数式编程

文章目录Functional Programming in JavaUsage of collectionList translateCollection filterOptionalMapReduceString IteratorCollect拓展阅读目录导航 Functional Programming in Java Lambda expressions are lightweight, h...

1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【C++ 函数式编程】深入解析 C++ 函数式编程<functional> 库

函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。这种编程范式的核心是,你可以用纯函数(Pure Functions)来构建整个程序。纯函数是一种输出完全由输入决定的函数,没有任何副作用。这样的函数更容易测试和调试,因为它们不依赖于外部状态。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2949

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Functional Programming in C++ 学习笔记FPpr6

//函数与函数对象 #include <iostream> using namespace std; //两种定义函数的方式 int answer = 42; int max1(int arg1, int arg2) { return arg1 >= arg2 ? arg1 : arg2; } //编译器在编译期会将auto替换为变量实际的类型 //auto& 可以对数组 a 中的元素进行修改.auto不行 //关于尽量少用using namepace std: https://

fanhaoxiang1的博客 514

Modern C++ 学习笔记——C++函数式编程

C++函数式编程看这一篇就够了,建议收藏~~~!!! ModernC++学习笔记是一系列介绍现代C++新特性的文章,结合《effective modern C++》说明了如何更好的使用这些新特性。相互讨论,共同学习,不断成长

小小笑笑川的博客 4007

C++ 越来越像函数式编程了!

在深入探讨 C++ 的演变之前,我们先简单介绍一下什么是函数式编程(Functional Programming)。函数式编程是一种编程范式,它把计算视为数学函数的求值,强调引用透明性纯函数高阶函数和惰性求值等概念。引用透明性:相同输入总是得到相同的输出,没有副作用。纯函数:函数内部不修改任何外部状态,也不依赖外部状态。高阶函数:可以接受函数作为参数或者返回函数。惰性求值:表达式只在需要时才计算。HaskellLisp (及其变种,如 Scheme 和 Clojure)ErlangF#

2404_88048702的博客 1298

Functional Programming in Java(1) syntax overview

Venkat's book

阿正的梦工坊 808

Java函数式编程基础

本文简单总结了函数式编程的基础内容,之后会对高级语法进行一定的扩展总结。

unravelmc的博客 1667

java函数式编程

Lambda 表达式:简化代码,表示匿名函数。函数式接口:Java 中的函数类型,用于定义 Lambda 的类型。内置函数式接口:提供常用的函数式接口如FunctionPredicate等。Stream API:处理集合数据的强大工具,支持链式操作。方法引用:一种简化 Lambda 表达式的方式。Optional:用于避免空指针异常的容器类。在 Java 中使用函数式编程,可以提升代码的简洁性、可读性以及对集合的灵活操作。

qq_35861084的博客 896

Functional Programming in C++ 学习笔记FPpr8

晕了,因为面向对象编程是以后的必修课,现在想先学一下c++函数式编程,结果还是逃不了。幸好之前学过python面向对象,重温一下吧 //调用操作符重载 //之前虽然学过python面向对象,但是还是有必要学习c++的——为FP准备 #include <iostream> #include <string> using namespace std; typedef void return_type ; typedef void arguments; //对之前代码的理解 int ask

fanhaoxiang1的博客 296
上一篇: 面试官谈游戏入行--面试和信仰
下一篇: [gdc17]《守望先锋》的EntityComponent架构
安柏霖
安柏霖 领域专家: 学术研究与理论基础技术领域 领域专家: 学术研究与理论基础技术领域
博客等级 码龄20年 1788粉丝 891原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值