Kie*_*ter 7 scheme functional-programming tail-recursion mutability racket
这里似乎是我可以从我刚刚完成的如何设计程序(简化球拍)课程中获得的两件最重要的事情,直接来自课程的讲义:
1)尾部调用优化,以及非功能语言的缺乏:
可悲的是,大多数其他语言不支持TAIL CALL OPTIMIZATION.换句话说,即使是尾调用,它们也会构建堆栈.
尾调用优化是在70年代中期发明的,远在大多数语言的主要元素开发之后.因为它们没有尾调用优化,所以这些语言提供了一组固定的LOOPING CONSTRUCTS,可以遍历任意大小的数据.
a)在没有特色的过程语言中,这种类型的优化有哪些等价物?b)使用那些等价物是否意味着我们避免在类似情况下在没有它的语言中建立堆栈?
2)变异和多核处理器
这种机制几乎是你编程的任何其他语言的基础.我们推迟到目前为止推出它有几个原因:
尽管是基础,但它却非常复杂
过度使用它会导致程序无法并行化(在多个处理器上运行).由于多核计算机现在很常见,因此仅在需要时使用突变的能力变得越来越重要
过度使用变异也会使程序难以理解,难以很好地测试它们
但是可变变量很重要,学习这个机制将为您提供更多准备工作Java,Python和许多其他语言.即使在这些语言中,您也希望使用称为"主要是函数式编程"的样式.
在学习本课程之前,我学习了一些Java,Python和C++,因此认为变异是理所当然的.现在已经被上述声明全部抛到了空中.我的问题是:
a)我在哪里可以找到有关第二篇子弹中建议内容的更多详细信息,以及如何处理这些内容,以及b)"大多数功能性编程"风格会出现什么样的模式,而不是更粗心的风格我可能本来会继续使用其他语言而不是参加这门课程?
正如Leppie指出的那样,循环结构可以为它们支持的特定类型的循环设法恢复正确尾调用的空间节省.循环结构的唯一问题是你拥有的结构永远不够,除非你只是将球投入用户的球场并迫使他们明确地对堆栈进行建模.
举个例子,假设您使用循环遍历二叉树.它有效...但你需要明确地跟踪"要回归的那些".尾部调用语言中的递归遍历允许您拥有蛋糕并且也可以吃掉它,不需要时不浪费空间,也不会强迫您自己跟踪堆栈.
关于并行性和并发性的问题要广泛得多,最好的指针可能是研究领域,而不是现有的解决方案.我认为大多数人会同意计算机世界正在发生危机; 我们如何使我们的突变重编程技能适应新的多核心世界?
简单地转换到功能范例也不是这里的银弹; 我们仍然不知道如何编写高级代码并生成超快速的非变异运行并发代码.不过,很多人都在努力解决这个问题!