Existe uma maneira recomendada de comunicar programação científica / de engenharia aos desenvolvedores de C?

16

Eu tenho muito código MATLAB que precisa ser portado para C (a velocidade de execução é crítica para este trabalho) como parte de um processo de back-end para um aplicativo Web. Quando tento terceirizar esse código para um desenvolvedor C, presumo (me corrija se estiver errado) que poucos desenvolvedores C também entendam o código MATLAB (coisas como indexação e gerenciamento de memória são diferentes etc.). Gostaria de saber se existem desenvolvedores C por aí que possam recomendar um procedimento para eu seguir para melhor comunicar o que o código faz?

Por exemplo, devo fornecer o código MATLAB e explicar o que está fazendo linha por linha? Ou devo apenas fornecer matemática / algoritmo, explicá-lo em inglês simples e permitir que o desenvolvedor C o implemente com esse entendimento à sua maneira (por exemplo, posso assumir que o desenvolvedor entende como trabalhar com matemática complexa (por exemplo, imaginária) números), como gerar histogramas, realizar uma FFT, etc.)?

Ou existe um método melhor? Espero que não seja o primeiro a fazer isso, então me pergunto se algum desenvolvedor de C enfrentou essa situação e pode compartilhar qualquer sabedoria convencional de como eles gostariam que essa tarefa fosse transferida.

Agradecemos antecipadamente por quaisquer comentários.

gkdsp
fonte
3
você já tentou usar o mcc para converter o código do matlab em c? Eu acho que émcc -c matlabfile.m
Will Tate
4
Ao contratar o programador, especifique que ele deve entender os códigos C e Matlab. Dada a sua ênfase na velocidade, você provavelmente deve usar C ++ em vez de C (com algum cuidado, nunca é mais lento e geralmente mais rápido).
Jerry Coffin
3
@willytate: Isso requer que você tenha o compilador Matlab, ele não produz código particularmente eficiente e há algumas limitações em qual código você pode compilar.
Jonas
3
Se você faz um tipo de programação orientada a objeto em C, não apenas se livra da oportunidade de fazer com que o compilador faça verificações extras de segurança de tipo, mas também de privá-lo da chance de fazer certos tipos de otimizações que não podem ser expressas facilmente em C. Além disso, o uso do C ++ aumenta as chances de você poder usar a funcionalidade de uma biblioteca que foi escrita por alguém mais inteligente que você.
3
A maior parte do tempo é gasta no algoritmo real ou na manipulação de arquivos, IO e análise? O codificador C médio não será capaz de escrever código FFT e matriz que chega perto de competir com a implementação do MATLAB. Se a análise, E / S e manipulação de arquivos é onde o seu programa está gastando seu tempo, o programador C deve se concentrar nisso e escrever um código de cola que chame funções das bibliotecas do MATLAB. Se a resolução de FFT / decomposição de matrizes / ODE é o gargalo, é necessário encontrar um programador C com muita experiência em métodos numéricos.
Charles E. Grant

Respostas:

15

Estou em uma situação semelhante à sua, pois também tenho pessoas portando meu código Matlab para C ++.

Depende muito da complexidade do seu código, bem como do nível de habilidade do desenvolvedor de C / C ++ e do entendimento do que eles devem implementar - quanto melhores eles são e quanto melhor eles entendem o seu problema, mais independentemente eles podem trabalhar.

Como a tradução direta do código Matlab para C / C ++ pode não ser a maneira mais eficiente de lidar com um problema, sugiro que você comunique bem qual é a entrada, o que o código deve fazer e o que deve retornar como saída. Você também deve fornecer maneiras de testar o código para garantir que ele funcione corretamente - tanto para ajudar na depuração quanto para fornecer um meio de controle de qualidade. Além disso, você deve fornecer e explicar o código do Matlab como uma diretriz aproximada de como o resultado pode ser alcançado.

Você deve assumir que o desenvolvedor sabe como estruturar um programa e como usar as ferramentas de depuração. No entanto, talvez você não consiga necessariamente assumir que o desenvolvedor sabe ter conhecimentos específicos, digamos, estatísticas ou otimização (matemática). Portanto, a depuração dessas partes será muito mais rápida com a sua entrada.

Pode ajudar a agendar reuniões regulares com o desenvolvedor, para que "pequenas coisas" que possam parecer um pouco estranhas para o desenvolvedor, mas que sinalizem problemas importantes para você, possam ser comunicadas antes que se transformem em grandes problemas.

Jonas
fonte
+1 por ter resultados de teste válidos para o software. Portar código de Matlab para C / C ++ já é difícil o suficiente sem saber como devem ser os resultados.
rjzii
12

Não estou dizendo que isso se aplica a você, mas: A maioria das pessoas que apenas codificam no MATLAB escrevem códigos incorretos. Muito ruim, com má formatação, estrutura e documentação.

Nesse caso, a única maneira fácil de usar o código MATLAB é executá-lo para verificar os resultados do código portado. Tentar fazer engenharia reversa do código MATLAB sem documentação adicional é algo que só deve ser realizado se o autor original do código MATLAB estiver realmente morto ou em coma. Por outro lado, um artigo matemático bem escrito sobre um algoritmo geralmente é muito mais útil do que a implementação do próprio aluno de pós-graduação do autor.

Para facilitar para a pessoa que está portando seu código:

  1. Refatore seu código para garantir que as operações sejam divididas em diferentes funções. O estilo de uma função por arquivo do MATLAB incentiva as funções a serem muito longas e abranger muitas operações. Verifique também se o código duplicado é extraído para as funções auxiliares, mesmo que isso resulte em mais arquivos do que você normalmente gostaria de trabalhar para um projeto MATLAB.

  2. Explique quaisquer números mágicos ou constantes usados ​​no seu código e as condições sob as quais eles são válidos.

  3. Documente as estruturas de dados do seu código. O estilo "tudo é uma matriz" do MATLAB é muito diferente da maioria das linguagens, e muitas vezes significa que suas estruturas de dados são definidas implicitamente pela maneira como você utiliza as matrizes. O programador de CA precisará descobrir como configurar as várias estruturas e alocar as matrizes necessárias, para garantir que esteja claro quais são os significados e as estruturas internas de suas variáveis.

  4. Documente os algoritmos usados ​​pelo seu código. Em particular, verifique se está claro o que acontece quando você usa funções e operadores complicados de matriz inteira e se o programador C tem acesso a referências sobre os algoritmos usados ​​por quaisquer funções da caixa de ferramentas ou funções da biblioteca padrão que são mais complicadas do que Funções BLAS.

  5. Documente tudo o que você fez para tornar o código robusto, como validação de entrada e tratamento de erros. A maneira como você o implementou provavelmente é muito diferente de como isso deve ser feito em C. Os acadêmicos que escrevem o código MATLAB raramente se preocupam em aprender sobre coisas como o tratamento de exceções. Se você não fez nada para tornar seu código robusto, pelo menos documente o que poderia ser feito sobre entradas inválidas ou dados parciais ou defeituosos.

  6. Certifique-se de que a pessoa que está portando o código possa comparar a saída com o código MATLAB original e, se possível, forneça um conjunto completo de testes de entrada e saída correta.

  7. Se a pessoa que faz a portabilidade não conhece a análise numérica, será necessário supervisionar o processo de portabilidade e verificar e compreender o código C. Será muito educativo para vocês dois.

user23748
fonte
Eu concordo com sua avaliação técnica e você faz boas observações (1 - 7), mas acho que o anúncio hominem no topo sobre "a maioria das pessoas que codificam apenas no MATLAB" era desnecessário e falso.
5
Com base na minha experiência, a maioria das pessoas que usam o MATLAB como sua única linguagem de programação são pessoas de matemática aplicada, para as quais a programação geralmente não passa de um meio para atingir um fim. Eles não têm incentivo para se preocupar com a prática da programação e se preocupam apenas com escrever código correto, não com código bom ou bonito. Quando eles compartilham seu código, normalmente ele deve ser usado, mas não lido - sempre há um trabalho para explicar o código. Se você acha que isso é ofensivo (e não deve ser), simplesmente está perdendo a perspectiva das pessoas que não se importam.
4
Na minha experiência, o código incorreto é principalmente escrito por pessoas que escrevem um código único, ou seja, código que será usado (lido) por uma única pessoa para um único problema. Linguagem de programação não importa. E para mim, como pessoa que programa principalmente no Matlab, o ad hominem parece ofensivo.
Jonas
Como EE, devo escrever principalmente MATLAB e concordo com você. Ele incentiva um estilo de codificação muito horrível, sem escopo, espaço para nome, organização em estruturas de dados ou boa nomeação de variáveis. Uma vez entendida a vetorização, não se dá ao trabalho de comentar nenhuma das maravilhas inteligentes resultantes de uma linha. Apenas um monte de lixo gigante de código feio e ineficiente.
Milind R
4

Linguagens de programação são muito mais fáceis de ler do que escrever. A maioria dos programadores em C com um mínimo de experiência deve ser capaz de ler bem o seu código Matlab com acesso a uma referência e, especialmente, com acesso a um programador Matlab para responder às suas perguntas. Código de qualquer tipo é muito menos ambíguo do que a maioria dos requisitos nos quais temos que trabalhar.

Se tiverem um diploma de bacharel em ciência da computação ou engenharia de computação, provavelmente terão cursado cálculo, trigonometria e álgebra linear, mas pode estar enferrujado. A menos que eles façam muita programação científica / matemática, a maioria dos programadores em C saberá o que é uma FFT, mas raramente ou nunca precisou fazer uma. Seu candidato ideal terá tudo isso em mente, mas qualquer pessoa com diploma deve ser capaz de lidar com a matemática com algum estudo de atualização. Em ambos os casos, você deseja alguém que enfatize a localização de bibliotecas existentes para operações comuns como essa sempre que possível, em vez de criar suas próprias.

O talento para otimizar o tempo de execução do algoritmo varia muito, mesmo entre programadores experientes. Eu recomendaria que você tivesse um problema de entrevista para descobrir isso. Mostre aos candidatos um algoritmo simples, mas intencionalmente ineficiente, e pergunte o que eles fazem. Veja se eles trazem sua ineficiência por conta própria. Pergunte a eles qual é a complexidade assintótica e qual deve ser. Pergunte a eles como eles reescreveriam para melhorar a eficiência.

Karl Bielefeldt
fonte
3

A razão financeira para não usar o compilador matlab é bem compreensível. No entanto, você pode usar o conversor gratuito do scilab para C. O procedimento seria

  • Converta seu código do Matlab para o Scilab com as ferramentas M2SCI ,
  • Converta o código do Scilab em C usando "Scilab 2 C" ,
  • Teste cruzado os códigos,
  • Use um criador de perfil para pesquisar gargalos que precisam de um olho humano.

Idealmente, não é necessário nenhum conhecimento do Scilab no processo e é fácil levar algum tempo para tentar esta solução (na prática, talvez não seja tão simples ...)

Nota: Eu não tentei isso, mas é uma solução que me imagino por razões semelhantes.

Clement J.
fonte
2

Desenvolva um bom conjunto de testes para executar os dois aplicativos e, em seguida, examinar as métricas.

Isso ajudará bastante o desenvolvedor a testar o código e garantir que a qualidade esteja em um nível razoável.


fonte
2

Ótimo post de Jonas, especialmente o ponto de fornecer uma maneira de testar o código. Aqui estão algumas sugestões adicionais:

  • Código de compartilhamento. Considere fornecer a fonte MATLAB, mas esteja preparado para explicar sua estrutura ou outros detalhes (da sintaxe ao seu estilo pessoal). Esperamos que o desenvolvedor C reconheça os conceitos, algoritmos e matemática de alto nível ( e espero que você tenha comentado seu código ).

  • Documentação. Será crucial que você tenha uma documentação clara que defina o projeto; afinal, se a pessoa não é fluente no MATLAB, o código pode não ser uma referência muito útil.

  • Exercite as habilidades das pessoas. Isso pode ser óbvio, no entanto, é bom ter em mente ao colaborar, especialmente nesse tipo de nível micro. Portanto, você deve tentar remover o máximo de ambiguidade possível do seu código / documentação. Dependendo do seu nível de liderança no projeto, você pode encontrar um equilíbrio entre orientar o desenvolvimento e permitir que a pessoa faça sua própria contribuição individual.

gary
fonte
1

A menos que seus codificadores C usem as bibliotecas corretas, o Matlab é muito melhor em coisas tão triviais quanto inverter uma matriz. Um ingênuo C impl. não é estável o suficiente. A contratação de codificadores C seria cara. Eu tentaria portar o código do Matlab para analisar e comparar a velocidade, tentar usar o compilador c do Matlab, ou ... apenas jogar mais hardware nele - poderia ser muito mais barato e mais simples, seguro e rápido.

Trabalho
fonte