2012-03-29 8 views
6

Często piszę kody w MATLAB/Pythonie, aby sprawdzić, czy mój algorytm jest wykonalny (& faktycznie działa). Następnie muszę przekonwertować cały kod na C, a czasem na FORTRAN90.Ręczne tłumaczenie kodu z jednego języka na inny

Jaki byłby dobry sposób na ręczną konwersję kodu średniej wielkości z jednego języka na inny?

Próbowałem:

  • Konwersja cały kod od jednego do drugiego, a następnie testowanie go. (Czasami występują błędy i błędy, które po prostu nie znikną, a znalezienie źródła błędu stanie się problemem)

  • Przejdź linię po linii i sprawdź spójność wyników co kilka linii. (Zbyt czasochłonne)

  • Użyj konwerterów takich jak f2c. (Z mojego doświadczenia wynika, że ​​są bardzo straszne. I odwołuje się do wielu bibliotek, które mają inną funkcję domaga C i Fortran)

także ,:

  • jestem dość obeznany z języki programowania, którymi się zajmuję, więc nie potrzebuję podręczników ani poradników dla mojej pracy (tj. znam składnię).

  • Nie zadaję tego pytania w szczególności na temat MATLAB i C, ale raczej jako paradygmat tłumaczenia.

  • Jeśli chodzi o rozmiar, kody mają mniej niż 100 linii.

  • Nie chcę wywoływać kodu jednego języka na inny. Proszę tego nie sugerować.

+1

Pierwsza opcja wydaje się najbardziej logiczna. Konwersja i testowanie. Konwersja musi się jednak odbywać krok po kroku przeplatana testami jednostkowymi. – ja72

Odpowiedz

7

Różne języki wymagają różnych paradygmatów. Ty zdecydowanie nie pisz i nie projektuj kodu w ten sam sposób np. Matlab, Python, C# lub C++. Nawet hierarchie obiektów zmieniają się bardzo w zależności od języka.

To powiedziawszy, jeśli twój kod składa się z kilku połączonych procedur, możesz odejść od bezpośredniego tłumaczenia liniowego po wierszu (każdy język pozwala ci pisać dwie lub trzy połączone funkcje pozostając idiomatyczną). Ale tak jest tylko w przypadku najprostszych programów.

prototypowania w języku wysokiego poziomu, a następnie wdrożenie ten sam pomysł w solidnej i czystej formie w „produkcji” język jest bardzo dobra praktyka, ale obejmuje dwie bardzo różne rzeczy:

  1. prototyp w cokolwiek język, który chcesz. Przetestuj, eksperymentuj i przekonaj się, że pomysł działa. Zwróć uwagę na duży obraz, nie skupiaj się na wydajności, ale na pomysłach na wysokim poziomie. Zwróć także uwagę na trudności, które napotkasz podczas implementacji, ponieważ napotkasz je ponownie w kroku 2.
  2. Wdrażaj od podstaw ideę w środowisku produkcyjnym w języku X. Będzie to szybsze niż w przypadku, gdy nie wykonałeś etapu prototypowania, ponieważ większość trudności została spełniona na etapie 1. Użyj idiomatycznego X i skup się na poprawności . Zwróć uwagę na przypadki narożne, ogólną niezawodność i jeśli działa poprawnie, wydajność. Zauważysz, że około połowa twojego kodu jest tworzona z nowych rzeczy, które nie pojawiły się w 1. (np. Sprawdzanie błędów, obsługa narożnych przypadków, wprowadzanie/wyprowadzanie, testowanie jednostkowe, itp.).

Widać, że linia po linii tłumaczenia jest oczywiście nie dobrym pomysłem, ponieważ nie przekładają się na tym samym programie.

Również, gdy nie prototypuję, wydaje mi się, że odrzucam pierwszą wersję i robię kolejną, która mi się bardziej podoba, tj. Uważam się za prototypowanie! Wdrożenie tego samego dwa razy nie jest stratą czasu, jest to normalny przepływ rozwoju.

1

Przerwij źródło na kod psuedo z wejściem/procesem/wyjściem, a następnie napisz nową podstawę kodu, aby dopasować ją do specyfikacji.

2

Możesz rozważyć użycie języka o wyższym poziomie dla domeny z wieloma serwerami zapleczowymi (np. Matlab, C, Fortran), tworząc czysty i idiomatyczny kod dla każdego języka docelowego, prawdopodobnie z pewnymi optymalizacjami. Jeśli twoja domena problemowa jest wąska i każdy fragment kodu jest mniej lub bardziej typowy, zaprojektowanie i wdrożenie takiego DSL powinno być dość banalne.

+0

A jeśli nie istnieje, rzuć własną. To nie musi być perfekcyjne od samego początku. Ale wolałbym spędzić kilka godzin, a nawet weekend na nim, niż tylko godzinę, ręcznie tłumacząc kod. Pamiętaj, że przy 10% wysiłku dostajesz 90% rozwiązania. – Ingo

+0

@Ingo, oczywiście miałem na myśli zindywidualizowany DSL. Nie będzie żadnego gotowego do użycia specjalnie dostosowanego do twoich potrzeb. –

+0

Najprawdopodobniej nie, masz rację. OTOH, nigdy nie wiesz w dzisiejszych czasach. – Ingo

Powiązane problemy