Esiste un modo consigliato per comunicare la programmazione scientifica / ingegneristica agli sviluppatori C?


16

Ho un sacco di codice MATLAB che deve essere portato su C (la velocità di esecuzione è fondamentale per questo lavoro) come parte di un processo di back-end per un'applicazione web. Quando provo a esternalizzare questo codice a uno sviluppatore C, presumo (correggimi se sbaglio), alcuni sviluppatori C comprendono anche il codice MATLAB (cose come l'indicizzazione e la gestione della memoria sono diverse, ecc.). Mi chiedo se ci sono sviluppatori C là fuori che possono consigliarmi una procedura da seguire per comunicare meglio cosa fa il codice?

Ad esempio, devo fornire il codice MATLAB e spiegare cosa sta facendo riga per riga? Oppure, dovrei semplicemente fornire la matematica / l'algoritmo, spiegarlo in un inglese semplice e lasciare che lo sviluppatore C lo implementi con questa comprensione a modo suo (ad esempio, posso supporre che lo sviluppatore capisca come lavorare con la matematica complessa (cioè immaginario numeri), come generare istogrammi, eseguire una FFT, ecc.)?

Oppure esiste un metodo migliore? Mi aspetto di non essere il primo a doverlo fare, quindi mi chiedo se qualche sviluppatore di C in circolazione si sia imbattuto in questa situazione e possa condividere qualsiasi saggezza convenzionale su come vorrebbero trasferire questo compito?

Grazie in anticipo per i commenti.


3
hai provato a usare mcc per convertire il codice matlab in c? penso che siamcc -c matlabfile.m
Will Tate il

4
Quando assumi il programmatore, specifica che deve comprendere sia il codice C che Matlab. Data la tua enfasi sulla velocità, dovresti probabilmente usare C ++ invece di C (con una certa cura, non è mai più lento e spesso più veloce).
Jerry Coffin,

3
@willytate: questo richiede che tu abbia il compilatore Matlab, che non produca un codice particolarmente efficiente e che ci siano alcune limitazioni su quale codice puoi compilare.
Jonas

3
Se esegui un tipo di programmazione orientata agli oggetti in C, non solo ti privi della possibilità di far eseguire al compilatore ulteriori controlli di sicurezza del tipo, ma privi il compilatore della possibilità di eseguire determinati tipi di ottimizzazioni che non possono essere espresse facilmente in C. Inoltre, l'uso di C ++ aumenta le possibilità che tu possa usare la funzionalità di una libreria che è stata scritta da qualcuno più intelligente di te.

3
La maggior parte del tempo è impiegata nell'algoritmo reale o nella manipolazione di file, IO e analisi? Il codificatore C medio non sarà in grado di scrivere codice FFT e matrice che si avvicina in qualche modo alla concorrenza con l'implementazione MATLAB. Se l'analisi, l'IO e il fiddling dei file sono quelli in cui il programma sta trascorrendo il suo tempo, il programmatore C dovrebbe concentrarsi su quello e scrivere il codice di colla che chiama le funzioni dalle librerie MATLAB. Se la risoluzione FFT / matrice / decomposizione ODE è il collo di bottiglia, allora devi trovare un programmatore C con MOLTA esperienza di metodi numerici.
Charles E. Grant,

Risposte:


15

Sono in una situazione simile alla tua in quanto ho anche persone che portano il mio codice Matlab su C ++.

Molto dipende dalla complessità del tuo codice, nonché dal livello di competenza dello sviluppatore C / C ++ e dalla loro comprensione di ciò che dovrebbero implementare: meglio sono e meglio comprendono il tuo problema, più indipendentemente possono lavorare.

Poiché la traduzione diretta del codice Matlab in C / C ++ potrebbe non essere il modo più efficiente per gestire un problema, ti suggerisco di comunicare bene quale sia l'input, cosa dovrebbe fare il codice e cosa dovrebbe restituire come output. Dovresti anche fornire modi per testare il codice per assicurarne il corretto funzionamento, sia come aiuto per il debug sia come mezzo per il controllo di qualità. Inoltre, dovresti fornire e spiegare il codice Matlab come guida approssimativa su come ottenere il risultato.

Dovresti essere in grado di supporre che lo sviluppatore sappia come strutturare un programma e come utilizzare gli strumenti di debug. Tuttavia, potresti non essere necessariamente in grado di supporre che lo sviluppatore sappia avere conoscenze specifiche, ad esempio statistiche o ottimizzazione (matematica). Pertanto, il debug di queste parti sarà molto più veloce con il tuo input.

Può essere utile pianificare incontri regolari con lo sviluppatore, in modo che "piccole cose" che potrebbero sembrare un po 'strane per lo sviluppatore, ma che segnaleranno importanti problemi possano essere comunicate prima che si trasformino in grandi problemi.


+1 per avere risultati di test validi per il software. Il porting del codice da Matlab a C / C ++ è abbastanza difficile senza sapere come dovrebbero apparire i risultati.
rjzii,

12

Non sto dicendo che questo vale per te, ma: la maggior parte delle persone che scrivono solo codice in MATLAB scrivono codice errato. Molto male, con formattazione, struttura e documentazione scadenti.

In questo caso, l'unico modo semplice per utilizzare il codice MATLAB è eseguirlo per verificare i risultati dal codice trasferito. Cercare di decodificare il codice MATLAB senza ulteriore documentazione è qualcosa che dovrebbe essere intrapreso solo se l'autore originale del codice MATLAB è effettivamente morto o in coma. D'altra parte, un documento matematico ben scritto su un algoritmo è di solito molto più utile dell'implementazione dello studente laureato dell'autore.

Per semplificare la persona che porta il tuo codice:

  1. Rifattorizzare il codice per assicurarsi che le operazioni siano suddivise in diverse funzioni. Lo stile di una funzione per file di MATLAB incoraggia le funzioni a essere troppo lunghe e comprende troppe operazioni. Assicurati anche che il codice duplicato sia estratto per le funzioni di supporto, anche se questo porta a un numero di file superiore a quello che normalmente vorresti lavorare con un progetto MATLAB.

  2. Spiega eventuali numeri magici o costanti utilizzati nel tuo codice e le condizioni in base alle quali sono validi.

  3. Documenta le strutture di dati del tuo codice. Lo stile "tutto è una matrice" di MATLAB è molto diverso dalla maggior parte delle lingue e spesso significa che le strutture dei dati sono definite in modo implicito dal modo in cui usi le matrici. Il programmatore AC dovrà capire come impostare le varie strutture e allocare gli array necessari, quindi assicurati che sia chiaro quali siano i significati e le strutture interne delle tue variabili.

  4. Documenta gli algoritmi utilizzati dal tuo codice. In particolare, assicurarsi che sia chiaro cosa succede quando si utilizzano complesse funzioni e operatori dell'intero array e assicurarsi che il programmatore C abbia accesso ai riferimenti sugli algoritmi utilizzati da qualsiasi funzione della casella degli strumenti o delle librerie standard più complicate di Funzioni BLAS.

  5. Documenta tutto ciò che hai fatto per rendere robusto il codice, come la convalida dell'input e la gestione degli errori. Il modo in cui lo hai implementato è probabilmente molto diverso da come dovrà essere fatto in C. Gli accademici che scrivono il codice MATLAB raramente si preoccupano di imparare cose come la gestione delle eccezioni. Se non hai fatto nulla per rendere robusto il tuo codice, almeno documenta cosa si potrebbe fare con input non validi o dati errati o parziali.

  6. Assicurarsi che la persona che esegue il porting del codice sia in grado di confrontare l'output con il codice MATLAB originale e, se possibile, fornire una suite completa di test di input e output corretto.

  7. Se la persona che esegue il porting non conosce l'analisi numerica, sarà necessario supervisionare il processo di porting e assicurarsi di rivedere e comprendere il codice C. Sarà molto istruttivo per entrambi.


Sono d'accordo con la tua valutazione tecnica e fai dei buoni punti (1 - 7), ma penso che la pubblicità in alto sulla "maggior parte delle persone che scrivono solo codice in MATLAB" sia superflua e falsa.

5
Sulla base della mia esperienza, la maggior parte delle persone che usano MATLAB come unico linguaggio di programmazione sono persone matematiche applicate, per le quali la programmazione non è in genere altro che un mezzo per raggiungere un fine. Non hanno alcun incentivo a prendersi cura della pratica della programmazione e si preoccupano solo di scrivere un codice corretto, non un codice buono o bello. Quando condividono il loro codice, in genere è pensato per essere utilizzato, ma non letto - c'è sempre un documento per fare il lavoro di spiegazione del codice. Se pensi che questo sia offensivo (e non è pensato che lo sia), allora stai semplicemente perdendo la prospettiva delle persone a cui non importa.

4
Nella mia esperienza, il codice errato è principalmente scritto da persone che scrivono codice one-shot, cioè codice che verrà utilizzato (letto) da una singola persona per un singolo problema. Il linguaggio di programmazione non ha importanza. E per me, in quanto persona principalmente programmatrice in Matlab, la pubblicità è offensiva.
Jonas

Come EE mi aspetto principalmente di scrivere MATLAB e sono d'accordo con te. Incoraggia uno stile di programmazione molto orribile senza scoping, spaziatura dei nomi, organizzazione in strutture di dati o buona denominazione delle variabili. Una volta compresa la vettorializzazione, non ci si preoccupa davvero di commentare nessuna delle conseguenti intelligenti prodigi di una riga. Solo un gigantesco mucchio di immondizia di codice brutto e inefficiente.
Milind R

4

I linguaggi di programmazione sono molto più facili da leggere che da scrivere. La maggior parte dei programmatori C con un minimo di esperienza dovrebbe essere in grado di leggere bene il codice Matlab con l'accesso a un riferimento, e in particolare con l'accesso a un programmatore Matlab per rispondere alle loro domande. Il codice di qualsiasi tipo è molto meno ambiguo della maggior parte dei requisiti su cui dobbiamo lavorare.

Se hanno una laurea in informatica o ingegneria informatica, probabilmente avranno preso il calcolo, la trigonometria e l'algebra lineare, ma potrebbe essere arrugginito. A meno che non facciano molta programmazione scientifica / matematica, la maggior parte dei programmatori C saprà cos'è un FFT, ma raramente o non ha mai dovuto farlo. Il tuo candidato ideale avrà tutto in mente, ma chiunque abbia una laurea dovrebbe essere in grado di gestire la matematica con qualche studio di aggiornamento. In entrambi i casi, vuoi qualcuno che enfatizzi la ricerca di librerie esistenti per operazioni comuni come questa ogni volta che è possibile anziché farle proprie.

Il talento per essere in grado di ottimizzare i tempi di esecuzione dell'algoritmo varia ampiamente anche tra i programmatori esperti. Ti consiglierei di avere un problema con l'intervista per scoprirlo. Mostra ai candidati un algoritmo semplice ma intenzionalmente inefficiente e chiedi loro cosa fa. Vedi se fanno emergere la sua inefficienza da soli. Chiedi loro qual è la complessità asintotica e quale dovrebbe essere. Chiedi loro come riscriverebbero per migliorare l'efficienza.


3

Il motivo finanziario per non utilizzare il compilatore matlab è ben comprensibile. Tuttavia, puoi utilizzare il convertitore gratuito da scilab a C. La procedura sarebbe

  • Converti il ​​tuo codice da Matlab a Scilab con gli strumenti M2SCI ,
  • Converti il ​​codice Scilab in C usando "Scilab 2 C" ,
  • Cross test dei codici,
  • Usa un profiler per cercare i colli di bottiglia che richiedono un occhio umano.

Idealmente non è necessaria alcuna conoscenza di Scilab nel processo ed è abbastanza facile impiegare un po 'di tempo a provare questa soluzione (in pratica, forse non è così semplice ...)

Nota: non ho provato questo, ma è una soluzione che mi immagino per ragioni simili.


2

Sviluppa un buon set di test che puoi eseguire su entrambe le applicazioni e dai un'occhiata alle metriche.

Ciò aiuterà notevolmente lo sviluppatore a testare il proprio codice e garantire che la qualità sia a un livello ragionevole.


2

Ottimo post di Jonas, in particolare il punto di fornire un modo per testare il codice. Ecco alcuni suggerimenti aggiuntivi:

  • Codice di condivisione. Valuta di fornire la fonte MATLAB ma preparati a spiegarne la struttura o altri dettagli (dalla sintassi al tuo stile personale). Si spera che lo sviluppatore C riconosca i concetti, gli algoritmi e la matematica di alto livello ( e si spera che tu abbia commentato il tuo codice ).

  • Documentazione. Sarà fondamentale disporre di una documentazione chiara che definisca il progetto; dopo tutto, se la persona non parla fluentemente MATLAB, il codice potrebbe non essere un riferimento molto utile.

  • Esercitare le abilità delle persone. Questo può essere ovvio, tuttavia è bene tenere a mente quando si collabora, soprattutto su questo tipo di micro livello. Quindi dovresti provare a rimuovere quanta più ambiguità dal tuo codice / documentazione possibile. A seconda del tuo livello di leadership nel progetto, potresti scoprire di trovare un equilibrio tra guidare lo sviluppo e lasciare che la persona fornisca il proprio contributo individuale.


1

A meno che i tuoi programmatori C non utilizzino le lib lib giuste, Matlab è molto meglio in cose tanto banali quanto invertire una matrice. Un ingenuo impl c. non è abbastanza stabile. Assumere programmatori C sarebbe costoso. Vorrei provare il porting del codice Matlab per scipy e confrontare la velocità, provare ad usare il compilatore c di Matlab o ... semplicemente lanciare più hardware su di esso - potrebbe essere molto più economico e semplice e più sicuro e veloce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.