如何将算法导出到其他语言?

时间:2009-08-13 02:22:11

标签: algorithm

我正在研究的项目涉及3个不同的系统/平台。 C#,Java和XSLT。我有一些简单的算法(只是一堆条件),用伪代码表示如下:

 if inputParameter1 is equal to 1
    return "one"
 else if inputParameter2 is equal to 5
    return "five" concatenated with inputParameter1
 else
    return "not found"
像这样简单的东西。

我正在试图找出一种机制:

  1. 让我写一次算法
  2. 能够以每个系统的本机语言(C#,Java和XSL)执行算法
  3. 在更新算法时,让每个系统(C#,Java和XSL)始终使用最新版本的算法。
  4. 所以详细说明我的例子,C#表示将是:

        public string TheMethod(int inputParameter1, int inputParameter2)
        {
           if (inputParameter1 == 1)
           {
              return "one";
           }
           else if (inputParameter2 == 5)
           {
              return string.Concat("five", inputParameter1.ToString());
           }
           else
           {
              return "not found";
           }
        }
    

    ,XSLT表示将是:

    <xsl:template name="TheMethod">
      <xsl:param name="inputParameter1" />
      <xsl:param name="inputParameter2" />
      <xsl:choose>
        <xsl:when test="$inputParameter1 = 1">
          <xsl:text>one</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:choose>
            <xsl:when test="$inputParameter2 = 5">
              <xsl:text>five</xsl:text>
              <xsl:value-of select="$inputParameter1" />
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>Not Found</xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    
    希望你明白了。

    我如何以通用方式表达算法并能够自动将其转换为C#,Java或XSL?

    谢谢!

    -Mike

3 个答案:

答案 0 :(得分:4)

嗯,对此的“回答”是DSL,或者只是一些常见的标记,然后你可以渲染(有趣的是,你可以用XSLT做到这一点)。

但一般情况下,恕我直言,实施此操作并不值得,取决于您的算法有多复杂以及您将编写多少这些算法。

答案 1 :(得分:1)

更普遍地看一下这个问题,你的目标是只有一个权威的算法版本(即“不要重复自己”原则)。

更简单的解决方案是选择一种语言(可能是XSL)来实现算法,而不是尝试自动翻译/导出到不同的编程语言。然后在C#和Java中使用一些XSL工具直接执行算法,传入你喜欢的任何参数。我之前没有这样做,但我认为可以使用正确的第三方工具(而​​我怀疑你可以反过来做,从XSL中执行Java或C#,这就是为什么XSL是最好的选择对于“基础”语言。)

答案 2 :(得分:0)

这不会产生源代码,但它可以在几乎没有编码的情况下以各种语言使用逻辑:

写一个这样的简单xml:

...
<case>
   <InputParam1>1</InputParam>
   <InputParam2>NULL</InputParam>
   <answer>one</answer>
</case>
...

然后解析它,并将其存储在字典/ map / whatever-the-language-or-framework-has-for-hashtables中。因此,将inputparams存储为键(也许作为sturct),您可以非常快速地得到答案。对于在返回值中使用参数本身的情况(如“concat part”中的示例),我会对数据使用一些特殊语法,如

...
<answer>five$inputparam1$</answer>
...

值得一提的是,您遇到的特殊情况越多,这种解决方案就越有用。