Não sei como será a linguagem de programação em 2000, mas sei que ela será chamada FORTRAN.
- Charles Anthony Richard Hoar, aprox. 1982
Na indústria, o Fortran raramente é usado hoje em dia - em uma das listas de idiomas populares, estava em 28º lugar . Mas o Fortran ainda é o idioma principal para simulações em larga escala de sistemas físicos - ou seja, para modelagem astrofísica de estrelas e galáxias (por exemplo, Flash ), dinâmica molecular em larga escala, códigos eletrônicos de contagem de estruturas ( SIESTA ), modelos climáticos etc. No campo da computação de alto desempenho, um subconjunto dos quais são simulações numéricas em larga escala, hoje apenas duas linguagens são usadas - C / C ++ e “Fortran moderno” (Fortran 90/95/03/08). Bibliotecas MPI abertas popularesferramentas de paralelização de código foram desenvolvidas para esses dois idiomas. Em geral, se você precisar de código rápido que seja executado em vários processadores, você terá apenas duas opções. No Fortran moderno, existe um recurso como " coarray ", que permite trabalhar diretamente com a linguagem na programação paralela. Coarray apareceu na extensão Fortran 95 e mais tarde foi incorporado ao Fortran 2008.O uso ativo do Fortran por físicos muitas vezes confunde cientistas da computação e outras pessoas não relacionadas a essa área que acham que Fortran é um anacronismo histórico.Gostaria de explicar por que o Fortran ainda é útil. Não incentivo os estudantes de física a ensinar Fortran - como a maioria deles pesquisa, é melhor estudar C / C ++ (ou parar no Matlab / Octave / Python). Gostaria de explicar por que o Fortran ainda é usado e provar que isso não é apenas porque os físicos estão “atrasados” (embora às vezes seja assim - no ano passado, vi um estudante de física trabalhando com código Fortran 77, enquanto nem ele nem seu gerente ouviram falar sobre Fortran 90). Os cientistas da computação devem ver o domínio de Fortran na computação numérica como um desafio.Antes de me aprofundar no assunto, quero discutir a história, porque quando as pessoas ouvem a palavra "Fortran", imediatamente imaginam cartões perfurados e códigos com linhas numeradas. A primeira especificação Fortran foi escrita em 1954. O Fortran inicial (então seu nome foi escrito em letras maiúsculas, FORTRAN) era, para os padrões modernos, uma linguagem infernal, mas foi um incrível passo à frente em relação à programação anterior de montadores. O FORTRAN costumava ser programado com cartões perfurados, como lembra a professora Miriam Forman, da Stony Brook University, sem prazer. O Fortran tinha muitas versões, das quais as mais famosas são as normas 66, 77, 90, 95, 03 e 08.Costuma-se dizer que o Fortran ainda é usado devido à sua velocidade. Mas ele é o mais rápido? Em benchmarksgame.alioth.debian.orghá uma comparação de C e Fortranem vários testes entre vários idiomas. Na maioria dos casos, o Fortran e o C / C ++ são os mais rápidos. Programadores Python favoritos geralmente ficam para trás em velocidade 100 vezes, mas isso está na ordem das coisas para o código interpretado. Python não é adequado para cálculos numéricos complexos, mas é adequado para outro. Curiosamente, o C / C ++ supera o Fortran em todos os testes, exceto em dois, embora em geral eles diferem pouco nos resultados. Os testes nos quais o Fortran vence, os mais "físicos" são a simulação de um sistema de n corpos e o cálculo do espectro. Os resultados dependem do número de núcleos do processador, por exemplo, o Fortran fica atrás do C / C ++ no quad core. Os testes, nos quais o Fortran fica muito atrás do C / C ++, lê e grava dados na maioria das vezes, e nesse aspecto a lentidão do Fortran é conhecida.Portanto, o C / C ++ é tão rápido quanto o Fortran e, às vezes, um pouco mais rápido. Estamos interessados em "por que os professores de física continuam aconselhando seus alunos a usar Fortran em vez de C / C ++?"Fortran tem código legado
Graças à longa história de Fortran, não é surpreendente que montanhas de código de física estejam escritas nele. Os físicos estão tentando minimizar o tempo de programação; portanto, se encontrarem códigos anteriores, eles os usarão. Mesmo que o código antigo seja ilegível, mal documentado e não seja o mais eficiente, é mais provável que você use o código antigo e comprovado do que escrever um novo. A tarefa dos físicos não é escrever código, eles estão tentando entender a natureza da realidade. Os professores sempre têm o código herdado em mãos (muitas vezes escreveram esse código décadas atrás) e o repassam para seus alunos. Isso economiza tempo e remove incertezas do processo de correção de erros.Estudantes de física aprendem Fortran mais fácil que C / C ++
Eu acho que o Fortran é mais fácil de aprender do que o C / C ++. Fortran 90 e C são muito semelhantes, mas Fortran é mais fácil de escrever. C é uma linguagem relativamente primitiva; portanto, os físicos que escolhem C / C ++ estão envolvidos na programação orientada a objetos. OOP pode ser útil, especialmente em grandes projetos de software, mas estude-o por muito mais tempo. Você precisa estudar abstrações como classes e herança. O paradigma de POO é muito diferente do procedimento utilizado pelo Fortran. O Fortran é baseado em um paradigma processual simples, mais próximo do que acontece sob o capô de um computador. Quando você otimiza / vetoriza o código para aumentar a velocidade, é mais fácil trabalhar com o paradigma processual. Os físicos geralmente entendem como os computadores funcionam e pensam em termos de processos físicos, por exemplo, transferir dados do disco para a RAM e da RAM para o cache do processador.Eles diferem dos matemáticos que preferem pensar em termos de funções abstratas e lógica. Além disso, esse pensamento é diferente do orientado a objetos. A otimização do código OOP é mais complicada do meu ponto de vista do que processual. Objetos são estruturas muito volumosas em comparação com as estruturas de dados preferidas pelos físicos: matrizes.Leveza Um: Trabalho em Matriz Fortran
Matrizes, ou, como os físicos os chamam, matrizes, estão no centro de toda a computação física. No Fortran 90+, você pode encontrar muitas oportunidades de trabalhar com eles, semelhantes ao APL e ao Matlab / Octave. As matrizes podem ser copiadas, multiplicadas por um escalar, multiplicadas entre si de uma maneira muito intuitiva:A = B
A = 3.24*B
C = A*B
B = exp(A)
norm = sqrt(sum(A**2))
Aqui, A, B, C são matrizes de alguma dimensão (digamos, 10x10x10). C = A * B nos fornece a multiplicação elementar de matrizes se A e B são do mesmo tamanho. Para multiplicação de matrizes, C = matmul (A, B) é usado. Quase todas as funções internas do Fortran (Sin (), Exp (), Abs (), Piso () etc.) recebem matrizes como argumentos, o que leva a um código simples e limpo. Simplesmente não há código semelhante no C / C ++. Em uma implementação básica de C / C ++, basta copiar uma matriz para executar loops em todos os elementos ou chamar uma função de biblioteca. Se você alimentar uma matriz da função de biblioteca incorreta em C, ocorrerá um erro. A necessidade de usar bibliotecas em vez de funções internas significa que o código resultante não será limpo, portátil ou fácil de aprender.No Fortran, o acesso aos elementos de uma matriz funciona através da sintaxe simples A [x, y, z], quando em C / C ++ você precisa escrever A [x] [y] [z]. Os elementos das matrizes começam com 1, o que corresponde ao entendimento das matrizes pelos físicos e, nas matrizes C / C ++, a numeração começa do zero. Aqui estão mais alguns recursos para trabalhar com matrizes no Fortran.A = (/ i , i = 1,100 /)
B = A(1:100:10)
C(10:) = B
Primeiro, o vetor A é criado através de um loop do implícito, também conhecido como construtor de matriz. Em seguida, um vetor B é criado, consistindo em cada décimo elemento de A, usando uma etapa de 10. E, finalmente, a matriz B é copiada para a matriz C, iniciando no décimo elemento. O Fortran suporta a declaração de matrizes com zero ou índices negativos:double precision, dimension(-1:10) :: myArray
Um índice negativo a princípio parece tolo, mas ouvi falar da utilidade deles - por exemplo, imagine que essa é uma área adicional para postar esclarecimentos. O Fortran também suporta índices vetoriais . Por exemplo, você pode transferir os elementos 1,5 e 7 de uma matriz A da dimensão N x 1 para uma matriz B da dimensão 3 x 1:subscripts = (/ 1, 5, 7 /)
B = A(subscripts)
O Fortran suporta máscaras de matriz em todas as funções internas. Por exemplo, se precisarmos calcular o logaritmo de todos os elementos da matriz maiores que zero, usamos:log_of_A = log(A, mask= A .gt. 0)
Ou podemos anular todos os elementos negativos da matriz em uma linha:where(my_array .lt. 0.0) my_array = 0.0
O Fortran facilita a alocação dinâmica e a liberação de matrizes. Por exemplo, para colocar uma matriz bidimensional:real, dimension(:,:), allocatable :: name_of_array
allocate(name_of_array(xdim, ydim))
No C / C ++, isso requer a seguinte entrada :int **array;
array = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++){
array[i] = malloc(ncolumns * sizeof(double));
}
Para liberar uma matriz no Fortrandeallocate(name_of_array)
Em C / C ++ para issofor(i = 0; i < nrows; i++){
free(array[i]);
}
free(array);
:
Em linguagens como C / C ++, todas as variáveis são passadas por valor, com exceção das matrizes que são passadas por referência. Mas, em muitos casos, passar uma matriz por valor faz mais sentido. Por exemplo, deixe os dados consistirem em posições de 100 moléculas em diferentes períodos de tempo. Precisamos analisar o movimento de uma molécula. Pegamos uma fatia da matriz (sub-matriz) correspondente às coordenadas dos átomos nessa molécula e a passamos para a função. Nele, trataremos de uma análise complexa do subarray transmitido. Se passássemos por referência, os dados transferidos não seriam localizados na memória em uma linha. Devido à natureza do acesso à memória, o trabalho com essa matriz seria lento. Se passarmos por valor, criaremos na memória uma nova matriz organizada em uma linha. Para o deleite dos físicos, o compilador assume todo o trabalho sujo de otimizar a memória.No Fortran, as variáveis geralmente são passadas por referência, não por valor. Sob o capô, o compilador Fortran otimiza automaticamente sua transmissão para aumentar a eficiência. Do ponto de vista do professor no campo da otimização do uso da memória, o compilador deve ter mais confiança do que o aluno! Como resultado, os físicos raramente usam ponteiros, embora Fortran-90 + eles têm .Mais alguns exemplos das diferenças entre Fortran e C
O Fortran possui várias opções para gerenciar o compilador ao solucionar problemas e otimizar. Erros no código podem ser detectados no estágio de compilação e não durante a execução. Por exemplo, qualquer variável pode ser declarada como um parâmetro, ou seja, uma constante.double precision, parameter :: hbar = 6.63e-34
Se o parâmetro no código for alterado, o compilador retornará um erro. Em C, isso é chamado constdouble const hbar = 6.63e-34
O problema é que const real é diferente do real simples. Se uma função que aceita real se torna real, ela retornará um erro. É fácil imaginar como isso pode levar a problemas de interoperabilidade no código.O Fortran também possui uma especificação de intenção que informa ao compilador se o argumento passado para a função é uma entrada, saída ou ambos, um parâmetro de entrada e uma saída. Isso ajuda o compilador a otimizar o código e aumenta sua legibilidade e confiabilidade.O Fortran possui outros recursos que são usados em diferentes frequências. Por exemplo, o Fortran 95 tem a capacidade de declarar funções com o modificador puro. Essa função não tem efeitos colaterais - apenas altera seus argumentos e não altera variáveis globais. Um caso especial dessa função é a função elementar, que aceita e retorna escalares. É usado para processar elementos da matriz. As informações de que a função é pura ou elementar permitem que o compilador execute otimização adicional, especialmente ao paralelizar código.O que esperar no futuro?
Nos cálculos científicos, o Fortran continua sendo o idioma principal e não desaparecerá no futuro próximo. Na pesquisaEntre os visitantes da conferência da Convenção de Supercomputação de 2014 que usam esse idioma, 100% deles disseram que o usariam nos próximos 5 anos. Também resulta da pesquisa que 90% usaram uma mistura de Fortran e C. Antecipando um aumento na mistura dessas linguagens, os criadores da especificação Fortran 2015 incluem mais recursos para interoperabilidade de código. O código Fortran está sendo chamado cada vez mais a partir do código Python. Os cientistas da computação que criticam o uso do Fortran não entendem que esse idioma permanece adaptado exclusivamente para o que recebeu o nome - FOrmula TRANslation, tradução de fórmulas, ou seja, a conversão de fórmulas físicas em código. Muitos deles não sabem que o idioma está evoluindo e inclui constantemente novos recursos.Chamar o Fortran moderno com mais de 90 anos é como chamar o C ++ antigo porque o C foi desenvolvido em 1973. Por outro lado, até o mais novo padrão do Fortran 2008 tem compatibilidade com o Fortran 77 e a maior parte do Fortran 66. Portanto, o desenvolvimento da linguagem está associado a certas dificuldades. Recentemente, os pesquisadores do MIT decidiram superar essas dificuldades desenvolvendo do zero uma linguagem para HPC chamada Julia , lançada pela primeira vez em 2012. Ainda não se sabe se Julia substituirá Fortran. De qualquer forma, suspeito que isso demore muito tempo.