Uma das fases de um compilador é a geração de código. A respeito dessa fase considere as afirmativas abaixo:
I - Um gerador de código é composto por três tarefas principais, a saber: seleção de instrução, alocação e atribuição de registrador e escalonamento de instruções.
II - A seleção de instruções compreende a escolha de instruções apropriadas da arquitetura alvo para implementar os comandos da representação intermediária. Uma solução para esse problema é realizar a seleção de instruções por reescrita de árvore.
III - O escalonamento de instruções envolve a decisão a respeito da ordem em que a execução das instruções deve ser escalonada. Uma abordagem para resolver esse problema é o uso do algoritmo Sethi–Ullman.
IV - A alocação e atribuição de registrador decidem quais valores devem ser mantidos em registradores e quais registradores usar. Para resolver esse problema pode-se adotar estratégias de alocação de registradores por coloração de grafos.
Assinale a alternativa que apresenta apenas afirmações corretas: