2024-05-14 00:43:52 发布
网友
我正在用Python(3.x)为一个应用程序编写一个小型的领域特定语言。目前,该语言使用Python的解释器来运行脚本,但我希望能够将代码编译成Python的字节码,以便将其作为普通Python模块导入
有没有什么方法可以实现这一点,而不需要将DSL代码转换成Python语法
要编译成Python的字节码,默认情况下需要两(三)件事:
可针对Python's grammar进行分析的兼容Python代码
如果不是为了使用,那么至少要与AST进行比较,如果生成正确,如果缺少什么,等等
(1.5)将DSL拆分为抽象语法树(AST)-这是Python在运行(即,甚至导入)代码/文件时默认执行的操作
您可以做的是将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所以tar和grep -r '<keyword [keyword ...]> <file or folder>是你在这里的助手
tar
grep -r '<keyword [keyword ...]> <file or folder>
要编译成Python的字节码,默认情况下需要两(三)件事:
可针对Python's grammar进行分析的兼容Python代码
如果不是为了使用,那么至少要与AST进行比较,如果生成正确,如果缺少什么,等等
(1.5)将DSL拆分为抽象语法树(AST)-这是Python在运行(即,甚至导入)代码/文件时默认执行的操作
您可以做的是将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所以
tar
和grep -r '<keyword [keyword ...]> <file or folder>
是你在这里的助手相关问题 更多 >
编程相关推荐