0

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

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

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

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

我正在寻找一个简短而甜蜜的例子,这会让人头疼。

编辑

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

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

4

6 回答 6

4

我正在寻找一个简短而甜蜜的例子,这会让人头疼。

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

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

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

祝Java先生好运;)

于 2010-04-11T16:25:08.420 回答
3

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

也就是说,我认为 Java 完全缺乏列表推导和其他功能概念。例如,这个问题的惯用 Haskell 解决方案:

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

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

于 2010-04-11T16:17:12.067 回答
1

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

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

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

于 2010-04-11T17:31:08.013 回答
1

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

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

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

于 2010-04-11T16:21:07.733 回答
1

那这个呢:

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

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

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

于 2010-04-11T16:36:56.683 回答
1

我喜欢 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构造 a String,它不会转换为 C++。

于 2010-04-11T16:43:20.427 回答