编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

39 | 综合实现(二):如何实现函数式编程?

一课一思
课程小结
函数式编程语言的编译和实现
函数式编程的特点
函数式编程实现

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
近些年,函数式编程正在复兴。除了一些纯函数式编程语言,比如 Lisp、Clojure、Erlang 等,众多的主流编程语言,如 Python、JavaScript、Go 甚至 Java,它们都有对函数式编程的支持。
你应该会发现,现在人们对于函数式编程的讨论有很多,比如争论函数式编程和面向对象编程到底哪个更强,在语言里提供混合的编程模式到底对不对等等。
这些论战一时半会儿很难停息。不过我们的这一讲,不会涉及这些有争议的话题,而是试图从编译技术的角度,来探讨如何支持函数式编程,包括如何让函数作为一等公民、如何针对函数式编程的特点做优化、如何处理不变性,等等。通过函数式编程这个综合的主题,我们也再一次看看,如何在实现一门语言时综合运用编译原理的各种知识点,同时在这个探究的过程中,也会加深你对函数式编程语言的理解。
好,我们先来简单了解一下函数式编程的特点。

函数式编程的特点

我想,你心里可能多多少少都会有一点疑问,为什么函数式编程开始变得流行了呢?为什么我在开篇的时候,说函数式编程正在“复兴”,而没有说正在兴起?为什么围绕函数式编程会有那么多的争论?
要回答这几个问题,我会建议你先去了解一点历史。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数式编程是一种正在复兴的编程范式,其核心思想是像数学那样使用函数和值,以实现简单、可预测的软件结构,并获得支持并发、更简洁的表达等优势。文章从编译技术的角度探讨了如何支持函数式编程,包括函数作为一等公民、针对函数式编程的特点做优化、处理不变性等方面。函数式编程的数学基础是Lambda演算,早在上世纪50年代就出现了函数式编程语言Lisp。函数式编程语言的优势在于能够像数学那样使用函数和变量,使软件结构简单、清晰,运行结果可预测,不容易出错。纯函数的概念是关键,它具有引用透明和无副作用的特点,带来计算时间、运行时替换等灵活性的优势。不变性是函数式编程的重要原则,使得程序更适合编写并发程序,避免了竞争情况和锁的机制。声明式的编程风格也是函数式编程的特点之一,要求计算机给出想要的结果,而不关心具体的处理步骤。文章还介绍了函数式编程语言的编译和实现,包括编译器前端工作等方面。函数在运行时中以不同方式表示,如在Python中,函数是一种对象,而在Scala和Java中,函数在JVM中会变成类。闭包是函数式编程的特殊情况,它引用了上级作用域中的自由变量。总的来说,函数式编程通过数学化的思维方式和特定的编程范式,为软件开发带来了新的思路和优势。文章还讨论了延迟求值、不变性对编译和运行时的影响,以及对递归函数的优化,展示了函数式编程特性的实现要点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • kkxue
    耗子叔的《Go编程模式:修饰器》https://time.geekbang.org/column/article/330456 文章中#多个修饰器的 Pipeline这个例子我觉得体现的非常充分。

    作者回复: 谢谢推荐和分享:-) 你叫他耗子叔呀,那我也是大叔辈的:-)

    2021-03-04
    2
  • ifelse
    2022-01-30
  • kkxue
    装饰器应该就是使计算逻辑更简洁的例子吧
    2021-03-04
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部