0

同様の言語で実行できる、またはその逆の単純なJavaでは実行できないことはありますか?

言語Xのソフトウェアがあり、それを完全にJavaに(またはその逆に)書き直したとしましょう。翻訳を深刻に妨げる小さなことは何ですか?

最初は、内包表記または複数の終了ループについて考えていましたが、これらは、それぞれifステートメントとローカル変数を使用したfor_eachループで簡単に書き直すことができます。

多分例外?しかし、どの言語に同様の構造がありませんか?
ポリモーフィズム?しかし、それを数行でどのように示すことができるかわかりません。

私は短くて甘い例を探しています。それは回避するのに深刻な頭痛の種になるでしょう。

編集

類似性の要件に関していくつかの問題があります。非常に理論的な質問なので、これ以上説明できないと思います。言語が非常に異なるため、批評家が手に負えない答えを却下するのを防ぐことが目的でした。

たとえば、私は特にLisp条件の答えが好きですが、Lispは非常に異なる言語ですが、構造はJavaの例外に似ていますが、翻訳できないひねりがあります。C / C ++、Fortran、Rubyでさえ、そのようなものはさらに良いでしょう。

4

6 に答える 6

4

私は短くて甘い例を探しています。それは回避するのに深刻な頭痛の種になるでしょう。

1つの言語では簡単で、Javaでは実行が難しいものの簡単な例を探していますか?

このインラインアセンブリのワンライナー(Cプログラム内)はどうですか?

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

頑張ってジャワさん;)

于 2010-04-11T16:25:08.420 に答える
3

通常、1:1の翻訳を試みることはありません。言語ごとにイディオムが異なるため、同じアルゴリズムまたはプログラム構造を別の言語で「適切に」書き直すと、見た目が大きく異なる場合があります。

そうは言っても、リスト内包表記やその他の機能概念はJavaにはまったく欠けていると思います。たとえば、この質問に対する慣用的なHaskellソリューション:

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

これを実装するには、Javaでさらに多くの行が必要になります。それは、Javaがどのように機能するかについて頭を悩ませた後でのみです。

于 2010-04-11T16:17:12.067 に答える
1

Cには例外の概念はありませんが、setjmpを使用できます。ありがたいことに、C++には例外があります。JavaからCまでは大雑把だと思います(逆に言えば、それほど多くはありません...関数ポインタが数人をつまずかせましたが)。GObjectはCでOOを実行するためにCで使用されてきましたが、実際には、OOが必要な場合は、C++を使用してください。

Javaから別の言語に移行するときに本当に得られるのは、Javaが提供するライブラリサポートです。当たり前のことはたくさんあります。

また、JavaからC / C ++に移行するには、コーダーがメモリ管理を行う必要があります。boost shared_ptrを使用することもできますが、それは同じではなく、循環的な依存関係に問題があります。子/親への循環参照がある双方向ツリーについて考えてみます。ブーストのある方向の1つで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;

OK、それでも簡単かもしれません。しかし、リフレクションを使用するJavaコードを他のものに変換してみてください。特にリフレクションを使用してクラスをオンザフライで生成する場合...

于 2010-04-11T16:36:56.683 に答える
1

私は、Javaに正確に変換されないC /C++のコードに対してBendlasによって提供されたユニオンの例が好きです。逆の例:

   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++に変換されないClassからを構築します。String

于 2010-04-11T16:43:20.427 に答える
1

これはトリックの質問です。そのような機能を特定した場合、それは他の言語が結局「類似」していなかったことを意味します。

しかし、類似性の要件を緩和すると、私にとって最も明白なものは条件になります。Common Lispでは、条件はより柔軟な形式の例外のようなものです。条件(例外のスローなど)を通知する関数を呼び出すことができますが、呼び出し元は「先に進んで、とにかく続行する」と言うことができます。Javaでは、例外がスローされると、スローした時点で実行を継続する方法は実際にはありません。

(私も「マクロ」と言えることは知っていますが、それはおそらくJavaとはまったく似ていないCLの領域です。)

于 2010-04-11T17:31:08.013 に答える