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:更重型但系统化,有完整教材,也值得了解。

比较下来:

项目PrologminiKanren
上手难度
文档资源丰富逐步增加
适合谁专研 AI / NLP学习语言结构的人
推荐语言原生 Prolog嵌入 Racket

如果你已能写一些 Racket 代码,不妨试试 miniKanren,哪怕只实现几个反向查询,也能帮你理解“逻辑编程”到底在干嘛。


📚 学习路线推荐

结合我的摸索过程,这里给出一个 PLT 的入门路径,仅供参考:

  1. 理解 PL 与编译器的区别(见本文开头)
  2. 选择 Racket 入门 FP 与表达式结构
  3. 了解 Lambda 表达式 / 柯里化 / 组合子
  4. 学习类型系统:Haskell / Racket 的类型构建
  5. 挑战逻辑编程:miniKanren / Prolog
  6. 可选:实现一个小解释器,加深理解语言语义

🔗 推荐资源


🧩 总结:PLT 是一条长期路线

这是一条深且慢的路。

学 PLT 并不能立竿见影,但它会让你:

  • 更懂语言设计的本质;
  • 编程视角更抽象化;
  • 思考问题更系统。

对我而言,FP 不再是“高级黑话”,PLT 不再只是“象牙塔”,而是一种 渐进而深刻的计算认知方式