这个小系列将会介绍如何自制一门脚本语言。

主要内容

优劣

自制脚本语言将会有下面的好处:

  • 自己可以对脚本语言的语法,特性进行定制化
  • 可以大概了解别的编程语言是如何运作的。
  • 增强逻辑思维能力。

自制脚本语言将会有下面的坏处:

  • 需要大量的时间进行学习,调试。
  • 做出来的东西往往只是一个玩具。
  • 想要实现一个成熟的脚本语言 很难。
  • 编写脚本的库也需要很多时间。

langX

笔者曾经使用cpp尝试写了一门脚本语言, 目前已经开源。

地址是: https://github.com/Aincvy/langX

本系列将会引用该工程里面的代码和设计思想。不过,有一点需要注意的是,该项目目前还十分的不成熟。

推荐阅读书籍以及其他

两周自制脚本语言

笔者就是看这本书入门的, 但是这本书存在一个很大的方向性问题, 即: 本书并没有使用字节码和VM的方式来实现执行。

不过,还是值得一看的入门书籍。

本书是使用Java作为实现语言的。

深入理解Java虚拟机(第3版)

如果读者是一名JAVA程序员, 那么可以看看这本书, 了解一下jvm的内容。 无论是对于JAVA,还是对于自制脚本语言都有很大的帮助。

https://github.com/lua/lua

这是lua源代码, 也有阅读的价值。

脚本语言的结构介绍

一般情况下, 脚本语言可以划分为几个部分。

  1. 词法分析与语法分析
  2. 类型对象 (数值,字符串,对象,等)
  3. ⭐ 栈 或者 环境
  4. ⭐ 虚拟机 或者 直接执行节点
  5. ⭐ GC部分

其中, 词法分析与语法分析存在一些第三方工具可以使用, 笔者将会在下一篇博文中介绍。

虚拟机 与直接执行节点

语法分析之后会生成一个抽象语法树(Abstract Syntax Tree,AST) , 树里面存在很多个节点。

直接执行节点在初期的时候比较方便, 但是当逻辑越来越复杂,语言特性越来越多的时候,似乎就不是很好用了。 在跳转语句上, 直接执行节点没有虚拟机方便,简单。

虚拟机是使用AST生成一个线性执行的字节码序列, 配合栈一起进行运算。但是初期实现起来可能比较困难。

如果读者想实现一个现代化的脚本语言, 建议你直接使用虚拟机的方式进行实现, 因为这样前期麻烦,但是后期简单。 如果只是想了解一下, 则可以考虑使用直接执行节点的方式。

其他

除了这种方式之外, 还可以考虑使用其他语言做后端进行实现。

比如, 基于JVM的语言有:

  • Groovy
  • JRuby
  • Clojure
  • Scala
  • Kotlin
  • 等等。。

还比如:

这里多聊一下关于LLVM的内容。 这个框架笔者并没有实际使用过,只是有过一些简单的了解。

使用这个框架应该可以直接编译成机器码, 并且llvm会优化你的代码。 感兴趣的读者可以自己尝试阅读下相关文档。