Existe-t-il un moyen recommandé de communiquer la programmation scientifique / technique aux développeurs C?


16

J'ai beaucoup de code MATLAB qui doit être porté en C (la vitesse d'exécution est critique pour ce travail) dans le cadre d'un processus back-end pour une application Web. Lorsque j'essaie d'externaliser ce code à un développeur C, je suppose (corrigez-moi si je me trompe) que peu de développeurs C comprennent également le code MATLAB (des choses comme l'indexation et la gestion de la mémoire sont différentes, etc.). Je me demande s'il y a des développeurs C qui peuvent recommander une procédure à suivre pour mieux communiquer ce que fait le code?

Par exemple, dois-je fournir le code MATLAB et expliquer ce qu'il fait ligne par ligne? Ou, dois-je simplement fournir les mathématiques / algorithmes, les expliquer en anglais simple et laisser le développeur C les implémenter à sa manière (par exemple, puis-je supposer que le développeur comprend comment travailler avec des mathématiques complexes (c.-à-d. Imaginaires) nombres), comment générer des histogrammes, effectuer une FFT, etc.)?

Ou existe-t-il une meilleure méthode? Je m'attends à ce que je ne sois pas le premier à avoir besoin de le faire, donc je me demande si des développeurs C ont rencontré cette situation et peuvent partager une sagesse conventionnelle sur la façon dont ils aimeraient que cette tâche soit transférée?

Merci d'avance pour vos commentaires.


3
avez-vous essayé d'utiliser mcc pour convertir le code matlab en c? je pense que sonmcc -c matlabfile.m
Will Tate

4
Lorsque vous embauchez le programmeur, spécifiez qu'il doit comprendre le code C et Matlab. Étant donné votre accent sur la vitesse, vous devriez probablement utiliser C ++ au lieu de C (avec un peu de soin, ce n'est jamais plus lent et souvent plus rapide).
Jerry Coffin

3
@willytate: Cela nécessite que vous ayez le compilateur Matlab, il ne produit pas de code particulièrement efficace, et il y a quelques limitations sur le code que vous pouvez compiler.
Jonas

3
Si vous effectuez une programmation orientée objet en C, vous vous privez non seulement de la possibilité de demander au compilateur d'effectuer des vérifications de sécurité de type supplémentaires, mais vous privez le compilateur de la possibilité de faire certains types d'optimisations qui ne peuvent pas être exprimées facilement en C. En outre, l'utilisation de C ++ augmente les chances que vous puissiez utiliser les fonctionnalités d'une bibliothèque qui a été écrite par quelqu'un de plus intelligent que vous.

3
La plupart du temps est-il consacré à l'algorithme réel ou à manipuler des fichiers, des E / S et l'analyse? Le codeur C moyen ne sera pas en mesure d'écrire de la FFT et du code matriciel qui se rapprochent de la concurrence de l'implémentation MATLAB. Si l'analyse, les entrées-sorties et le violon de fichiers sont là où votre programme passe son temps, votre programmeur C doit se concentrer sur cela et écrire du code de collage qui appelle des fonctions des bibliothèques MATLAB. Si la résolution FFT / décomposition matricielle / ODE est le goulot d'étranglement, alors vous devez trouver un programmeur C avec BEAUCOUP d'expérience des méthodes numériques.
Charles E. Grant

Réponses:


15

Je suis dans une situation similaire à la vôtre car j'ai également des gens qui portent mon code Matlab en C ++.

Cela dépend beaucoup de la complexité de votre code, ainsi que du niveau de compétence du développeur C / C ++ et de sa compréhension de ce qu'il est censé implémenter - mieux il est et mieux il comprend votre problème, plus indépendamment, ils peuvent travailler.

Étant donné que la traduction directe du code Matlab en C / C ++ n'est peut-être pas le moyen le plus efficace de gérer un problème, je vous suggère de bien communiquer ce qu'est l'entrée, ce que le code doit faire et ce qu'il est censé retourner en sortie. Vous devez également fournir des moyens de tester le code pour vous assurer qu'il fonctionne correctement - à la fois pour aider au débogage et pour fournir un moyen de contrôle de la qualité. En plus de cela, vous devez fournir et expliquer le code Matlab comme une indication approximative de la façon dont le résultat peut être atteint.

Vous devriez pouvoir supposer que le développeur sait comment structurer un programme et comment utiliser les outils de débogage. Cependant, vous ne pouvez pas nécessairement supposer que le développeur sait avoir des connaissances spécifiques, par exemple en statistiques ou en optimisation (mathématique). Ainsi, le débogage de ces parties sera beaucoup plus rapide avec votre entrée.

Il peut être utile de planifier des réunions régulières avec le développeur, afin que les "petites choses" qui peuvent sembler un peu étranges au développeur, mais qui vous signalent des problèmes importants, puissent être communiquées avant qu'elles ne dégénèrent en gros problèmes.


+1 pour avoir des résultats de test valides pour le logiciel. Le portage de code de Matlab vers C / C ++ est déjà assez difficile sans savoir à quoi devraient ressembler les résultats.
rjzii

12

Je ne dis pas que cela s'applique à vous, mais: la plupart des gens qui ne codent que dans MATLAB écrivent du mauvais code. Très mauvais, avec un formatage, une structure et une documentation médiocres.

Dans ce cas, le seul moyen simple d'utiliser le code MATLAB est de l'exécuter pour vérifier les résultats du code porté. Essayer de désosser le code MATLAB sans documentation supplémentaire est quelque chose qui ne devrait être entrepris que si l'auteur original du code MATLAB est réellement mort ou comateux. D'un autre côté, un article mathématique bien écrit sur un algorithme est généralement beaucoup plus utile que l'implémentation de l'étudiant diplômé de l'auteur.

Pour faciliter la tâche à la personne qui porte votre code:

  1. Refactorisez votre code pour vous assurer que les opérations sont réparties en différentes fonctions. Le style une fonction par fichier de MATLAB encourage les fonctions à être trop longues et à englober trop d'opérations. Assurez-vous également que le code dupliqué est extrait pour les fonctions d'assistance, même si cela entraîne plus de fichiers que vous ne souhaiteriez normalement travailler avec un projet MATLAB.

  2. Expliquez les nombres magiques ou constantes utilisés dans votre code et les conditions dans lesquelles ils sont valides.

  3. Documentez les structures de données de votre code. Le style «tout est une matrice» de MATLAB est très différent de la plupart des langues, et cela signifie souvent que vos structures de données sont définies implicitement par la façon dont vous utilisez les matrices. Le programmeur AC devra comprendre comment configurer les différentes structures et allouer les tableaux nécessaires, alors assurez-vous qu'il est clair quelles sont les significations et les structures internes de vos variables.

  4. Documentez les algorithmes utilisés par votre code. En particulier, assurez-vous qu'il est clair ce qui se passe lorsque vous utilisez des fonctions et des opérateurs de tableau complet compliqués, et assurez-vous que le programmeur C a accès aux références sur les algorithmes utilisés par les fonctions de boîte à outils ou les fonctions de bibliothèque standard qui sont plus compliquées que Fonctions BLAS.

  5. Documentez tout ce que vous avez fait pour rendre le code robuste, comme la validation des entrées et la gestion des erreurs. La façon dont vous l'avez implémentée est probablement très différente de la façon dont cela devra être fait en C. Les universitaires qui écrivent du code MATLAB se donnent rarement la peine de se renseigner sur des choses comme la gestion des exceptions. Si vous n'avez rien fait pour rendre votre code robuste, documentez au moins ce qui pourrait être fait à propos d'une entrée non valide ou de données incomplètes ou défectueuses.

  6. Assurez-vous que la personne qui porte le code est en mesure de comparer la sortie avec le code MATLAB d'origine et, si possible, de fournir une suite complète de tests d'entrée et de sortie correcte.

  7. Si la personne qui effectue le portage ne connaît pas l'analyse numérique, vous devrez superviser le processus de portage et vous assurer que vous passez en revue et comprenez le code C. Ce sera très instructif pour vous deux.


Je suis d'accord avec votre évaluation technique et vous faites de bons points (1 - 7), mais je pense que l'ad hominem en haut à propos de "la plupart des gens qui ne codent que dans MATLAB" était inutile et faux.

5
D'après mon expérience, la plupart des personnes qui utilisent MATLAB comme seul langage de programmation sont des maths appliquées, pour qui la programmation n'est généralement rien de plus qu'un moyen de parvenir à une fin. Ils ne sont pas incités à se soucier de la pratique de la programmation et ne se soucient que d'écrire du code correct, pas un code bon ou beau. Quand ils partagent leur code, il est généralement destiné à être utilisé, mais pas lu - il y a toujours un papier pour expliquer le code. Si vous pensez que c'est offensant (et ce n'est pas censé l'être), alors vous manquez simplement le point de vue des personnes qui s'en moquent.

4
D'après mon expérience, le mauvais code est principalement écrit par des personnes qui écrivent du code à usage unique, c'est-à-dire du code qui sera utilisé (lu) par une seule personne pour un seul problème. Le langage de programmation n'a pas d'importance. Et pour moi en tant que personne programmant principalement dans Matlab, l' annonce hominem apparaît comme offensante.
Jonas

En tant qu'EE, je suis principalement censé écrire MATLAB, et je suis d'accord avec vous. Il encourage un style de codage très horrible sans portée, espace de noms, organisation en structures de données ou bon nommage des variables. Une fois la vectorisation comprise, on ne prend pas vraiment la peine de commenter l'une des merveilles intelligentes qui en résultent. Juste un tas d'ordures géantes de code laid et inefficace.
Milind R du

4

Les langages de programmation sont beaucoup plus faciles à lire qu'à écrire. La plupart des programmeurs C avec un minimum d'expérience devraient être en mesure de lire votre code Matlab très bien avec l'accès à une référence, et en particulier avec l'accès à un programmeur Matlab pour répondre à leurs questions. Le code de toute sorte est beaucoup moins ambigu que la plupart des exigences sur lesquelles nous devons travailler.

S'ils ont un baccalauréat en informatique ou en génie informatique, ils auront probablement suivi le calcul, la trigonométrie et l'algèbre linéaire, mais cela peut être rouillé. À moins de faire beaucoup de programmation scientifique / mathématique, la plupart des programmeurs C sauront ce qu'est une FFT, mais rarement ou jamais dû en faire une. Votre candidat idéal aura tout cela frais dans son esprit, mais toute personne diplômée devrait être capable de gérer les mathématiques avec une étude de recyclage. Dans les deux cas, vous voulez quelqu'un qui met l'accent sur la recherche de bibliothèques existantes pour des opérations courantes comme celle-ci chaque fois que possible plutôt que de rouler les leurs.

Le talent pour pouvoir optimiser le temps d'exécution de l'algorithme varie considérablement, même parmi les programmeurs expérimentés. Je vous recommanderais d'avoir un problème d'entrevue pour le découvrir. Montrez aux candidats un algorithme simple mais intentionnellement inefficace et demandez-leur ce qu'il fait. Voyez s'ils évoquent eux-mêmes son inefficacité. Demandez-leur quelle est la complexité asymptotique et ce qu'elle devrait être. Demandez-leur comment ils réécriraient pour améliorer l'efficacité.


3

La raison financière de ne pas utiliser le compilateur matlab est bien compréhensible. Cependant, vous pouvez utiliser le convertisseur gratuit de scilab en C. La procédure serait

  • Convertissez votre code de Matlab en Scilab avec les outils M2SCI ,
  • Convertissez le code Scilab en C à l'aide de "Scilab 2 C" ,
  • Test croisé des codes,
  • Utilisez un profileur pour rechercher les goulots d'étranglement qui nécessitent un œil humain.

Idéalement, aucune connaissance de Scilab n'est nécessaire dans le processus et il est assez facile de prendre un peu de temps pour essayer cette solution (en pratique, ce n'est peut-être pas aussi simple ...)

Remarque: je n'ai pas essayé cela mais c'est une solution que j'envisage pour des raisons similaires.


2

Développez un bon ensemble de tests que vous pouvez exécuter dans les deux applications, puis jetez un œil aux métriques.

Cela aidera grandement votre développeur à tester son code et garantira que la qualité est à un niveau raisonnable.


2

Excellent article de Jonas, en particulier le point sur la manière de tester le code. Voici quelques suggestions supplémentaires:

  • Partage de code. Pensez à fournir la source MATLAB mais soyez prêt à expliquer sa structure ou d'autres détails (de la syntaxe à votre style personnel). Nous espérons que le développeur C reconnaîtra les concepts, algorithmes et mathématiques de haut niveau ( et j'espère que vous avez commenté votre code ).

  • Documentation. Il sera crucial que vous ayez une documentation claire qui définit le projet; après tout, si la personne ne parle pas couramment MATLAB, le code peut ne pas être une référence très utile.

  • Exercer les compétences des personnes. Cela peut être évident, mais il est bon de garder à l'esprit lors de la collaboration, en particulier à ce niveau micro. Vous devez donc essayer de supprimer autant d'ambiguïté que possible de votre code / documentation. Selon votre niveau de leadership dans le projet, vous constaterez peut-être que vous êtes en train de trouver un équilibre entre guider le développement et laisser la personne apporter sa propre contribution individuelle.


1

À moins que vos codeurs C n'utilisent les bonnes bibliothèques, Matlab est bien meilleur dans des choses aussi triviales que d'inverser une matrice. Un C naïf impl. n'est pas assez stable. L'embauche de codeurs C coûterait cher. J'essaierais de porter du code Matlab pour scipy et comparer la vitesse, essayer d'utiliser le compilateur c de Matlab, ou ... simplement jeter plus de matériel dessus - cela pourrait être beaucoup moins cher et plus simple et plus sûr et plus rapide.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.