是否可以使用通用标记模式在面向对象范例下标记所有编程语言?

时间:2010-07-31 12:16:09

标签: programming-languages metaprogramming code-generation

我计划开发一种工具,将用编程语言 (例如:Java) 编写的程序转换为通用标记语言 (例如:XML) 并且标记代码转换为另一种语言 (例如:C#)

简单来说,它是一种编程语言转换器,可将用一种语言编写的程序转换为另一种语言。

我认为这是可能的,但我不知道从哪里开始。我想知道这样做的可能性以及有关现有系统的信息。

3 个答案:

答案 0 :(得分:3)

这取决于你想要支持的语言,但总的来说这是一个巨大的&除非你打算只支持每种语言的一小部分,否则这项任务很困难。

真正的问题是每种编程语言都有不同的功能(某些区域重叠而其他区域没有)和解决相同问题的不同方法 - 而且检测程序员试图解决的问题非常棘手解决并将其转换为新的习语。 :)考虑一下用不同语言创建的GUI之间的差异......

http://xmlvm.org/为例(一个旨在转换许多不同语言的源代码,具有XML中间点的项目) - 该网站覆盖了他们正在应对的挑战和妥协他们采取,并且(如果你对这类项目仍感兴趣......)请提出更具体的后续问题。

特别注意输出源代码的样子 - 它完全没有可读性,可维护性,高效性等。

答案 1 :(得分:3)

你要做的事情非常困难,但如果你想了解自己的目标,我已经列出了你需要遵循的步骤:

首先是硬位:

  1. 首先,您获取或派生源语言和目标语言的操作语义。

  2. 然后,您可以增强语义以捕获源和目标内存模型。

  3. 然后,您需要在通用操作模型中统一两个增强语义。

  4. 然后,您需要定义源语言到公共运营模式的映射。

  5. 然后,您需要定义从操作模型到目标语言的映射

  6. 正如你在问题中指出的那样,步骤4是微不足道的 第1步很难,因为大多数语言没有指定足够的形式语义;但我建议查看http://lucacardelli.name/TheoryOfObjects.html,因为这是构建传统OO语义的最佳起点 第2步几乎肯定是不可能的,但如果你愿意牺牲一些效率,可能只是非常困难 第3步将取决于步骤1的结果是多么干净,但是从精致,棘手到不可能的任何事情都是如此。
    第5步不会是微不足道的,它实际上是在编写一个编译器。

    最终,由于步骤1和2中继承的困难,您通常不可能做到这一点。但是,如果您愿意:严格限制支持的源语言结构,那么它应该是困难的,但是可行的;几乎忘了正确处理线程;并选择具有足够相似语义的两种语言(即Java和C#都可以,但C ++和其他任何东西都没有)。

答案 2 :(得分:2)

为任何单个语言生成XML在“技术上都很容易”:构建解析器,构造和抽象语法树,并将该树转储为XML。 (我为许多语言构建了现成的工具)。从技术上讲,我的意思是社区知道如何做到这一点(参见任何编译器教科书,例如,Aho& Ullman Dragon书)。我并不是说在努力方面这是一项微不足道的工作,因为真正的语言是复杂而混乱的;已经有很多尝试来构建C ++解析器并且很少有成功。 (我有一个成功的例子,而且做得很好)。

真正困难(我不会尝试做)是根据暴露语言语义的单一模式生成XML。如果没有这个,基本上不可能将泛型 XML中的翻译器编写成任意目标语言。这被称为UNCOL问题,自1958年以来人们一直在寻找答案。我注意到维基百科的文章似乎表明问题已经解决,但自1961年以来,你无法在文献中找到很多关于UNCOL的参考文献。

我见过的最接近的尝试是OMG的“ASTM”模型(http://www.omg.org/spec/ASTM/1.0/Beta1/);它导出XMI,即XML。但是ASTM模型有许多内置的转义,允许它没有完美模型(AFAIK,这意味着每种语言)以任意方式扩展XMI,以便语言特定的信息可以编码。因此,每个语言解析器都会生成XMI的自定义版本,因此每个读者都必须非常了解扩展和完整的通用性。