VinBR

LP 26/09/2011

Oct 2nd, 2011
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.74 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. Hoje estamos falando sobre a compilação de linguagens funcionais
  9.  
  10. Começamos falando sobre onde ficam armazenadas as "variáveis" de SML.
  11.  
  12. Como o programa é imediatamente executado essas variáveis ficam armazenadas em Registrador ou em cache.
  13.  
  14. CONCEITO:
  15. Hoje os hardwares usam o sistema Fon Noimann ou seja, armazenam os dados e o código do programa no mesmo sistema de memória.
  16. Outros modelos utilizam dispositivos separados para armazenar os dados e o código.
  17.  
  18. // Notas:
  19. Esse Fon Noimann foi na verdade um matemático. E quem realmente inventou esse sistema foram outras duas pessoas.
  20. Ele trabalhava no projeto Manhattan.
  21.  
  22. Ele tem várias conquistas na vida dele, porém acabou ficando famoso por esse artigo que nem era realmente da autoria dele.
  23. Um comentário era que ele era extremamente inteligente e rápido de pensamento, e todos os que o conheceram comentavam isso.
  24.  
  25. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  26.  
  27. Como chama a area de memória onde ficam armazenadas as informações de uma função recém ativada?
  28. É o registro de ativação da função.
  29.  
  30. O que se armazena nesse espaço?
  31. Endereço de retorno.
  32. Argumentos da função.
  33. E variáveis locais.
  34. // PS: esse registro que acabo de descrever é o registro de ativação estático, ou seja é alocado em tempo de compilação.
  35.  
  36. Vantagens:
  37. Fácil compilação (é fácil implementar um compilador)
  38.  
  39. Desvantagens:
  40. Não se pode ter recursão.
  41. Não se pode ter multi-threading, pois duas threads rodando sobre o mesmo programa não poderiam chamar a mesma função ao mesmo tempo.
  42. pois as variáveis só seriam alocadas uma vez.
  43.  
  44. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  45.  
  46. Qual o tempo de vida de uma função e de todo seu registro de ativação?
  47. É o tempo entre a chamada da função e seu retorno, e o mesmo vale para todas as suas variáveis, endereço de retorno e argumentos.
  48.  
  49. Existem variáveis locais que sobrevivem ao tempo de vida da função?
  50. Existem. Elas são as variáveis estáticas e existem em algumas linguagens de programação.
  51. Essas variáveis ficam alocadas em tempo de compilação juntamente com as variáveis globais.
  52. Porém só podem ser referenciadas de dentro do escopo da função.
  53.  
  54. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  55.  
  56. O conceito de alocação dinâmica surgiu com LISP e OLGOL
  57.  
  58. Com essa nova característica surge um novo dado nos registros de ativação das funções.
  59.  
  60. Agora o registro de ativação contém um ponteiro para o último registro de ativação e não apenas para a posição do código de onde ela partiu.
  61. O motivo é que agora voce pode ter vários registros de ativação da mesma função. E assim voce armazenada cada registro em uma posição diferente.
  62. E portanto a posição do código não é mais a única informação importante.
  63.  
  64. É possível uma mesma função apresentar registros de ativação de tamanhos diferentes?
  65. Sim.
  66. Ex:
  67. int foo (int n)
  68. {
  69. int a[n];
  70. a[0]=1;
  71. return a[0];
  72. }
  73. A variável a é um arranjo de n elementos e n vai ser diferente para cada chamada da função, por isso o tamanho do registro se torna variável.
  74.  
  75. O professor mandou agente pesquisar sobre o criador do merge sort (de novo eu acho)
  76. O criador é o Jhon Von Neumann acabei de pesquisar.
  77.  
  78. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  79.  
  80. Uma ultima informação que fica contida no registro de ativação modernos é o registro de aninhamento.
  81. Para que serve ele? Para saber quem é a função mãe dele, da qual ele deverá buscar variáveis que ele não encontrar declaradas nele.
  82.  
  83. Voces se lembram do exemplo da aula do dia 19/09/2011?
  84.  
  85. val one = 1;
  86.  
  87. fun inc x = x + one;
  88.  
  89. fun foo x =
  90. let
  91. val one = 2;
  92. in
  93. inc x
  94. end
  95.  
  96. foo 5;
  97.  
  98. O que garante que o resultado dessa chamada "foo 5" será igual a 6 e não 7 é o registro de aninhamento.
  99. Ou seja é um registro de onde a função foi declarada, e pode ser recursivo já que ele apontará para um outro registro de ativação.
  100.  
  101. Agora vem a pergunta porque ele aponta para outro registro de ativação de a variável do exemplo tem um valor fixo?
  102. Porque nada garante que esse valor seja fixo né, eu posso colocar uma expressão para definir o valor de one.
  103.  
  104. Assim a função vai buscando na função mãe a variável buscada, se não encontrar ele segue o registro de aninhamento da mãe e assim por diante.
  105.  
  106. Note então que a complexidade disso é linear no nível de aninhamento e não no nível de chamadas.
  107.  
  108. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  109.  
  110. CONCEITO:
  111. Variáveis livres são variáveis que são declaradas fora da função.
  112. Assim uma variável pode ser declarada em uma função mãe, e referenciada por uma função filha.
  113.  
  114. Note que é esse o caso da variável one no exemplo acima da função "foo"
  115.  
  116. E isso que faz ela livre, o valor dela é livre de qualquer parâmetro da função em sí e dependente apenas da função mãe.
  117.  
  118. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  119.  
  120. Reflexão sobre funções de Alta Ordem (funções que retornam funções):
  121.  
  122. - Agora sobre aquela história de retornar uma função em sml?
  123.  
  124. Será que quando voce tem uma função que "cria" outra função do tipo: int -> int -> int, por exemplo.
  125. ela re-escreve a função toda escrevendo àquela variável como constante em tempo de execução?
  126.  
  127. Não na verdade isso seria ineficiente.
  128. Na prática é utilizado um sistema de closure, que é mais eficiente.
  129. O closure é um par de ponteiro para função mais um ponteiro para lista de ativação de variáveis livres.
  130. Assim a função que é "criada" na verdade já existia, e ela precisa apenas de acessar a variável local definda na função mãe por assim dizer.
  131. Essa lista é criada juntamente com a chamada da função (em tempo de execução).
  132. E só é desalocada (em SML) quando o coletor de lixo decidir que é o momento.
  133.  
  134. Interessante?
  135.  
  136. // Bem é o fim da aula =].
Advertisement
Add Comment
Please, Sign In to add comment