在过去六个月,我一直在致力于开发一门叫 Pinecone 的编程语言。我还不能说它已经成熟了,但是它在使用中已经拥有足够多(编程语言)的特征,例如:
变量
函数
用户定义的结构体
如果你有兴趣,可以看看 Pinecone 的引导页(landing page)或者它的 GitHub repo。
我不是一个专家。当我开始这个工程的时候,我对我所做的事情还没有方向,但我还是没有放弃。我在语言创建上的级别为0,只是读了一点点在线的资料,也没有遵循我给出的那些建议。
不过,我还是制造了一个完整的新语言。并且它能工作。所以我一定做了正确的事情。
在这篇文章中,我将深入展示管线 Pinecone (以及其他编程语言)把源码变成魔法。
我也会谈谈我已经做出的一些权衡,以及为什么我会做出那些决定。
这绝对不是制作编程语言的完整教程,但是如果你对语言开发感到好奇,那么这是一个好的开始。
“我都不知道我该从哪里开始”,当我告诉其他开发人员我在写一门语言时,我通常会得到这样的回应。如果听后的反应也是这样,我现在将通过一些已经尝试过的决定和步骤,来告诉你如何开始一门新语言。
语言主要有两种类型:编译型和解释型:
编译器会计算出一个程序将执行的操作,将其转换为“机器代码”(计算机可以运行的格式,非常快),然后保存以便稍后执行。
一个解释器逐行逐步执行源代码,弄清楚它在做什么。
技术上,任何语言都可以被编译或解释,但是一种或另一种语言通常对于特定语言更有意义。一般来说,解释往往更加灵活,而编译往往具有更高的性能。但这只是解决复杂问题前的预热。
我高度重视性能,我看到缺乏高性能和简单性的编程语言,所以我去编译了 Pinecone。
这是需要今早确定的重要决定,因为很多语言设计决策受到它影响(例如,静态类型对于编译型语言来说是一个很大的好处,但对于解释型语言而言并不是那么重要)。
尽管 Pinecone 是按照编译型设计,但它也有唯一一个可运行的,功能完整的解释器。原因我稍后会解释。
我知道这有点像是一个元数据,但编程语言本身就是一个程序,因此你需要用一种语言编写它。 我选择了 C++ ,因为它的性能和庞大的功能集。此外,我其实很喜欢使用 C ++ 工作。
如果你正在编写一种解释性语言,那么在编译语言(如 C、C ++ 或 Swift )中编写将是非常有意义的,因为你的解释型语言中的性能损失及其对应的解释器将会更加复杂。
如果你打算编译,较慢的语言(如 Python 或 JavaScript )是更为可接受的。编译时间可能很糟糕,但在我看来,运行时间差别不大。
一门编程语言通常被构造为一类管线。也就是说,它通常拥有几个阶段。每个阶段的数据都会以明确的方式被格式化。还具有将数据从这一阶段转换到下一个阶段的功能。
第一个阶段是一串包含了整个输入源文件的字符串。最终阶段是可以被运行的东西。我们逐步完成 Pinecone 管线的时候,这一切就会变得清晰起来。
大多数编程语言的第一步是词法分析或分词。 “Lex” 是词法分析的缩写,这是一个非常棒的词,是将一大堆文本分解成多个符号。 “tokenizer” 这个词更有意义,但是,“词法分析”说起来很有趣,因此我经常使用它。
标记或记号是语言的一个单元。标记可能是一个变量或函数名(也叫标识符),也可能是一个操作符或数字。
词法分析器将包含源码的文件作为输入字符串,输出包含标记符号的列表。
流水线(就是编译过程)后面的阶段将不再参考这些字符串源代码,所以词法分析器必须产生所有后面各阶段需要的信息。之所以会有这样相对严格的格式设计,是因为这个阶段词法分析器可以做一些工作,比如移除注释或检测标识符或数字等。如果你将这些逻辑规则放在词法分析器里,那么在构造语言的其它部分时就不必再考虑这些规则了,而且你可以方便地在同一个地方集中修改这些语法规则。
我开始开发这个语言,第一件事情就是写了一个简单的词法。不久之后,我开始学习可以让词法更简单正确的工具。
这个小工具就是 Flex ,一个生成词法的程序。你传入一个具有特定格式来描述语言语法的文件。它会生成一个 C 语言语法的程序代码。
我选择暂时保留最初写的词法分类器。因为到最后我没有看到 Flex 的明显优势,至少不能达到添加依赖和完成复杂构建。
我的词法分类器只有几百行代码,几乎没有什么问题。迭代我的词法分类器也给了更多的灵活性。例如在不编辑多个文件的情况下向语言添加操作符。
管线流程的第二阶段就是语法分析器。语法分析器把标识符列表解析为一个带结点的树。用于存储这种数据的树称为抽象语法树,即 AST 。 最后在 Pinecone 的抽象语法树中不会包含任何标识符类型信息,它就是一个简单的结构化的标识符。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务