Я собираюсь портировать небольшую библиотеку с Java на Python, и мне нужен совет (небольшой ~ несколько тысяч строк кода). Я немного изучил код Java и заметил некоторые шаблоны проектирования, общие для обоих языков. Тем не менее, определенно присутствовали некоторые идиомы только для Java (синглтоны и т. д.), Которые, как правило, не очень хорошо воспринимаются в мире Python.
Я знаю, что существует по крайней мере один инструмент (j2py), который превратит файл .java в файл .py, пройдя AST. Некоторые начальные эксперименты дали менее чем благоприятные результаты.
Стоит ли мне вообще рассматривать возможность использования автоматизированного инструмента для генерации кода, или языки достаточно разные, чтобы любой инструмент создал достаточно переделок, чтобы оправдать написание с нуля?
Если инструменты - не дьявол, есть ли что-нибудь, кроме j2py, которое может хотя бы обрабатывать управление импортом того же проекта? Я не ожидаю, что какой-либо инструмент сопоставит сторонние библиотеки с одного языка с заменой на другом.




Если бы это был я, я бы подумал о том, чтобы сделать работу вручную. Пара тысяч строк кода - это не так много кода, и, переписав его самостоятельно (а не переводя автоматически), вы сможете решить, как правильно использовать идиомы Python. (FWIW, я работал почти исключительно на Java в течение 9 лет, а теперь я работаю на Python, поэтому я знаю, какой перевод вам нужно будет сделать.)
Взгляните на Jython. Он может довольно легко интегрировать Python поверх Java и предоставлять доступ к библиотекам Java, но при этом позволяет вам действовать с ними динамически.
Вы можете импортировать библиотеки Java и использовать их из сценария Python, так что да, Jython может быть полезен.
Я знаю, что IronPython позволяет использовать модули Python в C#.
В любом случае код всегда лучше во второй раз .... К тому же несколько тысяч строк Java, вероятно, можно перевести на несколько сотен строк Python.
Это зависит от того, насколько активно используется библиотека, насколько хорошо она задокументирована, насколько легко будет протестировать замену. (Например, что, если тяжелые пользователи библиотеки написали код, основанный на дефекте, исправленном вашим рефакторингом?) Переписывание - это тоже мое первое желание, но я часто ошибаюсь.
Автоматические переводчики (f2c, j2py и т. д.) Обычно выдают код, который вы не хотите трогать вручную. Это нормально, когда все, что вам нужно сделать, это использовать вывод (например, если у вас есть компилятор C и нет компилятора Fortran, f2c позволяет вам компилировать программы Fortran), но ужасно, когда вам нужно что-то сделать с кодом впоследствии. Если вы собираетесь использовать это как что-то другое, кроме черного ящика, переведите его вручную. При таком размере это будет не так уж сложно.
Напишу еще раз от руки. Я не знаю каких-либо автоматизированных инструментов, которые генерировали бы не отвратительно выглядящий Python, и, самостоятельно портировав Java-код на Python, я обнаружил, что результат был более качественным, чем оригинал, и значительно короче.
Вы получаете качество, потому что Python более выразителен (например, анонимный внутренний класс MouseAdapters и т.п. заменяется простыми функциями первого класса), и вы также получаете преимущество написания его во второй раз.
Он также значительно короче: например, 99% геттеров / сеттеров можно просто исключить в пользу прямого доступа к полям. Для остальных 1%, которые действительно что-то делают, вы можете использовать property().
Однако, как упомянул Дэвид, если вам никогда не нужно читать или поддерживать код, автоматический переводчик подойдет.
Jython - это не то, что вы ищете в окончательном решении, но будут делает перенос намного более плавным.
Мой подход был бы таким:
Раньше я это делал с большим успехом.
Я использовал Java2Python. Это не так уж и плохо, вам все равно нужно разбираться в коде, поскольку он не все делает правильно, но помогает.
Насколько я понимаю о Jython, я не знаю, поможет ли это. Я пытаюсь пойти в противоположном направлении (взять библиотеку Java и сделать ее доступной для кода Python). Может ли Jython это сделать? Или он просто используется для запуска кода Py поверх Java?