Corrotina

Em ciência da computação, corrotina é um componente de um programa de computador que generaliza subrotinas para permitir múltiplos pontos de entrada e a suspensão e o resumo da execução em determinados pontos do código. Corrotinas são adequadas para a implementação de componentes como multitarefa, iterador, avaliação preguiçosa e canalização.

O termo foi originado por Melvin Conway em um artigo de 1963.[1]

Comparação com subrotinas

[editar | editar código-fonte]

Corrotinas são mais genéricas que subrotinas. Enquanto o tempo de vida das subrotinas é ditado pela pilha de execução (a última subrotina chamada é a primeira a retornar), o tempo de vida das corrotinas é ditado por seu uso e necessidade.

O início de uma subrotina é o ponto de entrada. Elas só podem retornar uma vez; em contraste, corrotinas pode retornar (trocar de contexto) diversas vezes. O início de uma corrotina é o primeiro ponto de entrada, e pontos seguintes de entrada são seguidos de comandos de troca de contexto. Praticamente, a troca de contexto retorna o resultado para a corrotina que a invocou, assim como uma subrotina. Entretanto, a próxima vez que a corrotina é chamada, a execução é iniciada em um ponto logo após a invocação de troca de contexto.

Segue um exemplo simples da utilidade de corrotinas. Suponha que existe uma relação produtor-consumidor em que uma rotina cria itens e os adiciona a uma fila, e outra rotina remove itens da fila e os usa. O código é o seguinte:

Var f := aloca Fila

Corrotina produtor
    Enquanto f != cheio Faça
        // Cria itens na fila
        troca de contexto para Consumidor
    Fim Enquanto
Fim Corrotina 

Corrotina Consumidor
    Enquanto f != vazio Faça
        // Remove itens da fila
        troca de contexto para Produtor
    Fim Enquanto
Fim Corrotina

A fila é então completamente preenchida ou esvaziada antes da troca de contexto para outra corrotina usado o comando de troca de contexto (geralmente com o nome yield). Novas chamadas à corrotina começam no ponto logo após o comando de troca de contexto.

Referências

  1. M.E. Conway, Design of a separable transition-diagram compiler, Communications of the ACM, Volume 6, Número 7, Julho de 1963