【问题标题】:Difficulties of transforming a Java program to another language (or vice versa)将 Java 程序转换为另一种语言的困难(反之亦然)
【发布时间】:2010-04-11 16:10:37
【问题描述】:

有没有什么简单的 Java 不能做而可以用类似的语言来完成,反之亦然?

假设您有一个使用 X 语言的软件,并且您将它完全重写为 Java(或相反),有哪些小事情会严重阻碍翻译?

起初我在考虑推导式或多个退出循环,但这些很容易用分别带有 if 语句和局部变量的 for_each 循环重写。

也许例外?但是哪种语言没有类似的结构?
多态性?但我看不出我怎么能用几行来说明这一点。

我正在寻找一个简短而有趣的例子,它会让人很头疼。

编辑

关于相似性要求存在一些问题。我认为我不能更好地解释它,因为这是一个非常理论的问题。其目的是防止评论家会因为语言如此不同而立即驳回答案。

例如,我特别喜欢Lisp conditions answer,虽然 Lisp 是一种非常不同的语言,但它的结构看起来类似于 Java 异常,但有一个无法翻译的扭曲。在 C/C++、Fortran、Ruby 中使用类似的东西会更好。

【问题讨论】:

  • 使用真正的参数多态性在 Java 中更难做,因为在 Java 中最接近参数多态性的是 Java 泛型。而且由于类型擦除,它们不能很好地与 MI 配合使用:你不能同时实现 Handable 和 Handable
  • 根据定义,您应该很容易将“相似”语言翻译成 Java,反之亦然。你能告诉我们你所说的相似语言是什么意思吗?
  • 编写自修改代码可能很难做到。汇编器可以轻松地做到这一点。

标签: java code-translation


【解决方案1】:

我正在寻找一个又短又甜的 例如,这会给一些严重的 头疼的工作。

您正在寻找一个简单的例子,说明在一种语言中微不足道而在 Java 中很难做到的事情?

这个单行内联汇编(在 C 程序中)怎么样?

static inline void cpuid(int code, dword *a, dword *d) {
  asm volatile("cpuid":"=a"(*a),"=d"(*d):"0"(code));
}

祝 Java 先生好运 ;)

【讨论】:

  • 请注意,当然,您可以编写一些 JNI 或 Runtime.Exec 一些 exe 或诸如此类的东西。关键不是它不能完成。关键是因为它是低级黑客,而 Java 不提供低级黑客工具,所以在 Java 中进行低级黑客是一个主要的痛苦:这里需要一行 C 语言将需要 lot 的代码行和 Java 中的 hooplas。因此,例如,用 Java 编写设备驱动程序可能不是一个非常聪明的主意。
  • 他指定了一种类似于 Java 的语言。汇编语言不是。
  • @steve-emmerson C 至少在语法方面与 Java 相似,而且 C 提供了 Java 中难以实现的内联汇编能力。所以@wizardofodds 在这方面是正确的。换句话说,与之相比,困难的不仅仅是这个特定的组装,而是一般的组装。
【解决方案2】:

通常,您永远不会尝试 1:1 翻译。每种语言都有不同的习语,因此相同的算法或程序结构在用另一种语言“正确”重写时可能看起来非常不同。

也就是说,我认为 Java 完全缺乏列表推导和其他函数式概念。例如,this question 的惯用 Haskell 解决方案:

cart = sequence . map (enumFromTo 0 . subtract 1)

这将需要更多的 Java 代码来实现,而且只有在您已经了解了它的工作原理之后。

【讨论】:

  • 函数式语言与 Java 并不“相似”。
  • @steve-emmerson 许多语言在提供功能能力的同时仍与 Java 相似。例如,JavaScript、Groovy 和 Scala,其中类似的功能需要 Java 中的大量样板代码,但这些其他语言的功能简单且易于理解。也就是说,lambdaj 在这方面帮助了 Java。
  • 这不只是一个for和一个if吗?
  • @NomeN:不,不完全是。如果我没记错的话,一个 if、两个 fors 和一个递归方法。另请参阅stackoverflow.com/questions/2616265/…
  • @Steve Emmerson:抱歉,忽略了“相似”这个词。但是@nicerobot 提出了一个很好的观点。我想将 C# 添加到他的示例列表中。
【解决方案3】:

这是一个棘手的问题:如果您识别出这样的特征,那么它只是意味着另一种语言根本不“相似”!

但如果你放宽相似性要求,对我来说最明显的就是条件。在 Common Lisp 中,条件就像是一种更灵活的异常形式。你可以调用一个函数,它发出一个条件信号(比如抛出一个异常),但是调用者可以说“继续并继续”。在 Java 中,一旦抛出异常,就真的没有办法在抛出点继续执行了。

(我知道我也可以说“宏”,但这是 CL 的一个领域,可以说与 Java 完全不同。)

【讨论】:

  • 到目前为止,您的回答是最好的。 Lisp 确实很不一样,但结构看起来很相似,我得研究一下!
【解决方案4】:

C 没有异常的概念,但您可以使用 setjmp。谢天谢地,C++ 也有例外。我认为 Java 到 C 的任何东西都是粗糙的(另一方面,没有那么多……虽然函数指针已经让一些人绊倒了)。 GObject 已在 C 中用于在 C 中执行 OO,但实际上,如果您想要 OO,请使用 C++。

当你从 Java 迁移到另一种语言时,真正让你受益的是 Java 提供的库支持。有很多东西被认为是理所当然的。

此外,从 Java 到 C/C++ 需要编码人员进行一些内存管理。您可以使用 boost shared_ptr,但它不一样,并且您仍然遇到循环依赖的问题。考虑一个双向树,您可以在其中循环引用子/父。您需要在 w/boost 的方向之一中使用 weak_ptr 以确保事情得到正确清理。

【讨论】:

  • 另外,C++ 的多重继承可能需要解决。
【解决方案5】:

这个呢:

typedef union {
    struct rgba {
        unsigned char r, g, b, a;
    }
    uint32 packed;
} unpacker;

unpacker x;
x.packed = some_input();
return x.a;

好的,这可能仍然很容易;但尝试翻译 java 代码,它使用反射到其他任何东西。特别是如果使用反射来动态生成类...

【讨论】:

    【解决方案6】:

    我喜欢 Bendlas 为 C/C++ 中的代码提供的联合示例,该代码不完全转换为 Java。反过来的例子:

       public class example {
    
          public example(int a, int b)
          {
             ...
          }
    
          public static void main(String args[])
          {
             try {
               Class cls = Class.forName("example");
               Class partypes[] = new Class[2];
                partypes[0] = Integer.TYPE;
                partypes[1] = Integer.TYPE;
                Constructor ct 
                  = cls.getConstructor(partypes);
                Object arglist[] = new Object[2];
                arglist[0] = new Integer(37);
                arglist[1] = new Integer(47);
                Object retobj = ct.newInstance(arglist);
             }
             catch (Throwable e) {
                System.err.println(e);
             }
          }
       }
    

    这使用反射从String 构造Class,这不会转换为C++。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 2013-08-09
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多