作为一名程序员,每天使用别人的语言进行开发,你肯定很好奇背后的原理,并且也很想开发属于自己的一门编程语言,那么接下来我就带你从零到一开发属于自己的一个编译器出来,这样你就可以使用自己的编程语言进行开发了。
话不多说,我们直接进入主题。
首先,编译器的开发是建立在已有编程语言的基础上进行编译的转换,比如Python语言也是基于C语言开发的解释器进行运行,所以为了实现我们自己的编程语言的编译,我们需要使用现有编程语言来制作一个编译器。现在让我们创建一个关键字映射表的编译文件compile.js,代码如下:
const { readFile, writeFile } = require('fs/promises')
const MappingTable = {
'函数': 'function',
'打印': 'console.log',
'定义': 'let',
'常量定义': 'const',
'异步': 'async',
'等待': 'await',
'类': 'class',
'实例': 'this',
// ...
}
// 加载自己编写好的程序,后缀可以任意取,只要是你钟意的就行
readFile('main.egg', { encoding: 'utf-8' }).then(res => {
for (let item in MappingTable) res = res.replace(newRegExp(item, 'g'), MappingTable[item])
writeFile('index.js', res)
})
然后就可以开始编写你自己的编程语言了
// 在要被编译的文件main.egg中编写如下代码
函数 demo() {
打印("I am a student. HaHa...")
}
demo()
定义 num = 520
打印(num)
是不是感觉很简单地就实现了我们的编译器?其实我们的编译程序是伪造的,只不过把一些定义关键字的部分进行了键值的映射,通过读入要被编译的文件,然后将其内容中的关键字用映射表的键所对应的值进行替换,最后将内容重新写入到一个目标文件中。最后我们在终端通过如下命令运行“编译程序”并执行编译后生成的目标文件,这样我们就完成了整个『编译』任务啦。哈哈哈...
$ node compile.js && node index.js
实际上我们只是对“源代码”进行了字符串的替换,然后将替换后的代码输出到另一个文件中来运行,但是真正的目的是想让你体验到利用这种小技巧也能够制作一个有趣的“编译器”出来,满足你自己用自己的编程语言写代码的成就感,哈哈😂。一个真正的编译器实现起来需要考虑很多东西,包括词法分析、语法分析、语义分析等等,那些对我们大多数普通人来说是非常困难的,希望这个小技巧能给你的编程带来一些乐趣,嘻嘻😁