Também estou jogando meus dois centavos tarde demais, mas acabei de ver esse tópico e sinto que, para a posteridade, há alguns pontos que precisam desesperadamente ser feitos.
Observe a seguir que falarei sobre C e não sobre C ++. Por quê? Bem, caso contrário, são maçãs e laranjas comparar uma linguagem orientada a objetos de tipo dinâmico e tipicamente desenvolvida com algo tão estático quanto o Fortran. Sim, algumas implementações modernas dos mais recentes padrões do Fortran podem fazer mais do que apenas isso, mas poucas pessoas realmente os usam e, portanto, quando falamos do Fortran, pensamos em linguagem simples, estática e imperativa. É aí que C também está, então substituirei C por C ++ para o seguinte.
Antes de tudo, qualquer discussão sobre Fortran / C com melhores compiladores é discutível. Compiladores C / Fortran dedicados são coisa do passado. O gcc / gfortran e o icc / ifc são apenas front-ends diferentes para o mesmo back-end, ou seja, seu programa será transformado em uma descrição abstrata pelo front-end e, em seguida, otimizado e montado pelo back-end. Se você escrever, semântica, o mesmo código no Fortran ou no C, o compilador produzirá, nos dois casos, o mesmo assembly que será executado com a mesma rapidez.
Isso agora leva ao meu segundo ponto: por que ainda vemos diferenças? O problema é que a maioria das comparações é feita pelos programadores do Fortran tentando algo em C ou vice-versa. Já reparou como a maioria dos autores ou poetas prefere escrever em seus idiomas nativos? Você gostaria de escrever poesia em um idioma em que não se sinta completamente confiante ou em casa? Claro que não ... eu mesmo considero C a minha linguagem de programação "nativa". No entanto, também passei três anos trabalhando em um grupo que usava apenas o Fortran, no qual atingi um certo nível de fluência. Entretanto, eu nunca escreveria nada sozinho no Fortran, pois estou mais à vontade com C e, como conseqüência, o código resultante será melhor , independentemente do que você definir.
Portanto, a principal diferença está no programador, não no idioma. Então não há diferenças? Bem, não exatamente. Aqui estão alguns exemplos:
SIMD: Seja SSE, SSE3 ou AltiVec, se você quiser usá-los no Fortran, é melhor esperar e rezar para que o compilador adivinhe exatamente o que você deseja e faça isso. Boa sorte. Em C, você geralmente possui funções intrínsecas para cada arquitetura ou, mais recentemente, tipos gerais de vetores SIMD no gcc . A maioria dos compiladores Fortran usará apenas instruções SIMD para desenrolar os loops, mas se você tiver um kernel que funcione em vetores curtos de dados de maneira não óbvia, o compilador provavelmente não o verá.
Arquiteturas de hardware diferentes: Toda a arquitetura CUDA é construída em torno de kernels em C. Sim, o Portland Group agora também possui um compilador fortran compatível com CUDA , mas é comercial e, o mais importante, não é da NVIDIA. O mesmo vale para o OpenCL, para o qual o melhor que pude encontrar é um projeto recente que suporta apenas algumas chamadas básicas.
Programação paralela: Sim, o MPI e o OpenMP funcionam bem com o C e o Fortran. No entanto, se você quiser um controle real de seus threads, ou seja, se você tiver um cálculo de memória compartilhada totalmente dinâmico, estará no frio com o Fortran. Em C, você tem os pthreads padrão que, embora não sejam quentes e difusos, ainda o levarão pela tempestade. Em geral, a maioria dos cálculos que dependem do acesso ao sistema operacional, por exemplo, threads, processos, sistema de arquivos, etc ... é melhor atendida com C. Ah, e não tente fazer sua própria rede com o Fortran.
Facilidade de uso: o Fortran está mais próximo do Matlab do que o C. Depois de ler todas as palavras-chave diferentes e como declarar variáveis, o restante do código se parece com o Matlab, tornando-o mais acessível para usuários com experiência limitada em programação.
Interoperabilidade: Quando você cria uma estrutura em C, o layout dos dados reais é direto e determinístico. No Fortran, se você usar matrizes de ponteiro ou dados estruturados, o layout real dos dados depende fortemente do compilador, não é direto e geralmente é completamente sem documentos. Você pode chamar C do Fortran e vice-versa, mas não comece a pensar que pode ser tão fácil transmitir algo além de uma matriz estática de um para o outro e vice-versa.
Isso tudo é um pouco nerd, de baixo nível, mas estamos falando de computação de alto desempenho, certo? Se você não está interessado em explorar melhor os paradigmas de hardware subjacentes, como implementar e / ou desenvolver algoritmos que são melhores para memória compartilhada / distribuída, threads, vetorização SIMD, GPUs usando SIMT e assim por diante, então você está apenas fazendo contas em um computador.
Isso ficou muito mais tempo do que qualquer coisa que eu entendesse, então aqui está um resumo - um conjunto de mensagens de tipo:
- Você vai escrever o melhor código que você pode na língua que você sabe melhor.
- Não há diferença na qualidade do código produzido por dois compiladores que usam o mesmo back-end - somos nós que escrevemos códigos incorretos em um idioma ou outro.
- Apesar de parecer um nível mais baixo, o Fortran é uma abstração de alto nível e não permite acessar diretamente certos recursos de hardware / sistema operacional, como SIMD, threads, redes, etc.