Есть ли рекомендуемый способ донести научное / инженерное программирование до разработчиков на C?

16

У меня есть много кода MATLAB, который нужно перенести на C (скорость выполнения является критически важным для этой работы) как часть внутреннего процесса для веб-приложения. Когда я пытаюсь передать этот код стороннему разработчику C, я предполагаю (поправьте меня, если я ошибаюсь), немногие разработчики C также понимают код MATLAB (такие вещи, как индексация и управление памятью различны и т. Д.). Интересно, есть ли разработчики C, которые могут порекомендовать мне процедуру, чтобы лучше понять, что делает код?

Например, я должен предоставить код MATLAB и объяснить, что он делает построчно? Или, если я просто предоставлю математику / алгоритм, объясню это простым английским языком и позволю разработчику C реализовать его с этим пониманием по-своему (например, могу ли я предположить, что разработчик понимает, как работать со сложной математикой (то есть воображаемым) цифры), как генерировать гистограммы, выполнять БПФ и т. д.)?

Или есть лучший метод? Я ожидаю, что я не первый, кто должен сделать это, поэтому мне интересно, сталкивались ли какие-либо разработчики C там с этой ситуацией и могли бы поделиться какой-либо общепринятой мудростью, как они хотели бы, чтобы эта задача была передана?

Заранее спасибо за любые комментарии.

gkdsp
источник
3
Вы пытались просто использовать mcc для преобразования кода Matlab в C? я думаю, что этоmcc -c matlabfile.m
Уилл Тейт
4
Когда вы нанимаете программиста, укажите, что он / она должен понимать и код C, и код Matlab. Учитывая ваш акцент на скорости, вы, вероятно, должны использовать C ++ вместо C (хотя с некоторой осторожностью, это никогда не медленнее, а часто и быстрее).
Джерри Гроб
3
@willytate: для этого требуется, чтобы у вас был компилятор Matlab, он не производит особенно эффективный код, и есть некоторые ограничения на то, какой код вы можете компилировать.
Йонас
3
Если вы занимаетесь объектно-ориентированным программированием на C, вы не только лишаете себя возможности заставлять компилятор выполнять дополнительные проверки безопасности типов, вы лишаете компилятор возможности выполнять определенные виды оптимизаций, которые не могут быть легко выражены в C. Кроме того, использование C ++ увеличивает шансы на то, что вы сможете использовать функциональность из библиотеки, написанной кем-то умнее вас.
3
Большую часть времени проводят в реальном алгоритме или в работе с файлами, вводом-выводом и анализом? Среднестатистический C-кодер не сможет писать БПФ и матричный код, который может конкурировать с реализацией MATLAB. Если ваша программа тратит свое время на разбор, ввод-вывод и управление файлами, тогда ваш программист на С должен сосредоточиться на этом и написать связующий код, который вызывает функции из библиотек MATLAB. Если решение проблемы БПФ / матричной декомпозиции / ОДУ является узким местом, то вам нужно найти программиста на С, имеющего МНОГО опыта в численных методах.
Чарльз И. Грант

Ответы:

15

Я нахожусь в той же ситуации, что и вы, у меня также есть люди, портирующие мой код Matlab на C ++.

Многое зависит от сложности вашего кода, а также от уровня квалификации разработчика C / C ++ и их понимания того, что они должны реализовать - чем они лучше и чем лучше они понимают вашу проблему, тем больше самостоятельно они могут работать.

Поскольку прямой перевод кода Matlab на C / C ++, возможно, не самый эффективный способ решения проблемы, я предлагаю вам хорошо сообщить, что представляет собой ввод, что должен делать код и что он должен возвращать в качестве вывода. Вы также должны предоставить способы тестирования кода, чтобы убедиться, что он работает правильно - как в помощь при отладке, так и в качестве средства контроля качества. Кроме того, вы должны предоставить и объяснить код Matlab в качестве приблизительного ориентира того, как можно достичь результата.

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

Это может помочь запланировать регулярные встречи с разработчиком, так что «мелочи», которые могут показаться немного странными для разработчика, но которые будут сигнализировать вам о важных проблемах, могут быть переданы до того, как они перерастут в большие проблемы.

Jonas
источник
+1 за достоверные результаты тестирования программного обеспечения. Перенос кода с Matlab на C / C ++ достаточно сложен, не зная, как должны выглядеть результаты.
rjzii
12

Я не говорю, что это относится к вам, но: большинство людей, которые пишут только в MATLAB, пишут плохой код. Очень плохо, с плохим форматированием, структурой и документацией.

В этом случае единственный простой способ использовать код MATLAB - запустить его для проверки результатов из перенесенного кода. Попытка перепроектировать код MATLAB без дополнительной документации - это то, что должно быть предпринято только в том случае, если первоначальный автор кода MATLAB фактически мертв или находится в коматозном состоянии. С другой стороны, хорошо написанная математическая статья об алгоритме обычно намного более полезна, чем собственная реализация аспиранта автора.

Чтобы было проще для человека, переносящего ваш код:

  1. Рефакторинг вашего кода, чтобы убедиться, что операции разбиты на различные функции. Стиль MATLAB «одна функция на файл» позволяет использовать функции слишком длинными и включать слишком много операций. Также убедитесь, что дублированный код извлекается для вспомогательных функций, даже если это приводит к большему количеству файлов, чем вы обычно хотели бы работать для проекта MATLAB.

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

  3. Документируйте структуры данных вашего кода. Стиль MATLAB «все является матрицей» сильно отличается от большинства языков, и это часто означает, что ваши структуры данных неявно определяются тем, как вы используете матрицы. Программисту переменного тока нужно будет выяснить, как настроить различные структуры и распределить необходимые массивы, поэтому убедитесь, что вам ясно, каковы значения и внутренние структуры ваших переменных.

  4. Документируйте алгоритмы, используемые вашим кодом. В частности, убедитесь, что ясно, что происходит, когда вы используете сложные функции и операторы целого массива, и убедитесь, что у программиста C есть доступ к ссылкам на алгоритмы, используемые любыми функциями панели инструментов или стандартными функциями библиотеки, которые являются более сложными, чем BLAS функции.

  5. Документируйте все, что вы сделали, чтобы сделать код устойчивым, например, проверку ввода и обработку ошибок. То, как вы это реализовали, вероятно, сильно отличается от того, как это должно быть сделано в C. Академики, пишущие код MATLAB, редко пытаются узнать о таких вещах, как обработка исключений. Если вы ничего не сделали для того, чтобы сделать свой код устойчивым, то хотя бы документируйте, что можно сделать с неверным вводом, некорректными или частичными данными.

  6. Убедитесь, что лицо, переносящее код, может сравнить вывод с исходным кодом MATLAB и, если это вообще возможно, предоставить полный набор тестов для ввода и правильного вывода.

  7. Если человек, выполняющий портирование, не знает числового анализа, вам нужно будет контролировать процесс портирования и убедиться, что вы просматриваете и понимаете код Си. Это будет очень познавательно для вас обоих.

user23748
источник
Я согласен с вашей технической оценкой, и вы делаете хорошие оценки (1 - 7), но я думаю, что объявление в верхней части страницы о «большинстве людей, которые только кодируют в MATLAB» было ненужным и не соответствует действительности.
5
Исходя из моего опыта, большинство людей, которые используют MATLAB в качестве своего единственного языка программирования, применяют математику, для которой программирование, как правило, не более, чем средство для достижения цели. У них нет стимула заботиться о практике программирования, и они заботятся только о написании правильного кода, а не хорошего или красивого кода. Когда они делятся своим кодом, он, как правило, предназначен для использования, но не для чтения - всегда есть документ, объясняющий код. Если вы думаете, что это оскорбительно (а это не так), то вы просто упускаете из виду людей, которым все равно.
4
По моему опыту, плохой код в основном пишется людьми, которые пишут однократный код, то есть код, который будет использоваться (читаться) одним человеком для решения одной проблемы. Язык программирования не имеет значения. И мне, как человеку, который в основном программирует на Matlab, ad hominem кажется оскорбительным.
Йонас
Как EE я в основном должен писать MATLAB, и я согласен с вами. Это поощряет очень ужасный стиль кодирования без ограничения, пространства имен, организации в структуры данных или хорошего именования переменных. Когда векторизация понятна, никто не станет комментировать какие-либо из полученных умных чудес в одну строку. Просто гигантская куча безобразного, неэффективного кода.
Милинд Р
4

Языки программирования гораздо легче читать, чем писать. Большинство программистов на C, обладающих небольшим опытом, должны быть в состоянии прочитать ваш код Matlab очень хорошо с доступом к справке, и особенно с доступом к программисту Matlab, чтобы ответить на их вопросы. Код любого рода гораздо менее неоднозначен, чем большинство требований, над которыми мы должны работать.

Если они имеют степень бакалавра в области компьютерных наук или компьютерной инженерии, они, вероятно, взяли исчисление, тригонометрию и линейную алгебру, но это может быть ржавым. Если они не занимаются научным / математическим программированием, большинство программистов на Си будут знать, что такое БПФ, но редко или никогда не должны были это делать. Ваш идеальный кандидат будет иметь все это свежее в голове, но любой со степенью должен быть в состоянии справиться с математикой с некоторой переподготовкой. В любом случае вам нужен кто-то, кто делает акцент на поиске существующих библиотек для подобных операций, когда это возможно, а не накатывает свои собственные.

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

Карл Билефельдт
источник
3

Финансовая причина отказа от использования компилятора Matlab вполне понятна. Тем не менее, вы можете использовать бесплатный конвертер scilab в C. Процедура будет

  • Конвертируйте ваш код из Matlab в Scilab с помощью инструментов M2SCI ,
  • Преобразуйте код Scilab в C, используя «Scilab 2 C» ,
  • Перекрестное тестирование кодов,
  • Используйте профилировщик для поиска узких мест, которые нужны человеческому глазу.

В идеале в этом процессе не требуется знание Scilab, и достаточно просто потратить некоторое время, чтобы попробовать это решение (на практике это может быть не так просто ...)

Примечание: я не пробовал это, но это решение, которое я представляю себе по тем же причинам.

Климент Дж.
источник
2

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

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


источник
2

Отличный пост от Jonas, особенно о том, как предоставить способ тестирования кода. Вот несколько дополнительных предложений:

  • Код обмена. Подумайте над предоставлением исходного кода MATLAB, но будьте готовы объяснить его структуру или другие детали (от синтаксиса до вашего личного стиля). Мы надеемся, что разработчик C распознает высокоуровневые концепции, алгоритмы и математику ( и, надеюсь, вы прокомментировали свой код ).

  • Документация. Крайне важно, чтобы у вас была четкая документация, определяющая проект; в конце концов, если человек не владеет MATLAB, код может быть не очень полезной ссылкой.

  • Упражнение Люди Навыки. Это может быть очевидно, однако, следует помнить о сотрудничестве, особенно на такого рода микроуровне. Поэтому вы должны попытаться устранить как можно больше двусмысленности в своем коде / документации. В зависимости от вашего уровня лидерства в проекте, вы можете обнаружить, что соблюдаете баланс между направлением развития и предоставлением человеку возможности вносить свой личный вклад.

Гэри
источник
1

Если ваши C-кодеры не используют правильные библиотеки, Matlab будет намного лучше в таких простых вещах, как инвертирование матрицы. Наивный С импл. недостаточно стабильный Нанимать кодеров C было бы дорого. Я бы попытался перенести код Matlab на scipy и сравнить скорость, попробовать использовать компилятор Matlab c или ... просто добавить больше оборудования - это может быть намного дешевле, проще, безопаснее и быстрее.

работа
источник