Трудности преобразования Java-программы на другой язык (или наоборот) - PullRequest
0 голосов
/ 11 апреля 2010

Есть ли что-нибудь, чего не может сделать простая Java, что можно сделать на аналогичном языке или наоборот?

Допустим, у вас есть часть программного обеспечения на языке X, и вы полностью переписываете ее на Java (или наоборот), какие мелочи могут серьезно затруднить перевод?

Сначала я думал о понимании или нескольких циклах выхода, но их легко переписать с помощью цикла for_each с оператором if и локальной переменной соответственно.

Может быть, исключения? Но какой язык не имеет подобной конструкции?
Полиморфизм? Но я не вижу, как я мог показать это в нескольких строках.

Я ищу короткий и приятный пример, который может привести к серьезной головной боли.

EDIT

Есть некоторые проблемы, связанные с требованием сходства. Я не думаю, что смогу объяснить это лучше, потому что это очень теоретический вопрос. Цель состояла в том, чтобы предотвратить ответы, которые критики отклонили бы из-под контроля, потому что языки очень разные.

Например, мне особенно нравится ответ на условия Lisp, хотя Lisp - это совсем другой язык, конструкция кажется похожей на исключения Java, но с поворотом, который не может быть переведен. Нечто подобное в C / C ++, Fortran, даже Ruby, было бы еще лучше.

Ответы [ 6 ]

4 голосов
/ 11 апреля 2010

ищу короткую и сладкую Например, это дало бы некоторые серьезные головная боль, чтобы обойти.

Вы ищете простой пример чего-то, что было бы тривиально на одном языке и трудно сделать в Java?

Как насчет этого однострочного встроенного ассемблера (внутри программы на C)?

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

Удачи, мистер Ява;)

3 голосов
/ 11 апреля 2010

Обычно вы никогда не будете пытаться переводить 1: 1. Каждый язык имеет разные идиомы, поэтому один и тот же алгоритм или структура программы могут выглядеть очень по-разному, если их «правильно» переписать на другом языке.

Тем не менее, я думаю, что в Java совершенно не хватает понимания списков и других функциональных концепций. Например, идиоматическое решение Haskell для этого вопроса :

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

Для реализации в Java потребуется намного больше строк, и только через после вы поймете, как это работает.

1 голос
/ 11 апреля 2010

Это вопрос с подвохом: если вы идентифицируете такую ​​функцию, то это просто означает, что другой язык не был «похож» в конце концов!

Но если вы ослабите требование сходства, самым очевидным для меня будут условия. В Common Lisp условия похожи на более гибкую форму исключений. Вы можете вызвать функцию, которая сигнализирует об условии (например, выбрасывает исключение), но вызывающий может затем сказать «продолжай и продолжай в любом случае». В Java, если выброшено исключение, на самом деле нет способа продолжить выполнение в точке выброса.

(я знаю, что мог бы также сказать "макросы", но это область CL, которая, возможно, совсем не похожа на Java.)

1 голос
/ 11 апреля 2010

Мне нравится пример союзов, данных Бендласом для кода на 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 из String, который не переводится в C ++.

1 голос
/ 11 апреля 2010

Что по этому поводу:

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

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

Хорошо, это все еще может быть легко; но попробуйте перевести Java-код, который использует отражение на что-то еще. особенно если отражение используется для генерации классов на лету ...

1 голос
/ 11 апреля 2010

C не имеет понятия об исключениях, но вы можете использовать setjmp. C ++ имеет исключения, к счастью. Я думаю, что все, что связано с Java на C, является грубым (с другой стороны, не так много ... хотя указатели на функции запутали несколько человек). GObject использовался в C для выполнения OO в C, но на самом деле, если вы хотите OO, используйте C ++.

Действительно, при переходе с Java на другой язык вы получаете поддержку библиотеки, которую обеспечивает Java. Там много вещей, как само собой разумеющееся.

Кроме того, переход с Java на C / C ++ требует от программиста некоторого управления памятью. Вы можете использовать boost shared_ptr, но это не то же самое, и у вас все еще есть проблемы с циклическими зависимостями. Рассмотрим двунаправленное дерево, где у вас есть циклические ссылки на дочерний / родительский элемент. Вам нужно использовать weak_ptr в одном из направлений с надстройкой, чтобы убедиться, что все убрано правильно.

...