¿Cómo funciona @tailrec?

He usado y leído sobre@tailrec Anotación para tener un método recursivo de cola. He pasado por muchos enlaces que lo explican. Por ejemplo, solo funciona cuando se realizan funciones de auto llamada y no se debe anular, etc.

En todas partes se menciona que lacompiler optimizes. Pero, ¿qué magia / concepto hace el compilador para hacerlo recursivo? Para una función simple a continuación, ¿qué hace el compilador:

@tailrec def fact(acc: Int, n: Int): Int = {
  if (n <= 1) acc
  else fact(n * acc, n - 1)
}
fact(1,10)

Quiero decir, ¿lo convierte en un bucle donde lo llama repetidamente y luego devuelve el valor final? ¿Hay algún enlace al papel que lo explique?

Respuestas a la pregunta(2)

Su respuesta a la pregunta