magpie-design

module
v0.0.0-...-3085ebc Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2022 License: MIT

README

语言设计

初衷

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

  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)支持

Directories

Path Synopsis
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL