24.07.2013 Views

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!