深入 C ++中的函数式编程 1

2019-06-27 10:22 来源:http://www.lvzhongchou.org
[在此重印的#altdevblogaday深度篇中,id Software的联合创始人兼技术总监John Carmack用C ++着眼于编程的能。]

可能每个阅读此内容的人都听说过“能编程”,这些内容本应该为软件开发带来好处,甚至可以说它被吹捧为银弹。然而,通过早期参考lambda演算和正式系统,访问获取更多信息可能最初是令人反感的。目前还不清楚与编写更好的软件有什么关系。

我的实用总结:软件开发中的很大一些缺陷是由于程序员没有完全理解他们的代可能执行的所有可能状态。在多线程环境中,缺乏理解和由此产生的问题被大大放大,几乎到了如果你正在注意,恐慌点。以函数式编程使得显示的代状态变得明确,这使得它更容易推理,并且在完全纯粹的系统中,使线程竞争条件变得不可能。

我确实认为追求函数式编程是有实际价值的,但是劝告每个人放弃他们的C ++编译器并开始用Lisp,Haskell编写,或者直言不讳任何其他边缘语言都是不负责任的。

令语言设计者永远懊恼的是,有很多外部因素可以压倒语言的好处,游戏开发比大多数领域都要多。我们在遗留代库和每个人都面临的劳动力可用问题的基础上,拥有跨平台问题,专有工具链,认证门户,许可技术和严格的能要求。

如果您处于可以用非主流语言进行重要开发工作的情况下,我会为您欢呼,但要准备好以进步的名义进行一些点击。

对于其他人:无论您使用何种语言,以能风格编程都会带来好处。你应该在方便时做到这一点,你应该在不方便的时候仔细考虑决定。你可以学习lambda,monad,currying,在无限上组合懒惰的评估函数,以及所有其他如果你选择,明确的能导向语言的方面。

C ++不鼓励函数式编程,但它不会阻止你这样做,并且你保留了下拉的能力并将SIMD内在函数应用于由内存映射文件支持的手工布局数据,或者其他任何实质的优点你找到需要。

纯粹的能

纯函数只查看传递给它的参数,它所做的就是根据参数返回一个或多个计算值。它没有逻辑副作用。 这当然是抽象的;每个函数在CPU级别都有副作用,而且大多数都在堆级别,但抽象仍然很有价值。

它不会查看或更新全局状态。它不维持内部状态。它不执行任何IO。它不会改变任何输入参数。理想情况下,它不会传递任何无关的数据–获取传入的allMyGlobals指针会失去很多目的。

纯函数有很多不错的属。

线程安全。带有值参数的纯函数是完全线程安全的。使用引用或指针参数,即使它们是const,您也需要意识到执行非纯作的另一个线程可能会改变或释放数据的危险,但它仍然是编写安全多线程的最强大工具之一。代。

您可以轻松地将它们切换为并行实现,或者运行多个实现来比较结果。这使得实验和进化更加安全。

可重用。将纯函数移植到新环境要容易得多。您仍然需要处理类型定义和任何调用的纯函数,但没有滚雪球效应。有多少次你知道有一些代可以在另一个系统中完成你需要的东西,但是从它的所有环境假设中解脱出来的工作要比编写它更多吗?

可测。纯函数具有引用透明度,这意味着无论何时调用它都会为一组参数提供相同的结果,这使得它比与其他系统交织的内容更容易。我从未对编写测试代负责 [在此重印的#altdevblogaday深度篇中,id Software的联合创始人兼技术总监John Carmack用C ++着眼于编程的能。]

可能每个阅读此内容的人都听说过“能编程”,这些内容本应该为软件开发带来好处,甚至可以说它被吹捧为银弹。然而,通过早期参考lambda演算和正式系统,访问获取更多信息可能最初是令人反感的。目前还不清楚与编写更好的软件有什么关系。

我的实用总结:软件开发中的很大一些缺陷是由于程序员没有完全理解他们的代可能执行的所有可能状态。在多线程环境中,缺乏理解和由此产生的问题被大大放大,几乎到了如果你正在注意,恐慌点。以函数式编程使得显示的代状态变得明确,这使得它更容易推理,并且在完全纯粹的系统中,使线程竞争条件变得不可能。

我确实认为追求函数式编程是有实际价值的,但是劝告每个人放弃他们的C ++编译器并开始用Lisp,Haskell编写,或者直言不讳任何其他边缘语言都是不负责任的。

令语言设计者永远懊恼的是,有很多外部因素可以压倒语言的好处,游戏开发比大多数领域都要多。我们在遗留代库和每个人都面临的劳动力可用问题的基础上,拥有跨平台问题,专有工具链,认证门户,许可技术和严格的能要求。

如果您处于可以用非主流语言进行重要开发工作的情况下,我会为您欢呼,但要准备好以进步的名义进行一些点击。

对于其他人:无论您使用何种语言,以能风格编程都会带来好处。你应该在方便时做到这一点,你应该在不方便的时候仔细考虑决定。你可以学习lambda,monad,currying,在无限上组合懒惰的评估函数,以及所有其他如果你选择,明确的能导向语言的方面。

C ++不鼓励函数式编程,但它不会阻止你这样做,并且你保留了下拉的能力并将SIMD内在函数应用于由内存映射文件支持的手工布局数据,或者其他任何实质的优点你找到需要。

纯粹的能

纯函数只查看传递给它的参数,它所做的就是根据参数返回一个或多个计算值。它没有逻辑副作用。 这当然是抽象的;每个函数在CPU级别都有副作用,而且大多数都在堆级别,但抽象仍然很有价值。

它不会查看或更新全局状态。它不维持内部状态。它不执行任何IO。它不会改变任何输入参数。理想情况下,它不会传递任何无关的数据–获取传入的allMyGlobals指针会失去很多目的。

纯函数有很多不错的属。

线程安全。带有值参数的纯函数是完全线程安全的。使用引用或指针参数,即使它们是const,您也需要意识到执行非纯作的另一个线程可能会改变或释放数据的危险,但它仍然是编写安全多线程的最强大工具之一。代。

您可以轻松地将它们切换为并行实现,或者运行多个实现来比较结果。这使得实验和进化更加安全。

可重用。将纯函数移植到新环境要容易得多。您仍然需要处理类型定义和任何调用的纯函数,但没有滚雪球效应。有多少次你知道有一些代可以在另一个系统中完成你需要的东西,但是从它的所有环境假设中解脱出来的工作要比编写它更多吗?

可测。纯函数具有引用透明度,这意味着无论何时调用它都会为一组参数提供相同的结果,这使得它比与其他系统交织的内容更容易。我从未对编写测试代负责 [在此重印的#altdevblogaday深度篇中,id Software的联合创始人兼技术总监John Carmack用C ++着眼于编程的能。]

可能每个阅读此内容的人都听说过“能编程”,这些内容本应该为软件开发带来好处,甚至可以说它被吹捧为银弹。然而,通过早期参考lambda演算和正式系统,访问获取更多信息可能最初是令人反感的。目前还不清楚与编写更好的软件有什么关系。

我的实用总结:软件开发中的很大一些缺陷是由于程序员没有完全理解他们的代可能执行的所有可能状态。在多线程环境中,缺乏理解和由此产生的问题被大大放大,几乎到了如果你正在注意,恐慌点。以函数式编程使得显示的代状态变得明确,这使得它更容易推理,并且在完全纯粹的系统中,使线程竞争条件变得不可能。

我确实认为追求函数式编程是有实际价值的,但是劝告每个人放弃他们的C ++编译器并开始用Lisp,Haskell编写,或者直言不讳任何其他边缘语言都是不负责任的。

令语言设计者永远懊恼的是,有很多外部因素可以压倒语言的好处,游戏开发比大多数领域都要多。我们在遗留代库和每个人都面临的劳动力可用问题的基础上,拥有跨平台问题,专有工具链,认证门户,许可技术和严格的能要求。

如果您处于可以用非主流语言进行重要开发工作的情况下,我会为您欢呼,但要准备好以进步的名义进行一些点击。

对于其他人:无论您使用何种语言,以能风格编程都会带来好处。你应该在方便时做到这一点,你应该在不方便的时候仔细考虑决定。你可以学习lambda,monad,currying,在无限上组合懒惰的评估函数,以及所有其他如果你选择,明确的能导向语言的方面。

C ++不鼓励函数式编程,但它不会阻止你这样做,并且你保留了下拉的能力并将SIMD内在函数应用于由内存映射文件支持的手工布局数据,或者其他任何实质的优点你找到需要。

纯粹的能

纯函数只查看传递给它的参数,它所做的就是根据参数返回一个或多个计算值。它没有逻辑副作用。 这当然是抽象的;每个函数在CPU级别都有副作用,而且大多数都在堆级别,但抽象仍然很有价值。

它不会查看或更新全局状态。它不维持内部状态。它不执行任何IO。它不会改变任何输入参数。理想情况下,它不会传递任何无关的数据–获取传入的allMyGlobals指针会失去很多目的。

纯函数有很多不错的属。

线程安全。带有值参数的纯函数是完全线程安全的。使用引用或指针参数,即使它们是const,您也需要意识到执行非纯作的另一个线程可能会改变或释放数据的危险,但它仍然是编写安全多线程的最强大工具之一。代。

您可以轻松地将它们切换为并行实现,或者运行多个实现来比较结果。这使得实验和进化更加安全。

可重用。将纯函数移植到新环境要容易得多。您仍然需要处理类型定义和任何调用的纯函数,但没有滚雪球效应。有多少次你知道有一些代可以在另一个系统中完成你需要的东西,但是从它的所有环境假设中解脱出来的工作要比编写它更多吗?

可测。纯函数具有引用透明度,这意味着无论何时调用它都会为一组参数提供相同的结果,这使得它比与其他系统交织的内容更容易。我从未对编写测试代负责 [在此重印的#altdevblogaday深度篇中,id Software的联合创始人兼技术总监John Carmack用C ++着眼于编程的能。]

可能每个阅读此内容的人都听说过“能编程”,这些内容本应该为软件开发带来好处,甚至可以说它被吹捧为银弹。然而,通过早期参考lambda演算和正式系统,访问获取更多信息可能最初是令人反感的。目前还不清楚与编写更好的软件有什么关系。

我的实用总结:软件开发中的很大一些缺陷是由于程序员没有完全理解他们的代可能执行的所有可能状态。在多线程环境中,缺乏理解和由此产生的问题被大大放大,几乎到了如果你正在注意,恐慌点。以函数式编程使得显示的代状态变得明确,这使得它更容易推理,并且在完全纯粹的系统中,使线程竞争条件变得不可能。

我确实认为追求函数式编程是有实际价值的,但是劝告每个人放弃他们的C ++编译器并开始用Lisp,Haskell编写,或者直言不讳任何其他边缘语言都是不负责任的。

令语言设计者永远懊恼的是,有很多外部因素可以压倒语言的好处,游戏开发比大多数领域都要多。我们在遗留代库和每个人都面临的劳动力可用问题的基础上,拥有跨平台问题,专有工具链,认证门户,许可技术和严格的能要求。

如果您处于可以用非主流语言进行重要开发工作的情况下,我会为您欢呼,但要准备好以进步的名义进行一些点击。

对于其他人:无论您使用何种语言,以能风格编程都会带来好处。你应该在方便时做到这一点,你应该在不方便的时候仔细考虑决定。你可以学习lambda,monad,currying,在无限上组合懒惰的评估函数,以及所有其他如果你选择,明确的能导向语言的方面。

C ++不鼓励函数式编程,但它不会阻止你这样做,并且你保留了下拉的能力并将SIMD内在函数应用于由内存映射文件支持的手工布局数据,或者其他任何实质的优点你找到需要。

纯粹的能

纯函数只查看传递给它的参数,它所做的就是根据参数返回一个或多个计算值。它没有逻辑副作用。 这当然是抽象的;每个函数在CPU级别都有副作用,而且大多数都在堆级别,但抽象仍然很有价值。

它不会查看或更新全局状态。它不维持内部状态。它不执行任何IO。它不会改变任何输入参数。理想情况下,它不会传递任何无关的数据–获取传入的allMyGlobals指针会失去很多目的。

纯函数有很多不错的属。

线程安全。带有值参数的纯函数是完全线程安全的。使用引用或指针参数,即使它们是const,您也需要意识到执行非纯作的另一个线程可能会改变或释放数据的危险,但它仍然是编写安全多线程的最强大工具之一。代。

您可以轻松地将它们切换为并行实现,或者运行多个实现来比较结果。这使得实验和进化更加安全。

可重用。将纯函数移植到新环境要容易得多。您仍然需要处理类型定义和任何调用的纯函数,但没有滚雪球效应。有多少次你知道有一些代可以在另一个系统中完成你需要的东西,但是从它的所有环境假设中解脱出来的工作要比编写它更多吗?

可测。纯函数具有引用透明度,这意味着无论何时调用它都会为一组参数提供相同的结果,这使得它比与其他系统交织的内容更容易。我从未对编写测试代负责

上一篇:在其他人加入时,法官驳回NFL球员马登诉讼
下一篇:在经典老板战斗中扮演老板的游戏

相关文章