65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 XML 移植代码

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.76/5 (9投票s)

2007年7月14日

CPOL

4分钟阅读

viewsIcon

44059

通过标准的 XML 模式在不同语言和平台之间移植代码的框架。

引言

本文旨在介绍一个使用 XML 作为转换过程中的中间格式,将源代码从一种语言或平台移植到另一种语言或平台的框架。

背景

这篇文章的构思大概是上周末我思考一些编程和设计相关的事情时产生的。我不知道你,读者,但我在工作和个人项目中已经将不少代码从一种语言移植到了另一种语言。在大多数情况下,我移植代码的原因要么是因为设计/可用性问题(源语言/平台缺乏某种功能),要么是为了支持更广泛的目标受众(他们使用特定的语言或平台,通常是因为方便或他们的技能集)。

移植代码,根据移植到的目标,可能很简单,也可能很复杂。但即使是简单的移植,仍然可能非常繁琐且耗时。而移植到多个目标语言或平台将会成倍地增加这种工作量。这可以通过某种形式的自动化或处理这些问题的工具来缓解。

我不知道市面上是否有好的解决方案,但本文描述了一个可能的解决方案。由于该解决方案的复杂性,没有提供代码或实际示例。本文仅描述了一个尚未实现的理论性解决方案。

代码移植框架

源代码移植过程包含两个步骤:

  1. 将(源语言/平台的)源代码移植到定义的 XML 模式。
  2. 将中间 XML 翻译成目标语言/平台。

因此,该框架包含三个部分:

  1. 将代码转换为 XML 的源语言/平台代码解析器。
  2. 一个 XML 模式,用于定义诸如循环、分支、变量等通用编程语言结构。
  3. 将步骤 1 生成的 XML 转换为目标语言/平台的 XML 解析器。

XML 模式将类似于 XML 的一个子集,如 SVG、XSL 等,这还有待定义(甚至标准化)。

理想情况下,为了使转换工作对用户/开发人员来说简单且标准化,在使用此框架时建议以下几点:

  • 源语言/平台的解析器应使用源语言编写或在源平台构建。这将使用户在需要时更容易修改解析器。
  • 目标语言/平台的解析器应使用 XSLT 编写。由于中间格式是 XML,XSLT 提供了一种最简单、平台无关的方式来解析它。此外,通过 XSL 样式表模板,您可以通过替换占位符部分为目标代码并添加/删除一些 XSLT 代码片段,轻松为每个目标语言/平台生成定制的样式表。

理想情况下,如果这个框架存在(具有定义的 XML 模式和预先构建的解析器),我希望它能覆盖目前大多数通用编程和脚本语言,如 C、C++、C#、Java、JavaScript、Perl、PHP、Python、VBScript、Visual Basic、Visual Basic .NET 等。

虽然我主要考虑使用这个框架在不同语言之间进行移植,但我相信它也可以扩展以支持在 Windows 和 Linux/Unix 等平台之间进行移植,以及从 x86 平台移植到嵌入式平台等。

免责声明:没有一个框架是完美的。我不期望这个框架能够在语言或平台之间提供完美的转换,但它至少可以简化 50%-75% 的代码移植,因为如前所述,大多数代码通常是通用编程结构类型。那些移植不好的部分可以根据需要进行自定义移植。

框架工作原理的理论示例

假设您有以下 VBScript 代码片段:

For i = 1 To 100
    WScript.Echo "Code ran " & i & " times."
Next

使用源解析器运行代码,您应该会得到类似以下的 XML:

<loop type="for">
<condition><var id="i"/><compare type="lessthan"/>100</condition>
<output>Code ran <var id="i"/> times.</output>
</loop>

使用目标解析器(用于 C++)运行代码,您应该会得到类似以下的输出:

for(int i = 1; i < 100; i++)
{
    cout << "Code ran " << i << " times." << endLine;
}

免责声明:这并不是一个完美的代码示例,仅用于说明想法。示例中的 XML 可能不是最优的模式,我只是匆忙想出来的。真正的模式需要花费时间设计和完善。

框架的意图

该框架旨在成为一个平台和语言无关的解决方案,仅依赖于 XML 和 XSLT。源代码解析器和使用 XSLT 处理 XML 的语言/平台选择将由用户决定。

结论

以上就是全部内容,有什么问题或评论吗?我很想和大家一起开发这样一个框架以及相应的代码解析器,但目前我没有时间。所以,我将我的想法发布出来,供大家参考和尝试。

如果有人着手开发这样的框架,请告知我,我很乐意协助这样的项目。

如果这样的框架已经正在进行中或已经存在,请再次告知我。我可能会删除这篇文章,或者这篇文章可能只是提供了该框架的另一种实现方式。

历史

  • 2007 年 7 月 14 日 - 文章初稿。
© . All rights reserved.