Ручной перевод кода с одного языка на другой - PullRequest
6 голосов
/ 29 марта 2012

Я часто пишу коды в MATLAB / Python, чтобы проверить, выполним ли мой алгоритм (и действительно ли он работает).Затем мне нужно преобразовать весь код в C, а иногда и в FORTRAN90.

Что было бы хорошим способом вручную преобразовать код среднего размера из одного языка в другой?

Я пытался:

  • Преобразование всего кода из одного в другой и затем его тестирование.(Иногда бывают ошибки и ошибки, которые просто не исчезают, и поиск источника ошибки становится проблемой)

  • Идите построчно и проверяйте согласованность выходных данных каждыенесколько строк.(Слишком много времени)

  • Используйте конвертеры, такие как f2c.(По моему опыту, они чрезвычайно ужасны. Я ссылаюсь на множество библиотек, имеющих разные вызовы функций для C и Fortran) *

Также:

  • Я достаточно хорошо знаком с языками программирования, с которыми имею дело, поэтому мне не нужны руководства или справочные руководства для моей работы (т.е. я знаю синтаксис).

  • Яне задавая этот вопрос конкретно о MATLAB и C, а скорее как парадигму перевода.

  • Что касается размера, коды имеют длину менее 100 строк.

  • Я не хочу называть код одного языка другим.Пожалуйста, не предлагайте это.

Ответы [ 3 ]

7 голосов
/ 29 марта 2012

Разные языки требуют разных парадигм.Вы определенно не пишете и не разрабатываете код, например, в.Matlab, Python, C # или C ++.Даже иерархии объектов сильно изменятся в зависимости от языка.

Тем не менее, если ваш код состоит из нескольких взаимосвязанных процедур, вы можете отказаться от прямого построчного перевода (каждый язык позволяет вам писатьдве или три взаимосвязанные функции, оставаясь при этом идиоматическими).Но это относится только к самым простым программам.

Создание прототипов на языке высокого уровня, а затем реализация той же идеи надежным и чистым способом на «производственном» языке - очень хорошая практика, но включает в себя дваочень разные вещи:

  1. Прототип на любом языке, который вы хотите.Протестируйте, поэкспериментируйте и убедитесь сами, что идея работает.Обратите внимание на общую картину, фокусируйтесь не на производительности, а на идеях высокого уровня.Обратите также внимание на трудности, с которыми вы сталкиваетесь при реализации, как вы снова столкнетесь с ними на шаге 2.
  2. Реализация идеи с нуля в производственной среде на языке X. Это будет быстрее, чем если бы вы этого не делалисделайте стадию прототипирования, так как большинство трудностей были встречены на стадии 1. Используйте идиоматический X и сосредоточьтесь на правильности.Обратите внимание на угловые случаи, общую надежность и, как только все заработает правильно, производительность.Вы заметите, что примерно половина вашего кода состоит из новых вещей, которые не появились в 1. (например, проверка ошибок, обработка угловых случаев, ввод / вывод, модульное тестирование и т. Д.).

Вы можете видеть, что построчный перевод, очевидно, не хорошая идея, поскольку вы не переводите в одну и ту же программу.

Кроме того, когда я не создаю прототип, я выбрасываю первую версию и создаю другую, которая мне нравится больше, т.е.Я нахожу себя прототипом!Реализация одного и того же дважды - не потеря времени, это нормальный процесс разработки.

2 голосов
/ 29 марта 2012

Вы можете рассмотреть возможность использования специфичного для домена языка более высокого уровня с несколькими бэкэндами (например, Matlab, C, Fortran), для создания чистого и идиоматического кода для каждого целевого языка, возможно, с некоторыми оптимизациями. Если ваша проблемная область узкая и каждый фрагмент кода более или менее типичен, то разработка и внедрение такого DSL должно быть довольно тривиальным.

1 голос
/ 29 марта 2012

Разбейте исходный код на псевдо-код с помощью ввода / процесса / вывода, а затем напишите новую базу кода, соответствующую этой спецификации.

...