Deixe-me tentar detalhar seus requisitos:
- Manutenção
- Leitura / gravação de dados de texto
- Interfaces / capacidade fortes para fatorações de LU
- Solucionadores lineares esparsos
- Desempenho e escalabilidade para grandes dados
Nesta lista, eu consideraria os seguintes idiomas:
C, C ++, Fortran, Python, MATLAB, Java
Julia é um novo idioma promissor, mas a comunidade ainda está se formando em torno dele e não foi implantada em nenhum dos principais códigos novos.
Leitura / gravação de dados de texto
É fácil acertar em qualquer linguagem de programação. Verifique se você está armazenando o buffer e coalescendo adequadamente seu acesso de E / S e obterá um bom desempenho de qualquer um dos idiomas que você deve considerar. Evite os objetos de fluxo no C ++, a menos que você saiba como usá-los com desempenho.
Interfaces / capacidade fortes para fatorações de LU
Se você estiver executando fatorações densas de LU, convém usar LAPACK ou ScaLAPACK / Elemental para funcionalidade paralela. LAPACK e ScaLAPACK são escritos em Fortran, Elemental é escrito em C ++. Todas as três bibliotecas têm desempenho, são bem suportadas e documentadas. Você pode fazer interface com eles a partir de qualquer um dos idiomas que você deve considerar.
Solucionadores lineares esparsos
Os principais solucionadores lineares esparsos disponíveis gratuitamente estão quase todos disponíveis no PETSc , escrito em C, que é bem documentado e suportado. Você pode fazer interface com o PETSc a partir de qualquer um dos idiomas que você deve considerar.
Desempenho e escalabilidade para grandes dados
Os únicos paradigmas de programação paralela mencionados são baseados em memória compartilhada, o que significa que você não está considerando uma abordagem de computação de memória distribuída baseada em MPI (passagem de mensagem). De acordo com minha experiência, é muito mais fácil escrever código que vai muito além de uma dúzia de núcleos usando uma solução de memória distribuída. Quase todos os "agrupamentos" de universidades são baseados em MPI atualmente, grandes máquinas de memória compartilhada são caras e, correspondentemente, raras. Você deve considerar o MPI para sua abordagem, mas meu conselho será aplicado independentemente do paradigma de programação que você escolher.
Com relação ao desempenho no nó, se você estiver escrevendo rotinas numéricas, é mais fácil obter um bom desempenho serial no Fortran. Se você tem um pouco de experiência em C, C ++ ou Python, pode obter um desempenho muito comparável (C e C ++ são inoperantes mesmo com Fortran, Python e MATLAB dentro de uma sobrecarga de cerca de 25% do tempo sem muito esforço). O MATLAB faz isso através de um compilador JIT e muito boa expressividade em álgebra linear. Você provavelmente precisará usar kernels numéricos Cython, numpy, numexpr ou incorporar para obter o desempenho reivindicado do Python. Não posso comentar sobre o desempenho do Java, porque não conheço muito bem a linguagem, mas desconfio que ela não esteja muito longe da linguagem do Python se escrita por um especialista.
Uma nota sobre interfaces
Espero ter convencido você de que você poderá fazer tudo o que quiser em qualquer uma das linguagens de programação que estiver considerando. Se você estiver usando Java, as interfaces C serão um pouco desafiadoras. O Python possui excelente suporte à interface C e Fortran por meio de ctypes, Cython e f2py. O LAPACK já está empacotado e disponível através do scipy. O MATLAB possui toda a funcionalidade necessária em suas bibliotecas nativas, mas não é facilmente escalável ou particularmente fácil de executar em clusters. Java pode suportar interfaces C e Fortran com o JNI , mas não é comumente encontrado em clusters e em software paralelo para computação científica.
Manutenção
Muito disso vai se resumir ao gosto pessoal, mas o consenso geral sobre manutenção é que você deseja minimizar o número de linhas de código em seu software, escrever código modular com interfaces bem definidas e, para o software computacional, fornecer testes que verificam a correção e a funcionalidade da implementação.
Recomendação
Eu , pessoalmente, tive muita sorte com Python e eu recomendo para muitos projetos computacionais. Eu acho que você deve considerá-lo fortemente para o seu projeto. Python e MATLAB são provavelmente as línguas mais expressivas disponíveis para a computação científica. Você pode facilmente conectar o Python a qualquer outra linguagem de programação, pode usar o f2py para encapsular sua implementação atual do Fortran e reescrever peça por peça, independentemente das peças que você deseja no Python enquanto verifica se está mantendo a funcionalidade. No momento, eu recomendaria uma combinação da implementação oficial do Python 2.7 com o scipy . Você pode começar muito facilmente com essa pilha na distribuição gratuita do Enthought Python .
Você também pode fazer a maior parte disso em C, C ++ ou Fortran. C e C ++ são linguagens muito atraentes para desenvolvedores profissionais com muita experiência, mas frequentemente viajam para novos desenvolvedores e, nesse sentido, provavelmente não são uma ótima idéia para um código mais acadêmico. Fortran e MATLAB são populares na computação acadêmica, mas são fracos nas estruturas avançadas de dados e na expressividade que o Python oferece (pense em um objeto de ditado do Python, por exemplo).
Perguntas relacionadas: