/magpie-language-design

语言设计教程(献给想学语言设计的朋友)

Primary LanguageGoMIT LicenseMIT

语言设计

初衷

建立这个仓库的想法/初衷,是为了给下面这些编程爱好者提供一个学习语言的场所:

  1. 想学语言设计的初学者
  2. 有一定经验的编程经验者

开始有想法写这个的时候,准备写个20篇就差不多了,结果越写越多,不知不觉篇数翻倍了。

说实话,来来回回写了差不多半年时间,花费了大量的业余时间。目的很单纯,就是希望通过 自己的微薄之力,能够给那些希望进步,希望学习语言设计的程序猿提供一些关于语言设计的资料。

目的

通过这一系列文章的学习,读者能够了解到语言设计并不是一个令人晦涩难懂的东西。 如果通过本系列的学习,读者能够设计自己的语言,本人会感到非常欣慰。

原则

当时写这一系列文章的时候,我就给自己定了一个规则,我不会去讲一些深奥的逻辑, 而是希望用最浅显的语言来阐述一些内容。

语言

本系列文章采用go语言进行讲解,因此读者在阅读之前,最好能够掌握一些go语言的基础。 但是如果你没有go语言的基础,看懂讲解的内容应该也不会很困难。

参照

市面上有很多语言设计方面的书籍,同时从网上也能够找到很多语言设计方面的资料。 我个人比较喜欢的是:

  1. Crafting Interpreters(https://craftinginterpreters.com/)
  2. Let's Build A Simple Interpreter(https://ruslanspivak.com/lsbasi-part1/)

但是由于它们都是英文的,所以有些读者读起来可能会感到比较吃力。

运行

每篇文章对应的代码目录下都有一个run.sh文件,只需要运行这个文件即可。

内容

先声明一下,本系列教程设计的语言,使用的是基于【树遍历解释器(Tree walking interpreter)】的,且本系列不涉及虚拟机(Virtual Machine)及字节码等相关知识。 文章中的很多内容是基于Thorsten Ball的书籍《Writing an interpreter in go》。

我们将从实现一个简单的计算器开始,一步一步实现一个功能丰富的脚本语言。

每一篇文章的代码都对应一个目录(编号从1开始),讲解文章放在doc目录下。所有的文章(markdown格式)都是使用typora编写的。 使用typora的好处是,它可以将其生成pdf或者html文档。当然如果读者需要,我可以将生成的pdf/html文档发给读者。

里面的有些章节可能比较难懂(例如和go语言交互那一篇),读者完全可以略过不看,直接读取下一篇文章。

对于每一篇所新增加的内容,读者可以使用比较工具,来查看新增的代码逻辑。

下面是目录(中文文档见doc目录):

  1. 简单计算器
  2. 识别标识符(identifier)
  3. true, false和nil支持
  4. Let语句支持
  5. Scope(作用域)
  6. 追加对let语句和标识符的解释(Evaluating)
  7. 运行期错误处理(Run-Time error handling)
  8. return语句支持
  9. 块语句支持
  10. 字符串表达式支持
  11. 函数支持
  12. 内置(Built-in)函数支持
  13. if-else判断支持
  14. 取反(!)支持
  15. 数组(Array)支持
  16. 哈希(Hash)支持
  17. 方法调用(Method Call)支持
  18. 后缀表达式(++、--)支持
  19. 赋值表达式(=)支持
  20. 元祖(Tuple)支持
  21. 命名函数(Named function)支持
  22. 与浏览器交互支持
  23. for循环支持
  24. while和do循环支持
  25. 多重赋值(multiple assignment) & 多重返回值(multiple return)
  26. printf函数支持
  27. 逻辑与(&&)、逻辑或(||)支持
  28. import支持
  29. 重写main函数
  30. 正则表达式(regular expression)支持
  31. go语言交互
  32. Panic, panic, panic...
  33. file内置对象支持
  34. os内置对象支持
  35. struct支持
  36. switch-case支持
  37. try-catch-finally支持
  38. 匿名函数支持
  39. 链式比较操作符支持
  40. in操作符支持
  41. 范围操作符(..)支持
  42. 变参函数(Variadic Functions)支持
  43. 复合赋值运算符(+=, -=, ...)支持
  44. 真正意义上的多重赋值
  45. 尾递归调用优化(Tail Recursive Call Optimization)
  46. 字符串变量内插支持
  47. 函数装饰器(Decorator)支持
  48. 命令执行(Command Execution)支持
  49. 增强哈希(Enhanced Hash)支持
  50. 管道操作符(|>)支持
  51. 有序哈希(Ordered Hash)支持
  52. 单一执行文件(single standalone exe)支持
  53. 标准库(standard library)支持