自制脚本语言 - 开篇
这个小系列将会介绍如何自制一门脚本语言。
主要内容
优劣
自制脚本语言将会有下面的好处:
- 自己可以对脚本语言的语法,特性进行定制化
- 可以大概了解别的编程语言是如何运作的。
- 增强逻辑思维能力。
自制脚本语言将会有下面的坏处:
- 需要大量的时间进行学习,调试。
- 做出来的东西往往只是一个玩具。
- 想要实现一个成熟的脚本语言 很难。
- 编写脚本的库也需要很多时间。
langX
笔者曾经使用cpp尝试写了一门脚本语言, 目前已经开源。
地址是: https://github.com/Aincvy/langX
本系列将会引用该工程里面的代码和设计思想。不过,有一点需要注意的是,该项目目前还十分的不成熟。
推荐阅读书籍以及其他
笔者就是看这本书入门的, 但是这本书存在一个很大的方向性问题, 即: 本书并没有使用字节码和VM的方式来实现执行。
不过,还是值得一看的入门书籍。
本书是使用Java作为实现语言的。
如果读者是一名JAVA程序员, 那么可以看看这本书, 了解一下jvm的内容。 无论是对于JAVA,还是对于自制脚本语言都有很大的帮助。
这是lua源代码, 也有阅读的价值。
脚本语言的结构介绍
一般情况下, 脚本语言可以划分为几个部分。
- 词法分析与语法分析
- 类型对象 (数值,字符串,对象,等)
- ⭐ 栈 或者 环境
- ⭐ 虚拟机 或者 直接执行节点
- ⭐ GC部分
其中, 词法分析与语法分析存在一些第三方工具可以使用, 笔者将会在下一篇博文中介绍。
虚拟机 与直接执行节点
语法分析之后会生成一个抽象语法树(Abstract Syntax Tree,AST) , 树里面存在很多个节点。
直接执行节点在初期的时候比较方便, 但是当逻辑越来越复杂,语言特性越来越多的时候,似乎就不是很好用了。 在跳转语句上, 直接执行节点没有虚拟机方便,简单。
虚拟机是使用AST生成一个线性执行的字节码序列, 配合栈一起进行运算。但是初期实现起来可能比较困难。
如果读者想实现一个现代化的脚本语言, 建议你直接使用虚拟机的方式进行实现, 因为这样前期麻烦,但是后期简单。 如果只是想了解一下, 则可以考虑使用直接执行节点的方式。
其他
除了这种方式之外, 还可以考虑使用其他语言做后端进行实现。
比如, 基于JVM的语言有:
- Groovy
- JRuby
- Clojure
- Scala
- Kotlin
- 等等。。
还比如:
- https://github.com/vlang/v v语言会先编译成人类可读的c语言形式文件。
- https://github.com/microsoft/TypeScript TypeScript 是基于JavaScript的一种语言
- https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html 使用LLVM实现你的脚本语言。
这里多聊一下关于LLVM的内容。 这个框架笔者并没有实际使用过,只是有过一些简单的了解。
使用这个框架应该可以直接编译成机器码, 并且llvm会优化你的代码。 感兴趣的读者可以自己尝试阅读下相关文档。