自制编程语言之前言

279 阅读3分钟

序言

在开始本系列教程之旅前,首先请确保你做到以下几点:

  1. 有足够的耐心
  2. 有足够的信心
  3. 不要半途而废

如果做不到以上几点,那么在继续阅读之前,我建议你还是好好考虑一下。因为即使继续下去,可能也达不到你想要的结果,这既浪费了我的时间,也浪费了你的时间。

初衷

关于语言设计,网络上也有不少相关的技术文章,但是看了之后,很多达不到我想要的效果。因此,我就思考是不是能够自己也写一个关于语言设计的系列文章。目的一方面是为了巩固自己的知识,另一方面也希望帮助更多的人,这也成了我写此系列文章的初衷。

对于一些人来说,在他们的思维里(当然这也包括我学语言设计之初),设计一种语言,可能认为是一件很困难的事情,而且必须要学习一些深奥的知识,一定是相当枯燥乏味的。

而事实上并非如此,如果你掌握了一些必要的知识,并能够熟练掌握,那么,你会发现设计一门语言,其实是很有趣,也很充满挑战的。

为了使这个系列教程能够让那些从来没有接触过相关知识的人也能够很容易的理解,我将会用尽量简单易懂的方式给大家阐述相关的概念,同时不会引入一些高深的理论知识。如果读者希望继续学习更深入的知识,可以参考相关的书籍。

本系列教程设计的语言,使用的是基于【树遍历解释器(Tree walking interpreter)】,且本系列不涉及虚拟机(Virtual Machine)及字节码等相关知识,文章中的很多内容是基于Thorsten Ball的书籍《Writing an interpreter in go》,也在此基础上有了不少新的扩展。我希望采取与作者不同的写作策略,目的是为了让读者更容易理解相关内容。

强烈建议大家看一下Thorsten Ball的书籍《Writing an interpreter in go》。

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

说了这么多跟语言设计没有太大关系的话,相信你已经迫不及待了,那么现在,就让我们开始踏入学习语言设计的殿堂吧!(有的人认为是地狱😄)

此系列文章采用go语言作为主要编程语言,每个语言都有一个名字,暂定就叫magpie

目录

下面是此系列教材的大致内容:

简单计算器实现(calculator)

识别标识符(identifier)

增加布尔型(Boolean)和nil类型

let语句(statement)

作用域(scope)

解析简单的let语句和标识符

解析阶段的错误处理

返回(return)语句

块(block)语句

增加字符串支持

函数(function)支持

内置函数(built-in function)

if-else表达式

字符串比较支持

增加逻辑非(!)支持

数组(Array)和数组索引(Array index)

更多的内置函数支持

哈希(Hash)

方法调用(method call)

循环支持(开篇)

赋值(=)支持

元祖(Tuple)支持

浏览器运行(wasm支持)

for循环

do/while循环

增加多重赋值(multiple assignment)和多值返回(multiple return)支持

增加printf支持

逻辑与(&&)和逻辑或(||)支持

导入(import)支持

正则表达式支持

调用go语言模块的方法及变量

异常,异常,异常。。。

内置文件对象支持

内置os对象支持

结构(struct)支持

switch支持

try-catch-finally支持

匿名函数(Lambda)支持

链式比较操作符(a < b < c)支持

in操作符支持

范围(..)操作符支持

可变参数支持

复合赋值运算符(+=, -=等)支持

真正意义上的多重赋值

尾递归调用优化(Tail Recursive Call Optimization)

字符串变量内插(Interpolated String variable)

函数装饰器(Decorator)

命令执行(Command Execution)

增强哈希(Enhanced Hash)

管道操作符(|>)支持

有序哈希(Ordered Hash)

单一执行文件(single standalone exe)

标准库(standard library)支持

本系列所有的教程都放在gitee.com/fenghai_hhf… 仓库中,每一个目录都对应一节文章的所有源码。