Чи є рекомендований спосіб передачі науково-технічного програмування розробникам C?


16

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

Наприклад, я повинен надати код MATLAB та пояснити, що він робить по черзі? Або я повинен просто надати математику / алгоритм, пояснити це простою англійською мовою, і дозволити розробнику C реалізувати його з цим розумінням по-своєму (наприклад, чи можу я припустити, що розробник розуміє, як працювати зі складною математикою (тобто уявний числа), як генерувати гістограми, виконувати FFT тощо)?

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

Заздалегідь дякую за будь-які коментарі.


3
ви намагалися просто використовувати mcc для перетворення коду matlab в c? Я думаю, що цеmcc -c matlabfile.m
Will Tate

4
Коли ви наймаєте програміста, вкажіть, що він повинен розуміти код C і Matlab. Зважаючи на ваш акцент на швидкості, ви, ймовірно, повинні використовувати C ++ замість C (хоча з обережністю це ніколи не повільніше, а часто швидше).
Джеррі Труну

3
@willytate: Для цього потрібно мати компілятор Matlab, він не створює особливо ефективного коду, і є деякі обмеження щодо того, який код можна скласти.
Йонас

3
Якщо ви робите об'єктно-орієнтований вид програмування на C, ви не лише позбавляєте себе можливості компілятора робити додаткові перевірки безпеки типу, ви позбавляєте компілятора можливості робити певні види оптимізації, які неможливо легко виразити в C. Також використання C ++ збільшує шанси на використання функціональності з бібліотеки, яку написав хтось розумніший за вас.

3
Чи більша частина часу витрачається на власне алгоритм, або на те, щоб переглядати файли, IO та розбирати? Середній C-кодер не зможе записати FFT і матричний код, який знаходиться де-небудь поруч, конкуруючи з реалізацією MATLAB. Якщо синтаксичний аналіз, введення вводу та вивільнення файлів - це те, де ваша програма витрачає свій час, тоді ваш програміст C повинен зосередитись на цьому і написати код клею, який викликає функції з бібліотек MATLAB. Якщо розкладання FFT / матриці / вирішення ODE є вузьким місцем, вам доведеться знайти програміста C, що має багато чисельних методів.
Чарльз Е. Грант

Відповіді:


15

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

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

Оскільки прямий переклад коду Matlab на C / C ++ може бути не найефективнішим способом вирішення проблеми, я пропоную вам добре повідомити, що таке вхід, що повинен робити код і що він повинен повернути як вихід. Ви також повинні надати способи тестування коду, щоб переконатися, що він справно працює - і як допомога для налагодження, а також як засіб контролю якості. На додаток до цього, ви повинні надати та пояснити код Matlab як орієнтовне керівництво щодо того, як можна досягти результату.

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

Це може допомогти запланувати регулярні зустрічі з розробником, щоб "дрібниці", які можуть здаватись забудовником трохи дивними, але які будуть сигналізувати про важливі проблеми, можна буде повідомляти, перш ніж вони переростуть у великі проблеми.


+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. Якщо особа, яка здійснює перенесення, не знає чисельного аналізу, вам потрібно буде контролювати процес перенесення та переконатися, що ви переглядаєте та розумієте код C. Це буде дуже навчальним для вас обох.


Я погоджуюся з вашою технічною оцінкою, і ви даєте хороші бали (1 - 7), але я вважаю, що ad hominem вгорі про "більшість людей, які лише кодують в MATLAB", були непотрібними та неправдивими.

5
Виходячи з мого досвіду, більшість людей, які використовують MATLAB як єдину мову програмування, застосовуються з математики, для яких програмування взагалі є не що інше, як засіб для досягнення мети. У них немає стимулів дбати про практику програмування, і вони дбають лише про те, щоб написати правильний код, не гарний чи гарний код. Коли вони діляться своїм кодом, він зазвичай призначений для використання, але не для читання - завжди є робота з поясненням коду. Якщо ви вважаєте, що це образливо (і це не мається на увазі), то ви просто не вистачаєте точки зору людей, яким все одно.

4
На мій досвід, поганий код в основному пишуть люди, які пишуть однократний код, тобто код, який буде використаний (прочитаний) однією людиною для однієї проблеми. Мова програмування не має значення. І як мені, як людині, яка переважно програмує в Matlab, ad hominem здається образливим.
Йонас

Як EE, в основному, я пишу MATLAB, і я згоден з вами. Це заохочує дуже жахливий стиль кодування, не маючи масштабування, простору імен, організації в структурі даних або хорошої іменної змінної. Після того, як векторизація зрозуміла, ніхто не дуже намагається коментувати будь-яке з результативних розумних однозначних чудес. Просто гігантська купа сміття некрасивого, неефективного коду.
Milind R

4

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

Якщо вони мають ступінь бакалавра з інформатики чи комп’ютерної техніки, вони, ймовірно, взяли обчислення, тригонометрію та лінійну алгебру, але це може бути іржавим. Якщо вони не займаються великою кількістю наукових / математичних програмувань, більшість програмістів на C знають, що таке FFT, але рідко або ніколи цього не потрібно було робити. У вашого ідеального кандидата буде все свіже в його думці, але кожен, хто має ступінь, повинен мати можливість впоратися з математикою за допомогою певного оновлення. В будь-якому випадку ви хочете, щоб хтось наголошував на знаходженні існуючих бібліотек для таких звичайних операцій, як це можливо, коли це можливо, а не прокатки власних.

Талант на можливість оптимізації часу виконання алгоритму дуже різний навіть серед досвідчених програмістів. Я рекомендую вам мати проблему інтерв'ю, щоб виявити це. Покажіть кандидатам простий, але навмисно неефективний алгоритм і запитайте їх, що він робить. Подивіться, чи вони самостійно досягають її неефективності. Запитайте їх, що таке асимптотична складність і яка вона має бути. Запитайте їх, як би вони переписали для підвищення ефективності.


3

Фінансова причина невикористання компілятора matlab цілком зрозуміла. Однак ви можете використовувати безкоштовний конвертер scilab to C. Процедура була б

  • Перетворіть свій код з Matlab в Scilab за допомогою інструментів M2SCI ,
  • Перетворіть код Scilab в C за допомогою "Scilab 2 C" ,
  • Перехресне тестування кодів,
  • Використовуйте профілер для пошуку вузьких місць, які потребують людського ока.

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

Примітка: я цього не намагався, але це рішення, яке я передбачу з подібних причин.


2

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

Це значно допоможе вашому розробнику перевірити їх код та забезпечити якість на розумному рівні.


2

Чудовий пост Джонаса, особливо питання про те, як запропонувати спосіб перевірити код. Ось кілька додаткових пропозицій:

  • Код обміну Подумайте про надання джерела MATLAB, але будьте готові пояснити його структуру або інші деталі (від синтаксису до вашого особистого стилю). Розробник C сподівається визнати концепції, алгоритми та математику на високому рівні ( і, сподіваємось, ви прокоментували ваш код ).

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

  • Вправляйте навички людей. Це може бути очевидним, проте це добре пам’ятати при співпраці, особливо на такому мікрорівні. Тож вам слід спробувати усунути якомога більше двозначності з вашого коду / документації. Залежно від рівня вашого керівництва в проекті, ви можете виявити, що ви досягаєте балансу між керівним розвитком і дозволом людині зробити свій власний індивідуальний внесок.


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.