Fortran tem um lugar especial na programação numérica. Você certamente pode criar software bom e rápido em outros idiomas, mas o Fortran continua com um desempenho muito bom, apesar da idade. Além disso, é mais fácil criar programas rápidos no Fortran. Criei programas rápidos em C ++, mas você precisa ter mais cuidado com coisas como alias de ponteiro. Então, tem que haver uma razão para isso, e uma muito técnica. É porque o compilador pode otimizar mais? Eu realmente gostaria de saber detalhes técnicos, portanto, se eu usar outro idioma, posso levar essas coisas em consideração.
Por exemplo, eu sei - ou acho - que uma coisa é que o padrão especifica que os ponteiros são contíguos na memória sempre, o que significa acesso mais rápido à memória. Eu acredito que você pode fazer isso em C ++, dando uma bandeira ao compilador. Dessa forma, ajuda a saber o que o Fortran faz bem, para que, se estiver usando outro idioma, possamos imitar isso.
fonte
Respostas:
Os designers de idiomas enfrentam muitas opções. Ken Kennedy enfatizou duas: (1) melhores abstrações e (2) código de nível superior ou inferior (menos ou mais semelhante a uma máquina). Enquanto linguagens funcionais como Haskell e Scheme se concentram nas primeiras, linguagens tradicionais de computação científica como Fortran e C / C ++ se concentraram na segunda. Dizer que um idioma é mais rápido que o outro geralmente é bastante enganador: cada idioma tem um domínio de problemas pelo qual se destaca. O Fortran se sai melhor no domínio dos códigos numéricos baseados em array do que em outros idiomas por dois motivos básicos: seu modelo de array e sua explicitação.
Modelo de matriz
Os programadores do Fortran fazem grande parte das manipulações de array. Para isso, o Fortran facilita várias otimizações do compilador que não estão disponíveis em outros idiomas. O melhor exemplo é a vetorização: conhecer o layout dos dados permite que o compilador invoque intrínsecos no nível da montagem sobre a matriz.
Explicitação do idioma
Embora pareça que uma linguagem mais simples compile "melhor" do que uma mais complexa, esse não é realmente o caso. Quando se escreve em uma linguagem assembly , não há muito o que um compilador possa fazer: tudo o que vê são instruções muito refinadas. O Fortran requer explicitação (portanto, mais trabalho do programador) apenas nos casos que geram recompensas reais para a computação baseada em array. O Fortran usa tipos de dados simples, fluxo de controle básico e namespaces limitados; por outro lado, não informa ao computador como carregar registros (o que pode ser necessário em tempo real ). Onde o Fortran é explícito, ele permite coisas como inferência completa de tipos, o que ajuda os iniciantes a começar. Também evita uma coisa que muitas vezes torna o C lento:ponteiros opacos .
Fortran pode ser lento
O Fortran não é rápido para todas as tarefas: é por isso que muitas pessoas não o usam para criar GUIs ou mesmo para computação científica altamente não estruturada. Depois que você sai do mundo das matrizes para gráficos, árvores de decisão e outras regiões, essa vantagem de velocidade desaparece rapidamente. Veja os benchmarks de linguagem de computador para alguns exemplos e números.
fonte
O design do Fortran permite que o compilador execute otimizações mais fortes em alguns casos, otimizações que geralmente não estão disponíveis para C.
Um exemplo famoso é o tratamento do alias . No Fortran, você pode acessar uma área de memória específica apenas através do símbolo específico associado a essa área de memória. Esse conhecimento permite que o compilador use truques inteligentes na hora de armazenar em cache: ele sabe se um valor foi potencialmente alterado ou não. Até a F90, isso foi verificado facilmente. Quando Fortran 90 introduzida
pointers
, a suposição não era verdade: você pode acessar a mesma área de memória através de dois símbolos (ou mais). Essa é a razão pela qual você deve especificar astarget
matrizes que deseja endereçar por meio de ponteiros.Outro fato interessante é que muitas construções permitem que o compilador execute paralelização sem intervenção do usuário. Esse luxo é possível devido ao relativo "agnosticismo da plataforma" de Fortran como idioma.
Existem muitos outros truques sutis como este. Além disso, lembre-se de que ninguém usa o Fortran hoje, exceto para cálculos numéricos, o que significa que o principal recurso e ponto de venda dos compiladores Fortran é a velocidade resultante do código. Como resultado, os fornecedores se concentraram nisso.
No entanto, você pode produzir código de desempenho também com outros idiomas. Pode, no entanto, exigir cuidados especiais ou intervenção humana. O ponto geral, no entanto, é que o desempenho não é um problema até que haja um problema, e o tempo de trabalho é muito mais caro que o tempo do computador. Portanto, as práticas de codificação devem se concentrar em economizar tempo humano, em vez de tempo no computador.
fonte
Não acho que Fortran seja tão próximo do metal (veja outra resposta), mas tende a otimizar com muita facilidade. Os loops são simples, e o idioma suporta extensões de vetorização (ok, quando eu o usei no meu primeiro trabalho, tínhamos como alvo uma ampla gama de ferro grande de vetor).
Há também o grande fator de inércia. Muitos códigos numéricos estão no Fortran; portanto, os construtores de servidores e supercomputadores avançados garantem que escrevam bem os otimizadores do Fortran. Os compiladores são bons (mesmo em máquinas com uma relativa falta de compiladores de alta qualidade), portanto os usuários continuam a usar o Fortran e até escrevem novos códigos nele. Assim, os construtores garantem que sua próxima geração tenha bons compiladores, etc ...
fonte
Tenha cuidado com os mitos urbanos aqui. Se dois compiladores gerarem o mesmo código de montagem, os programas resultantes terão o mesmo desempenho.
Para qualquer peça de lógica, existe um programa em linguagem assembly que minimiza o tempo de execução. Esse programa não se importa com qual compilador o gerou.
Dito isto, existem linguagens compiladas para facilitar a vida do programador. Parte do custo disso é que eles podem tentar o usuário a usar recursos que não resultam em tempo de execução mínimo. O principal exemplo disso é
new
em C ++. (Quão lento pode ser - são apenas três caracteres?) Praticamente implora que você aloque dinamicamente a memória e não preste atenção ao custo de tempo de execução. Se é isso que você quer fazer, isso é fantástico, mas o Fortran pode ser mais rápido só porque não o incentivou a fazer isso.Mas muito além disso, eu nunca vi um programa que, como o primeiro escrito, não tem grande espaço para melhorias do tipo que o compilador nunca poderia limpar para você desempenho. Como exemplo, gastar uma grande fração do tempo ligando
exp
e / oulog
repetidamente com o mesmo argumento. Como outro exemplo, chamar DGEMM para multiplicar matrizes e descobrir que uma grande fração de tempo entra em chamar LSAME apenas para decifrar seus argumentos de caracteres de entrada.Isso ocorre ao mesmo tempo em que as pessoas dizem que o Fortran é mais rápido devido ao alias do ponteiro ou ao desenrolar do loop. É como dizer que um ônibus fabricado pela Porsche certamente seria mais rápido que um ônibus fabricado pela Chevrolet. Precisa haver um pouco de bom senso.
fonte