![](https://img-blog.csdnimg.cn/direct/f329ddda4511415b8cd1d7eafd0c5d40.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
PL理论初步
文章平均质量分 85
本专栏可以视作非专业性的 PL 的基础入门教程,将学习编程语言设计与实现的核心原理,涵盖命令式语言和声明式语言的对立编程视角。基于编程语言的基础理论,学习类型推断和静态分析的实现原理,实践部分将使用函数式编程语言F#。(学习本专栏前,需预先掌握C/C++基础和数据结构)
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
平渊道人
天罚。
展开
-
【PL理论】(36) 类型引用:构建替换 t → T | 替换的应用 App(s, t) | 解方程:定义 Unify() 和 Extend() | 总体算法(Overall Algorithm)
本篇我们继续讲解类型引用,两个步骤的第一个步骤。这一篇我们将讲解第二个步骤—— 解生成方程。这一次,我们将不再步履虚空,先引一个运行示例进行讨论,然后再展开介绍实际算法原创 2024-06-21 02:00:52 · 1079 阅读 · 2 评论 -
【PL理论】(35) 类型引用:类型推断步骤 | 生成类型方程 | 定义函数 (Γ, e, t) 生成使得 e 在 Γ 下具有类型 t ∈ T 的约束
本章我们将进入类型引用的讲解,首先带着大家复习一下之前我们制作的 F- 的类型规则,然后讲解类型推断步骤,以及如何生成类型方程。原创 2024-06-20 23:58:58 · 843 阅读 · 0 评论 -
【PL理论】(34) 类型系统:不完备性 | 为什么推导树推导失败? | 实现类型系统 | 调整到类型系统 | 思考:强制程序员写类型还是自动推断类型?
回顾我们的目标是为 F- 语言设计一个完备但不完全的类型系统,本章我们探讨的主题是类型系统的完备性。原创 2024-06-20 18:38:13 · 777 阅读 · 2 评论 -
【PL理论】(33) 类型系统:推导树证明 φ ⊢ e∶t | 继续定义关系:Γ ⊢ e∶t
本章我们将讲解推导树证明,推导树实际上就是推理规则的应用。只要学会如何选择并应用适当的推理规则,证明就不是难事了。原创 2024-06-19 16:16:30 · 1198 阅读 · 17 评论 -
【PL理论】(32) 类型系统:定义类型 τ ∈ TyVar = String | 定义类型环境 τ ∈ TyEnv = Var → T | 定义类型规则 τ ⊢ e : t
本章我们将继续讲解类型系统,定义我们设计的 F- 语言的类型、环境和类型规则。原创 2024-06-18 23:07:41 · 852 阅读 · 2 评论 -
【PL理论】(31) 类型系统:静态分析 (Static Analysis) | 静态类型系统 | 什么是类型?
本章我们将进入类型系统的讲解,回顾一下之前我们整理的 F- 语言,然后介绍一下静态分析和静态类型系统。讨论程序员该如何处理一些bug,有没有完美的静态分析器。原创 2024-06-18 12:36:53 · 749 阅读 · 5 评论 -
【PL理论】(30) OOP:覆盖与重载 | 虚方法 | 多态 | 子类型多态性 (Subtype Polymorphism) | 特定上下文多态性 (Ad-hoc Polymorphism)
本章我们以 C++ 为基础介绍 OOP,介绍覆盖与重载、虚方法、多态等。原创 2024-06-17 11:23:44 · 189 阅读 · 3 评论 -
【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object-oriented Programming
本章我们将进入Object-oriented Programming,面向对象编程的讲解,探讨 C++ 中的类,继承等。原创 2024-06-17 01:24:16 · 854 阅读 · 1 评论 -
【PL理论】(28) 内存管理:追踪垃圾回收 | mark-and-sweep 标记清除算法 | 标记清除算法的缺陷 | 三色标记法 (Tri-color) | 可达 ≠ 将被使用
本章我们继续讲解内存管理,介绍标记清除算法,然后讨论一下其缺陷。然后引入优化方案 Tri-color 三色标记法。原创 2024-06-16 19:21:32 · 556 阅读 · 3 评论 -
【PL理论】(27) 内存管理:垃圾回收机制 (GC) | Python 中程序执行过程中内存状态的变化 | 引用计数(RC)| 引用计数是如何工作的 | 函数返回的例子 | 限制:引用循环
本章我们将讲解垃圾回收机制,介绍 Python 中程序执行过程中内存状态的变化,然后讲解引用计数法。原创 2024-06-16 14:22:58 · 176 阅读 · 0 评论 -
【PL理论】(26) 内存管理:C语言实现内存管理的方式 | 栈帧的分配和释放 | C/C++ 手动内存管理
在前面的章节中,语言的语义只分配了新的内存位置,我们没有讨论内存位置的释放。在实际的语言中,内存位置在执行过程中会被不断地分配和释放。下面的章节,我们将讨论编程语言的这种内存管理,并且我们将重点介绍垃圾回收机制 (一种自动管理动态分配内存的机制) 。在接下来的讲解中,我们不会像之前那样使用编程语言的正式语义定义了。例如,尽管可以形式化地表示简单的垃圾回收方法,但这样会使内容变得过于复杂。取而代之地,我将依赖示例代码和图表来进行高层次的解释。原创 2024-06-16 04:41:46 · 1454 阅读 · 3 评论 -
【PL理论】(25) C- 语言:表达式求值的推理规则 | 执行语句的推理规则 | 语句执行的推理规则
本章我们将继续更新我们的 "C-" 语言,更新表达式求值的推理规则、执行语句的推理规则以及语句执行的推理规则。原创 2024-06-16 00:51:23 · 975 阅读 · 0 评论 -
【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存
我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。原创 2024-06-15 08:52:57 · 736 阅读 · 4 评论 -
【PL理论】(23) 函数式语言:let-in 示例的分解 | 谁在使用动态作用域?
本章我们将对函数式语言的讲解进行收尾,分解一下之前讲的 let-in 示例。然后讨论一下谁在使用动态作用域。原创 2024-06-14 16:08:19 · 381 阅读 · 2 评论 -
【PL理论】(22) 函数式语言:多参数 | 柯里化 (Currying) : 将多参数函数实现为返回一个函数的函数
本章我们将继续讲解函数式语言,介绍多参数,着重讲解柯里化的概念,将多参数函数实现为返回一个函数的函数。原创 2024-06-14 00:29:02 · 357 阅读 · 2 评论 -
【PL理论】(21) 函数式语言:支持匿名函数 fun x → E | 设计递归函数 | 支持递归函数:let rec ...
本章我们将讲解支持匿名函数,先回顾一下 F# 语言表示函数的方法,然后引出它。随后我们讲解一下如何设计递归函数,最后让我们的 F- 语言支持递归函数。原创 2024-06-13 04:34:25 · 1972 阅读 · 3 评论 -
【PL理论】(20) 函数式语言:定义函数 Func = Var × E × Env | 闭包 (Closure) | 定义函数引用 e1 e2
本章我们将继续介绍函数式语言,讲解如何定义函数,以及闭包的概念,并学会定义函数的应用。原创 2024-06-12 15:55:42 · 1909 阅读 · 4 评论 -
【PL理论】(19) 函数式语言:更复杂的 let-in 示例 | 作用域 | 静态作用域 vs. 动态作用域
本章我们将继续讲解函数式语言,介绍比上一章更复杂的 let-in 示例,进行分析。并讲解作用域,通过例子对比静态作用域和动态作用域的区别。原创 2024-06-12 00:00:57 · 276 阅读 · 2 评论 -
【PL理论】(18) 函数式语言:简化版 F# 语言 | F- 语义 | let-in 结构 | 环境 (Env) | 语义域 Env = Var→Val, ρ∈Env | 语义 ρ ⊢ e ⇓ v
本章开始我们将介绍一个 "简化版" 的 F# 语言,讲解函数式语言。原创 2024-06-11 05:47:54 · 2357 阅读 · 3 评论 -
【PL理论】(17) 形式化语义:语言拓展 - 指针 | L-value 表达式 | 绘制推导树 x = 1; p = &x; x = *p + 3 | 左值与右值 | 小步语义的概念 (初步了解)
在本章中,我们将进一步探讨形式化语义,做一个收尾。介绍如何绘制推导树。我们首先深入研究了左值与右值的概念,最后,我们简要介绍了小步语义的概念。原创 2024-06-11 03:24:23 · 2509 阅读 · 0 评论 -
【PL理论】(16) 形式化语义:语义树 | <Φ, S> ⇒ M | 形式化语义 | 为什么需要形式化语义 | 事实:部分编程语言的设计者并不会形式化语义
本章我们将继续探讨形式化语义,讲解语义树,然后我们将讨论“为什么需要形式化语义”,以及讲述一个比较有趣的事实(大部分编程语言设计者其实并不会形式化语义的定义)。原创 2024-06-10 20:16:38 · 479 阅读 · 2 评论 -
【PL理论】(15) 形式化语义:语义域 | Val = Z + B | Mem = Var → Val | 表达式评估的语义规则 M ⊢ e ⇓ v | 表达式执行的语义规则 <M, s> ⇒ M′
本章我们将讲解语义域,介绍表达式评估和语义执行的语义规则,通过本章的学习,我们将对接下来 PL 理论的教学打好符号化的基础,能更好地去理解理论知识。原创 2024-06-10 02:53:58 · 2782 阅读 · 0 评论 -
【PL理论】(14) 形式化语义: PL 基础符号教学 | 命令式的编程语言 C- | 上下文无关语法 (CFG) | 从 Lambda 表达式的 λ 演算聊聊 Maplet 符号存在的意义
我们结束了 F# 的学习,下面我们将进入 "命令式语言" 的部分学习,这是一个简化的语言,类似于 C 和 Python。没有像函数调用这样的复杂特性。 在此之后,我们将转向对一种函数式语言的正式定义:我们将开始引入诸如函数之类的复杂特性。在此过程中,我们还将讨论编程语言中的重要概念,比如闭包、作用域、柯里化等。原创 2024-06-10 00:51:22 · 3168 阅读 · 1 评论 -
【PL理论】(13) F#:高阶函数 (Higher-Order) | 高阶函数:动机 | 高级函数 map, filter, fold... | 编程范式之“声明式语言”
今天,我们将带着大家领会F# 真正强大之处,介绍高阶函数。实际上,我们在介绍 List 的时候就已经给大家讲解过高阶函数了,但是本章我们将梳理并带大家领会它们的价值。原创 2024-06-09 20:59:30 · 829 阅读 · 0 评论 -
【PL理论】(12) F#:模块 | 命名空间 | 异常处理 | 内置异常 |:? | 相互递归函数
本章我们将介绍 F# 的模块,我们前几章讲的列表、集合和映射都是模块。然后我们将介绍 F# 中的异常,以及内置异常,最后再讲解一下相互递归函数。原创 2024-06-09 16:33:34 · 959 阅读 · 0 评论 -
【PL理论】(11) F#:标准库之 Set | 标准库之 Map
本章我们将简要的介绍一下 Set 和 Map (非常简要,简要至极)原创 2024-06-09 00:07:01 · 2785 阅读 · 2 评论 -
【PL理论】(10) F#:列表的折叠操作 | 累积器 accumulator | List.fold 函数 | List.foldBack 函数 | List.reduce 函数
折叠是一种常见的列表处理操作,通过将列表元素与累积器 (accumulator) 函数结合。从而生成一个单一的值,F# 中提供了一揽子折叠函数,主要包括:List.fold, List.foldBack, List.reduce, List.reduceBack,这些函数的用途和工作机制稍有不同,本章我们将依依介绍它们。原创 2024-06-08 02:35:34 · 728 阅读 · 3 评论 -
【PL理论】(9) F#:列表高阶函数之 map 函数 | 映射并保持索引 List.mapi 函数 | 映射操作之条件变换 | 使用 List.map2 函数组合多个列表
本章我们将继续介绍 List 的操作,围绕 List.map 的使用方式进行讲解。都有详细的示例供大家参考。原创 2024-06-08 00:19:26 · 830 阅读 · 0 评论 -
【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射
上一章中,我们详细讲解了列表的合并,本章我们来详细讲解一下列表的过滤,在 F# 中,过滤列表是指从列表中提取满足某个条件的元素,形成一个新的列表。这个操作通常使用 List.filter 函数来完成。原创 2024-06-07 17:21:59 · 3018 阅读 · 0 评论 -
【PL理论】(7) F#:列表的拼接 | 使用@操作符拼接 | 使用 List.append 函数 | 使用 List.concat 拼接多个列表 | 链式拼接 :管道操作符 管道操作符 |>
上一章中,我们介绍了标准库中的 List,本章我们将详细讲解一下列表的拼接,F# 提供了多种方法来实现列表拼接,主要包括使用 @ 操作符和 List.append 函数。下面我们就来详细介绍这些方法以及它们的使用场景。原创 2024-06-07 02:31:53 · 518 阅读 · 0 评论 -
【PL理论】(6) F#:标准库之列表(List)
本章我们将介绍 F# 标准库的列表,我们将简单的先过一遍列表的一些常用操作,具体的讲解我们将放在后续章节。原创 2024-06-06 16:36:04 · 3313 阅读 · 0 评论 -
【PL理论】(5) F#:递归类型 | Immutability 特性(F#中值一旦定义就不会改变)
本文旨在探讨不可变数据结构在 F# 编程中的应用,特别是如何利用递归记录类型来表示和操作数值表达式。通过定义存储整数的二叉树和数值表达式的类型,我们将展示不可变性如何简化程序的理解和维护。文章将对比 F# 与命令式编程语言(如 C 和 C++)在处理类似问题时的差异,强调 F# 不可变性的优势,并通过示例展示如何在 F# 中对表达式求值原创 2024-06-06 02:33:55 · 1101 阅读 · 3 评论 -
【PL理论】(4) F#:使用 let rec 递归函数 | 元组 | 联合体类型 | 模式匹配 | F# 独特而强大的特性:定义自己的类型 | 联合类型在 F# 中特别有用
在定义递归函数时,使用 let rec,在 F# 中,递归取代了像 while 或 for 这样的循环。虽然一开始可能有些笨拙,但你可以用递归完成所有事情!原创 2024-06-05 22:54:42 · 613 阅读 · 3 评论 -
【PL理论】(3) F# 数据类型:变量类型 | F# 操作符 | 定义函数 | 使用定义的函数 | if-then-else 表达式:绝对不能省略 else 部分,除非表达式是 unit 类型
本章我们继续学习 F#,上一节我们创建了简单的 F# 程序,现在我们开始介绍变量类型、if-then-else 表达式、操作符以及定义函数。原创 2024-06-05 21:16:23 · 3604 阅读 · 11 评论 -
【PL理论】(2) 快速了解 F#:为什么学 F# | 环境安装 | 函数式编程语言 | dotnet new 创建 | dotnet build -o out 编译 | ./out/ 运行
为了方便下面继续展开PL 的学习,我们不得不介绍一下 F# 语言。这是微软搞得一个函数式编程语言,读 F sharp 就行,是不是很想 C#?建议再出一个 K#,这样的话就可以集齐 KFC 编程全家桶了,对了今天是疯狂星期四,可不可以 v 我 50 我要吃 KFC?原创 2024-03-29 00:59:33 · 808 阅读 · 3 评论 -
【PL理论】(1) 语法与语义:归纳的定义 | 推理规则 | 推导树 | 数学归纳法证明 (MI)
在学习编程的过程中,我们经常会听到 "语法" 和 "语义" 这两个词。它们是编程世界中至关重要的概念,对于理解和编写高质量的代码至关重要。在本博客中,我们将深入探讨这两个概念,从而帮助读者更好地理解编程语言的本质和运作方式。原创 2024-03-26 21:03:21 · 1039 阅读 · 1 评论