将Java程序转换为另一种语言的困难(反之亦然)

将Java程序转换为另一种语言的困难(反之亦然),java,code-translation,Java,Code Translation,有什么简单的Java做不到的,可以用类似的语言来做,或者用类似的语言来做 假设你有一个X语言的软件,你把它完全重写成Java(或者反过来),有哪些小事情会严重阻碍翻译 起初,我考虑的是理解或多个出口循环,但这些都很容易重写为for_each循环,分别使用if语句和局部变量 也许有例外?但是哪种语言没有类似的结构? 多态性?但我不明白我怎么能在几行字里表现出来 我正在寻找一个简短而甜蜜的例子,它会让你头疼不已 编辑 关于相似性要求存在一些问题。我认为我无法更好地解释它,因为这是一个非常理论化的问题

有什么简单的Java做不到的,可以用类似的语言来做,或者用类似的语言来做

假设你有一个X语言的软件,你把它完全重写成Java(或者反过来),有哪些小事情会严重阻碍翻译

起初,我考虑的是理解或多个出口循环,但这些都很容易重写为for_each循环,分别使用if语句和局部变量

也许有例外?但是哪种语言没有类似的结构?
多态性?但我不明白我怎么能在几行字里表现出来

我正在寻找一个简短而甜蜜的例子,它会让你头疼不已

编辑

关于相似性要求存在一些问题。我认为我无法更好地解释它,因为这是一个非常理论化的问题。这样做的目的是为了防止批评人士因为语言的差异而马上否定答案


例如,我特别喜欢,尽管Lisp是一种非常不同的语言,但它的构造似乎类似于Java异常,但有一个无法翻译的扭曲。在C/C++、Fortran、甚至Ruby中使用类似的语言会更好。

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

也就是说,我认为Java中完全缺乏列表理解和其他功能概念。例如,惯用的Haskell解决方案可以:


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

C没有异常的概念,但是您可以使用setjmp。幸运的是C++有例外。我认为从Java到C的任何东西都是粗糙的(另一方面,没有那么多……尽管函数指针让一些人绊倒了)。GOBEXT已经在C中使用,在C中做OO,但实际上,如果你想要OO,使用C++。

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

此外,从Java到C/C++需要程序员进行一些内存管理。您可以使用boost shared_ptr,但它不一样,而且您仍然存在周期性依赖的问题。考虑双向树,其中有循环引用子/父。您需要在其中一个方向使用弱_ptr w/boost,以确保正确清理东西

我在找一个又短又甜的 举个例子,这会给我们带来一些严重的问题 工作时头痛

您正在寻找一个简单的示例,说明在一种语言中很琐碎但在Java中很难做到的事情

这个内联程序集的一行如何(在C程序中)

祝你好运,爪哇先生;)

这个呢:

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

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

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

我喜欢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);
         }
      }
   }

这是使用反射来构造<代码>类< <代码> >代码>字符串> <代码>,这不转化为C++。

这是一个技巧问题:如果你识别出这样的特性,那么这意味着其他语言毕竟不是“相似的”!p> 但是如果你放宽相似性要求,对我来说最明显的就是条件。在公共Lisp中,条件类似于更灵活的异常形式。您可以调用一个函数,该函数表示一个条件(比如抛出一个异常),但调用方随后可以说“继续并继续”。在Java中,一旦抛出异常,就真的无法在抛出时继续执行


(我知道我也可以说“宏”,但这是CL的一个领域,可以说与Java根本不相似。)

注意,当然,您可以编写一些JNI或Runtime.Exec一些exe或诸如此类的东西。关键不是这件事做不到。关键是,因为它是低级黑客,而Java没有提供低级黑客工具,所以在Java中低级黑客是一个巨大的痛苦:在这里只需要一行C代码,在Java中就需要很多代码和技巧。例如,用Java编写设备驱动程序可能不是一个非常明智的想法,他指定了一种类似于Java的语言。汇编语言并非如此。@steve emmerson C与Java相似,至少在语法方面是如此,而C提供了内联汇编的功能,这在Java中很难实现。因此@wizardofods在这方面是正确的。换句话说,困难的不仅仅是这个特定的程序集,相比之下,它是一般的程序集。函数式语言与Java并不“相似”。@steve emmerson许多语言在提供函数功能的同时仍然与Java相似。例如,JavaScript、Groovy和Scala,其中类似的功能需要Java中大量的样板代码,但这些都是其他语言简单易懂的功能。尽管如此,lambdaj在这方面帮助了Java。这不只是一个for和if吗?@NomeN:不,不完全是。一个if,两个
表示
s,如果我没弄错的话,还有一个递归方法。另见@Steve Emmerson:对不起,忽略了“相似”一词。但是@nicerobot有一个很好的观点。我想将C#添加到他的示例列表中。在Java中,使用真正的参数化多态性进行构造比较困难,因为在Java中,最接近参数化多态性的是Java泛型。由于类型擦除,它们不能很好地处理MI:您不能同时实现可处理和可处理。根据定义,您应该很容易将“类似”语言转换为Java或vise v
typedef union {
    struct rgba {
        unsigned char r, g, b, a;
    }
    uint32 packed;
} unpacker;

unpacker x;
x.packed = some_input();
return x.a;
   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);
         }
      }
   }