Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
A= 2*A<br />
FUN2= A/C<br />
RETURN<br />
END FUNCTION FUN2<br />
<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 107<br />
Nota-se que ambas as funções alteram o valor de A; portanto, o valor de RES é totalmente dependente na ordem<br />
de execução da expressão.<br />
Como o padrão da linguagem não estabelece uma ordem para a execução das operações e desenvolvimentos<br />
em uma expressão, este efeito lateral é proibido neste caso. Isto possibilita que os compiladores executem as<br />
operações na ordem que otimiza a execução do código.<br />
O uso de funções de efeito lateral em comandos ou construtos FORALL (seção 6.10), por exemplo, acarretaria<br />
em um impedimento severo na otimização da execução do comando em um processador paralelo, efetivamente<br />
anulando o efeito desejado pela definição deste recurso.<br />
Para controlar esta situação, o programador pode assegurar ao compilador que uma determinada rotina<br />
(não somente funções) não possui efeitos laterais ao incluir a palavra-chave PURE à declaração SUBROUTINE ou<br />
FUNCTION:<br />
PURE SUBROUTINE ...<br />
---------------------------<br />
PURE FUNCTION ...<br />
Em termos práticos, esta palavra-chave assegura ao compilador que:<br />
se a rotina é uma função, esta não altera os seus argumentos mudos;<br />
a rotina não altera nenhuma parte de uma variável acessada por associação ao hospedeiro (rotina interna)<br />
ou associação por uso (módulos);<br />
a rotina não possui nenhuma variável local com o atributo SAVE;<br />
a rotina não executa operações em um arquivo externo;<br />
a rotina não contém um comando STOP.<br />
Para assegurar que estes requerimentos sejam cumpridos e que o compilador possa facilmente verificar o seu<br />
cumprimento, as seguintes regras adicionais são impostas:<br />
qualquer argumento mudo que seja o nome de uma rotina e qualquer rotina invocada devem também ser<br />
puras e ter a interface explícita;<br />
as intenções de um argumento mudo qualquer devem ser declaradas, exceto se este seja uma rotina ou um<br />
ponteiro, e a intenção deve sempre ser IN no caso de uma função;<br />
qualquer rotina interna de uma rotina pura também deve ser pura;<br />
uma variável que é acessada por associação ao hospedeiro ou por uso ou é um argumento mudo de intenção<br />
IN não pode ser o alvo de uma atribuição de ponteiro; se a variável é do tipo derivado com uma componente<br />
de ponteiro, ela não pode estar no lado direito de uma atribuição e ela não pode estar associada como o<br />
argumento real de um argumento mudo que seja um ponteiro ou que tenha intenções OUT ou INOUT.<br />
Esta última regra assegura que um ponteiro local não pode causar um efeito lateral.<br />
A principal razão para se permitir subrotinas puras está na possibilidade de seu uso em construtos FORALL.<br />
Porém, ao contrário de funções, uma subrotina pura pode ter argumentos mudos com intenções OUT ou INOUT<br />
ou atributo POINTER. A sua existência também oferece a possibilidade de se fazer chamadas a subrotinas de<br />
dentro de funções puras.<br />
Uma rotina externa ou muda que seja usada como rotina pura deve possuir uma interface explícita que a<br />
caracterize inequivocamente como tal. Contudo, a rotina pode ser usada em outros contextos sejam o uso de<br />
um bloco de interface ou com uma interface que não a caracterize como pura. Isto permite que rotinas em<br />
bibliotecas sejam escritas como puras sem que elas sejam obrigatoriamente usadas como tal.<br />
Todas as funções intrínsecas (capítulo 7) são puras e, portanto, podem ser chamadas livremente de dentro<br />
de qualquer rotina pura. Adicionalmente, a subrotina intrínseca elemental MVBITS (seção 7.9.3) também é pura.<br />
O atributo PURE é dado automaticamente a qualquer rotina que seja definida com o atributo ELEMENTAL<br />
(seção <strong>8.</strong>2.17).<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008