代码之家  ›  专栏  ›  技术社区  ›  NomeN

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

  •  0
  • NomeN  · 技术社区  · 14 年前

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

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

    起初,我考虑的是理解或多个出口循环,但它们很容易分别用一个if语句和一个局部变量的for-each循环重写。

    可能是例外?但是哪种语言没有类似的结构呢?
    多态性?但我看不出我怎么能用几行字来表达这一点。

    我在找一个简短而贴心的例子,那会给你工作带来一些严重的头痛。

    编辑

    在相似性要求方面存在一些问题。我认为我不能更好地解释它,因为这是一个非常理论化的问题。其目的是为了防止答案被批评家们唾弃,因为语言是如此的不同。

    例如,我特别喜欢 Lisp conditions answer 虽然Lisp是一种非常不同的语言,但它的结构似乎类似于Java异常,但是它的扭曲不能被翻译。类似于C/C++、FORTRAN、Ruby甚至会更好。

    6 回复  |  直到 9 年前
        1
  •  1
  •   Ken    14 年前

    这是一个技巧问题:如果你确定了这样一个特性,那么它仅仅意味着另一种语言根本就不是“相似的”!

    但是如果你放宽相似性的要求,对我来说最明显的就是条件。在普通的Lisp中,条件类似于更灵活的异常形式。您可以调用一个函数,该函数表示一个条件(比如抛出一个异常),但调用方随后可以说“继续并继续”。在Java中,一旦抛出异常,在投掷点就不可能继续执行。

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

        2
  •  4
  •   SyntaxT3rr0r    14 年前

    我在找一个又矮又甜的 举例来说,这会给一些严肃的 工作时头疼。

    你在寻找一个简单的例子,在一个语言中微不足道,在Java中很难做到。

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

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

    祝你好运,爪哇先生;

        3
  •  3
  •   Community Romance    7 年前

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

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

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

    这将需要Java中更多的行来实现,而且仅此而已。 之后 你已经把你的头绕在它的工作方式上了。

        4
  •  1
  •   NG.    14 年前

    C没有异常的概念,但是您可以使用setjmp。C+有例外,谢天谢地。我认为任何Java到C都是粗糙的(另一方面,不是那么多…虽然函数指针触发了一些人)。GOBEXT已经在C中使用,在C中做OO,但实际上,如果你想要OO,使用C++。

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

    此外,从Java到C/C++需要编码器进行一些内存管理。您可以使用boost shared-ptr,但它并不相同,而且您仍然存在循环依赖性问题。考虑一个双向树,其中循环引用子级/父级。你需要在某个方向上使用弱指针w/boost,以确保正确清理。

        5
  •  1
  •   Bendlas    14 年前

    这个怎么样:

    typedef union {
        struct rgba {
            unsigned char r, g, b, a;
        }
        uint32 packed;
    } unpacker;
    
    unpacker x;
    x.packed = some_input();
    return x.a;
    

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

        6
  •  1
  •   Justin Ardini    14 年前

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

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