Dns 如何在另一种语言的基础上开发特定于领域的语言?

Dns 如何在另一种语言的基础上开发特定于领域的语言?,dns,dsl,Dns,Dsl,假设我发现了一个用python编写的好的开源软件/库。我想把我创建的一些函数或方法包装成我自己的易于理解的语言 do porter_stem(DOC)(DSL)将等同于用python编写的函数或一系列方法 我想创建一个易于学习的DSL,但需要将此DSL翻译成原始的开源软件 我不确定我是否清楚,但我的意图是: 创建一种易于学习的代码语言,用户可以使用它来解决特定领域的问题 这种简单的语言需要通过一些中间件翻译、编译或解释为原始的开源软件语言(python) 通常,DSL的基本语法与其宿主语言相同,

假设我发现了一个用python编写的好的开源软件/库。我想把我创建的一些函数或方法包装成我自己的易于理解的语言

do porter_stem(DOC)(DSL)将等同于用python编写的函数或一系列方法

我想创建一个易于学习的DSL,但需要将此DSL翻译成原始的开源软件

我不确定我是否清楚,但我的意图是:

  • 创建一种易于学习的代码语言,用户可以使用它来解决特定领域的问题
  • 这种简单的语言需要通过一些中间件翻译、编译或解释为原始的开源软件语言(python)

  • 通常,DSL的基本语法与其宿主语言相同,只是扩展了该语言的功能。因此,您的所有内容仍然是用Python编写的,它只是带有一些特定于域的函数、变量等的Python

    我在DSL方面的经验主要是Lisp语言家族。在这里,典型的DSL可以用宏实现,宏生成特定于DSL的代码模式。(加上与DSL相关的功能)。关键是,尽管宏和函数可以扩展该语言的功能,但它们仍然是用该语言实现的


    我想你可以更进一步,用Python编写一个解释器——但在那里你仍然可以免费获得Python的可运行性,因为你的解释器可以将你的自定义语言翻译回Python。

    用Python编写你的DSL语法和语法分析器,例如,使用(比传统的lexx-yacc方法更简单)--解析器可以生成语义上有意义的节点树,然后您可以(更简单地)遍历该树并对其进行解释,或者(稍微简单一点)遍历该树并生成等效的Python代码。这就是我建议的大多数宿主语言的方法。一些宿主语言(主要是Lisp和Scheme)具有强大的宏,因此在这些语言中,用宏构建DSL更为常见

    将您的DSL嵌入宿主语言基本上意味着您不是真正在做DSL,而是在做一个更传统的框架,因此这确实是一种不同的方法(可能更强大,但对于非程序员来说可能不那么容易学习;-)