YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Portuguese, Brazilian subtitles

← 07xps-10 The Living and the Dead Solution

07xps-10 Vivo e Morto - Solução

Get Embed Code
3 Languages

Showing Revision 1 created 02/26/2013 by Lucilia Figueiredo.

  1. Neste execício, pedimos que você removesse código morto,
  2. que é código que não tem nenhum efeito sobre
  3. o resultado retornado pela função que nos interessa.
  4. Então, vamos prosseguir, e fazer exatamente isso.
  5. Pegamos aqui um fragmento -- e lembre-se,
  6. fragmentos têm essa forma, onde a primeira parte
  7. da tupla é a variável à qual atribuímos e
  8. a parte seguinte da tupla é a expressão que
  9. é atribuída a ela -- neste caso, atribuímos a=1,
  10. ou b = a+1,
  11. ou c = 2 etc.
  12. Não estamos realmente preocupados com o que são
  13. especificamente as operações -- não nos importa
  14. que operações são feitas. O que nos importa é
  15. que algo está sendo atribuído a essas variáveis,
  16. porque, se algo está sendo atribuído,
  17. mesmo que o resultado possa ser exatamente o mesmo,
  18. não necessariamente sabemos isso antecipadamente.
  19. Então, se temos um fragemento dessa forma, nós
  20. guardamos isso como old_fragment -- como um fragmento
  21. não otimizado -- este é o primeiro argumento desta função.
  22. E returned é o valor retornado --
  23. é a lista de variáveis retornadas no final do fragmento.
  24. E se elas são retornadas no fianl do fragmento,
  25. elas automaticamente são vivas, como dizemos aqui.
  26. Agora, nós queremos criar um novo fragmento otimizado,
  27. que contenha apenas variáveis vivas. Então, começamos
  28. inicializando isso com a lista vazia e atribuindo à variável
  29. live as variáveis retornadas -- returned --
  30. porque sabemos que estas estão vivas.
  31. Agora, para cada comando do fragmento, começando
  32. do final, de modo que trabalhamos para trás, a partir
  33. do comando return até o início, verificamos se
  34. o primeiro elemento da tupla de comando, isto é,
  35. o lado esquerdo do comando, é uma variável viva, isto é,
  36. se é uma das variáveis de live correntemente.
  37. Se for, então adicionamos este comando ao novo
  38. fragmento otimizado. Caso contrário, descemos
  39. e agora pegamos a lista de variáveis vivas e
  40. removemos a variável à qual estamos fazendo a atribuição.
  41. Então, retiramos tudo isso. Depois disso, atualizamos
  42. a lista live com as variáveis que estão no lado direito
  43. do comando de atribuição. Percorremos todo
  44. o fragmento, fazendo isso repetidamente,
  45. até que chegamos ao inicio. Quando terminamos
  46. isso, verificamos se o novo fragmento é igual
  47. ao antigo fragmento. Se for, então retornamos
  48. o novo fragmento -- nós não alteramos nada e,
  49. portanto, simplesmente retornamos e terminamos.
  50. Se não for, então podemos teer novas otimizações a fazer,
  51. como discutimos anteriormente. Então retornamos, removendo
  52. código morto do novo fragmento.
  53. Então, chamamos isso recursivamente, até que
  54. não haja novas mudanças, já que podem haver
  55. novas otimizações. Agora vamos verificar se
  56. removedead nos dá o que esperamos, quando
  57. o executamos à mào para cada uma das otimizações.
  58. Mas eu não vou mostrar cada uma detalhadamente.
  59. Você pode lê-las muito facilmente e, quando fazemos isso,
  60. podemos ver que obtemos o valor True para cada uma.
  61. Esse é um código muito interessante.
  62. Demora um pouco para entender bem, mas isso
  63. é uma otimização muito útil, porque você pode,
  64. potencialmente, eleminar um bocado de código, fazendo isso.