2009-07-09 2 views
3

Я унаследовал большое монолитное тело OO Perl-кода, которое необходимо постепенно преобразовать в Java (по запросу клиента). Я знаю оба языка, но я ржавый на своих навыках Perl. Существуют ли какие-либо инструменты (плагины Eclipse?), Которые вы, люди, можете рекомендовать для облегчения боли?Как конвертировать OO Perl в Java?

ответ

1

Я бы сказал, что PLEAC - один из самых больших ресурсов.

8

Использует ли код OO Moose? Если да, можно автоматически конвертировать объявления классов, используя интроспекцию.

Чтобы постепенно преобразовать Perl в Java, вы можете включить Java-код в программу Perl с помощью Inline::Java.

Есть Perl on JVM project, может быть, он может быть использован для компиляции Perl на Java?

1

inccode.com позволяет автоматически конвертировать код perl в java-код. Тем не менее преобразование perl-переменных несколько сложно из-за динамического набора текста в perl. Скалярная переменная в perl может содержать ссылку на любой тип, а реальный ссылочный тип известен при выполнении кода.

Переводчик использует класс VarBox для инкапсуляции всех предопределенных типов: ref (HASH), ref (ARRAY) и BoxModule для инкапсуляции ссылки на Perl-модули.

Пример show perl script, который вызывает два модуля для печати «hello world». Модуль LibConsole создается в скрипте, а к модулю LibPrinter обращается вызов метода LibConsole.

#!/usr/bin/perl 
use strict; 

use test::LibPrinter; 
use test::LibConsole; 

hello_on_console("hello world"); 
hello_on_printer("hello world"); 

    sub get_console 
{ 
    my $console = test::LibConsole->new(); 
    return $console;   
} 

sub get_printer 
{ 
#@cast(module="test::LibPrinter") 
    my $printer = get_console()->get_printer(); 
    return $printer;   
}  

sub hello_on_console 
{ 
    my ($hello) = @_; 

    my $console = get_console(); 
    $console->output ($hello); 
} 

sub hello_on_printer 
{ 
    my ($hello) = @_; 
    my $printer= get_printer(); 
    $printer->output ($hello); 
} 

Переводчик должен теперь типы обоего модулей и в то время как Perl не определяют конкретные операторы для объявления объекта есть предположение, что «новый» возвращает ссылку на модуль метода с именем. Когда метод, возвращающий ссылку на модуль, именован иначе, аннотация аннотации (module = "{class}") может использоваться для информирования переводчика о типе модуля.

Определенный тип переменной будет распространяться, потому что транслятор управляет соответствием типов в назначениях.

 public class hello extends CRoutineProcess implements IInProcess 
{ 
    VarBox call() 
    { 
     hello_on_console("hello world"); 
     return hello_on_printer("hello world"); 

    } 
    BoxModule<LibConsole> get_console() 
    { 
     BoxModule<LibConsole> varConsole = new BoxModule<LibConsole>(LibConsole.apply()); 
     return varConsole; 
    } 
    BoxModule<test.LibPrinter> get_printer() 
    { 
     BoxModule<LibPrinter> varPrinter = new BoxModule<LibPrinter>(get_console().getModule().get_printer()); 
     return varPrinter; 
    } 
    VarBox hello_on_console (VarBox varHello) 
    { 
     BoxModule<LibConsole> varConsole = new BoxModule<LibConsole>(get_console()); 
     return varConsole.getModule().output(varHello); 
    } 
    VarBox hello_on_printer (VarBox varHello) 
    { 
     BoxModule<LibPrinter> varPrinter = new BoxModule<LibPrinter>(get_printer()); 
     return varPrinter.getModule().output(varHello); 
    } 

} 

Для переведенного кода требуется исполняемая библиотека выполнения.

+2

inccode.com больше не доступен. Можно ли это найти где-то в другом месте? – Kai

+0

любое обновление по этому вопросу? –

+0

@Kai любые новости? этого сайта больше нет (сейчас это что-то другое ..) –

Смежные вопросы