如何编译一个小型DSL?

2024-05-14 00:43:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python(3.x)为一个应用程序编写一个小型的领域特定语言。目前,该语言使用Python的解释器来运行脚本,但我希望能够将代码编译成Python的字节码,以便将其作为普通Python模块导入

有没有什么方法可以实现这一点,而不需要将DSL代码转换成Python语法


Tags: 模块方法代码脚本语言应用程序字节语法
1条回答
网友
1楼 · 发布于 2024-05-14 00:43:52

要编译成Python的字节码,默认情况下需要两(三)件事:

  1. 可针对Python's grammar进行分析的兼容Python代码

    如果不是为了使用,那么至少要与AST进行比较,如果生成正确,如果缺少什么,等等

(1.5)将DSL拆分为抽象语法树(AST)-这是Python在运行(即,甚至导入)代码/文件时默认执行的操作

  1. Python's compiler to its VM's bytecode

您可以做的是将DSL“编译”(翻译)成AST或适当的Python代码,然后您可以通过调用Python的C API(即使用Python作为C库,而不是将解释器作为二进制调用)使Python解释器(用于代码)或Python编译器(用于AST)做您想做的事情

对于C API start here,但目前我找不到编译器的任何引用,因此以“虚拟”的方式,您可以简单地包括^{}warning),然后利用^{}中的函数(如果它在库中公开)

如果不,则需要手动编译Python(甚至可能对其进行修补),以便公开这些符号并使用它们。但是,这种方法有一个缺点,那就是不使用公共Python的C API可能最终会破坏您的功能(符号可能会更改名称、功能或干脆消失),因此如果选择了这种方法,请编写测试并使用特定的提交,这样您就可以“密封”您使用的版本,并在一段时间后进行提交,运行测试,看看它是否损坏(然后修复)

此外,这是一个混乱的主题,因为没有很多人尝试更改或至少访问默认编译器,但是:

除此之外,请尝试联系CPython和PyPy维护人员:

正如PyPy所做的那样及时编译。但是阿法伊克their code doesn't have pretty interface所以targrep -r '<keyword [keyword ...]> <file or folder>是你在这里的助手

相关问题 更多 >