PLT 入门:语言设计、类型系统与函数式编程的初识
本文仅作为入门篇学习笔记,主题包括:
- 编程语言与编译器的区别(PL / PLT)
- 类型系统的作用与启发
- 函数式编程(FP)实践与困惑
🧭 为什么 PL 和编译器是两回事?
很多 IT 工作者经常把“编程语言(PL)”和“编译器”混为一谈。其实二者关注点非常不同:
- 编程语言研究的是表达计算的本质:语义、抽象、结构。
- 编译器是将一种语言翻译为另一种语言(通常是低级语言)的技术实现。
正如 这篇博客 所说:PL 所涉及的范式和理论,不仅能解释编译器,还能解释 CPU 架构与运行机制。PL 是通向“计算本质”的路径之一。
📒 学习笔记说明:为什么写这篇文章?
⚠️ 先说在前:PL、类型系统、函数式编程(FP)这些话题并不适合装懂,它们都非常深——我只是学习过程中做些记录和总结,算是“入门+去魅”吧。
FP 曾经让我很困惑。我学了很多术语、历史背景却始终抓不住重点,后来才发现应该先从代码本身理解,再看理念。
几点个人反思:
- 不要一上来就讲“FP 精神”,要从实用代码出发;
- 不要堆“黑话”和概念,新手很容易劝退;
- 不要迷信“函数式 > 命令式”这种价值判断。
💡 函数式编程(FP)对我意味着什么?
我曾试着了解很多 FP 语言(Haskell、Elixir 等),最终 对我最友好的是 Racket。它是 Scheme 的超集,保留了简洁,又有强大的工具链(IDE、文档、库)。更重要的是:
- 可以边学边跑代码,不迷路;
- 适合探索 Lambda 表达式、柯里化等“抽象概念”;
- 天然支持 miniKanren 等逻辑编程扩展。
我看了不少 @winter 的 B 站视频,也刷了一些 YouTube 教学,但像 Lambda 演算、柯里化 这类东西,仍然挺难懂。
🧠 我现在的态度是:别急于理解“所有”理论,只要你能写一些表达式、能观察运行结果,你已经在理解 FP 了。
🔠 类型系统:比你想的更重要
类型系统是 PL 理论的重要分支。它不仅是代码检查机制,更是:
- 抽象思维的工具;
- 编译器优化的基础;
- 语言表达能力的边界。
我曾尝试理解 Haskell 的类型系统,虽然吃力,但它让我意识到“类型不仅是限制,更是设计语言的方式”。
🧪 从 Scheme 到 Racket,到逻辑编程
Racket 很适合入门逻辑编程(Logic Programming)。尤其是:
- miniKanren:轻量级逻辑 DSL,Racket 生态中可直接实践;
- Prolog:更重型但系统化,有完整教材,也值得了解。
比较下来:
项目 | Prolog | miniKanren |
---|---|---|
上手难度 | 高 | 低 |
文档资源 | 丰富 | 逐步增加 |
适合谁 | 专研 AI / NLP | 学习语言结构的人 |
推荐语言 | 原生 Prolog | 嵌入 Racket |
如果你已能写一些 Racket 代码,不妨试试 miniKanren,哪怕只实现几个反向查询,也能帮你理解“逻辑编程”到底在干嘛。
📚 学习路线推荐
结合我的摸索过程,这里给出一个 PLT 的入门路径,仅供参考:
- 理解 PL 与编译器的区别(见本文开头)
- 选择 Racket 入门 FP 与表达式结构
- 了解 Lambda 表达式 / 柯里化 / 组合子
- 学习类型系统:Haskell / Racket 的类型构建
- 挑战逻辑编程:miniKanren / Prolog
- 可选:实现一个小解释器,加深理解语言语义
🔗 推荐资源
🧩 总结:PLT 是一条长期路线
这是一条深且慢的路。
学 PLT 并不能立竿见影,但它会让你:
- 更懂语言设计的本质;
- 编程视角更抽象化;
- 思考问题更系统。
对我而言,FP 不再是“高级黑话”,PLT 不再只是“象牙塔”,而是一种 渐进而深刻的计算认知方式。