En su mayoría desarrollo utilizando C#, pero creo que esta pregunta también podría ser adecuada para otros idiomas.
Además, parece que hay un montón de código aquí, pero la pregunta es muy simple.¿Cómo se incorpora un método con una ruta de retorno absoluta?
Alinear, como yo lo entiendo, es el compilador (en el caso de C# la Máquina Virtual) reemplazando una llamada a método insertando el cuerpo del método en cada lugar desde el que se invocó el método.
Digamos que tengo el siguiente programa:
static Main()
{
int number = 7;
bool a;
a = IsEven(number);
Console.WriteLine(a);
}
... el cuerpo del método IsEven
:
bool IsEven(int n)
{
if (n % 2 == 0) // Two conditional return paths
return true;
else
return false;
}
pude entender cómo el código se verá como después inlining el método:
static Main()
{
int number = 7;
bool a;
if (number % 2 == 0)
a = true;
else
a = false;
Console.WriteLine(a); // Will print true if 'number' is even, otherwise false
}
Un programa obviamente simple y correcto.
Pero si modifico el cuerpo de IsEven
un poco para incluir una vía de retorno absoluto ...
bool IsEven(int n)
{
if (n % 2 == 0)
return true;
return false; // <- Absolute return path!
}
personalmente me gusta este estilo un poco más en algunas situaciones. Algunas herramientas de refracción incluso pueden sugerir que cambie la primera versión para que se vea como esta, pero cuando traté de imaginar cómo sería este método cuando está impreso, me quedé perplejo.
Si Inline la segunda versión del método:
static Main()
{
int number = 7;
bool a;
if (number % 2 == 0)
a = true;
a = false;
Console.WriteLine(a); // Will always print false!
}
La pregunta que debe hacerse:
¿Cómo funciona el compilador/acuerdo de máquina virtual con inlining un método que tiene una trayectoria de retorno absoluto?
Parece extremadamente improbable que algo así evite realmente la creación de métodos, por lo que me pregunto cómo se manejan. Tal vez el proceso de inline no es tan simple como esto? ¿Tal vez una versión es más probable que esté en línea por la VM?
Editar: perfilar ambos métodos (y procesos en línea manual de la primera de ellas) no mostró diferencias en el rendimiento, por lo que sólo puede suponer que ambos métodos consiguen entre líneas y el trabajo de la misma manera o similar (al menos en mi VM).
Además, estos métodos son extremadamente simples y parecen casi intercambiables, pero los métodos complejos con rutas de retorno absolutas pueden ser mucho más difíciles de cambiar en versiones sin rutas de retorno absolutas.
Y por cierto: este mecanismo de ruptura while (verdadero) también es útil para otras cosas: no lo uso a menudo, pero cuando hay un conjunto de operaciones que posiblemente se deben realizar en orden, pero que podrían ser detenido en cualquier momento dado, es útil. De manera similar, se usa en los lenguajes nativos para simular el constructo "finalmente" cuando no lo tienen (lo usé bastante en algunos proyectos) –