Evaluación de cortocircuitoLa evaluación de corto-circuito,[1] evaluación mínima, o evaluación McCarthy (por el científico John McCarthy) denota la semántica de algunos operadores booleanos en algunos lenguajes de programación en los cuales el segundo argumento no se ejecuta o evalúa si el primer argumento de la función La expresión de corto-circuito Los operadores corto-circuito son estructuras de control en vez de simples operadores aritméticos, al igual que no son strict. ALGOL 68 usó "Proceduring" para lograr operadores y procedimientos de corto-circuito definidos por los usuarios. En lenguajes aproximados o imprecisos, los cuales tienen más de dos valores de verdad En lenguajes que emplean una evaluación perezosa por defecto, como Haskell, todas las funciones son efectivamente de "corto-circuito", y no son necesarios operadores especiales de corto-circuito. Soporte en lenguajes comunes de programación
1ABAP en realidad no posee una distinción de los tipos de booleanos. Uso comúnEvitando los efectos colaterales de ejecución en las expresiones secundariasEjemplo común. int denom = 0;
if (denom && num/denom) {
... // asegura que no se produzca un error al calcular num/denom es decir una división por cero
}
Considere el siguiente ejemplo usando lenguaje Lenguaje C: int a = 0;
if (a && myfunc(b)) {
do_something();
}
En este ejemplo, la evaluación de corto-circuito garantiza que bool is_first_char_valid_alpha_unsafe(const char *p)
{
return isalpha(p[0]); // Fallo de Segmentación altamente posible con p==NULL
}
bool is_first_char_valid_alpha(const char *p)
{
return p != NULL && isalpha(p[0]); // a) es innecesario la ejecución de isalpha() cuando p == NULL, b) No hay riesgo de Fallo de Segmentación
}
Posibles problemasSegunda condición sin verificar dirige a un efecto colateral no ejecutadoA pesar de estos beneficios una evaluación mínima puede causar problema para los programadores que no se den cuenta (o se olviden) que está pasando. Por ejemplo, en el código if (expressionA && myfunc(b)) {
do_something();
}
Si Problemas con las declaraciones incumplidas de efectos secundarios pueden ser resueltos fácilmente con el estilo de programación adecuada, es decir, no usando efectos colaterales en las declaraciones booleanas, así como usando valores con efectos colaterales en las evaluaciones tiende generalmente a producir un código opaco y propenso a errores.[5] Desde que las evaluaciones mínimas son parte de las definiciones de las operaciones semánticas y no (opcional) de una optimización, muchos estilos de codificación se basan en él como un constructor condicional conciso, tal como el lenguaje Perl: some_condition or die; # Cancelar la ejecución si some_condition es falso
some_condition and die; # Cancelar la ejecución si some_condition es verdadero
Eficiencia de la codificaciónSi ambas expresiones usadas como condiciones son simples variables booleanas, puede ser mucho más rápido de evaluar las dos condiciones usadas en las operaciones booleanes de una vez, como si requiriera un simple ciclo de cálculo, en contraposición a uno o dos ciclos usados en las evaluaciones de los circuitos cortos (dependiendo del valor del primero). La diferencia en términos de eficiencia computacional entre estos dos casos depende fuertemente del compilador y del esquema de optimización utilizado; con la correcta optimización estos serán capaces de ejecutarse a la misma velocidad, así como serán compilados a un código máquina idéntico.[6] Un corto-circuito puede llevar a errores en predictor de saltos en los modernos unidaded centrales de procesamiento, y reducir dramáticamente el desempeño (un ejemplo claro es un rayo altamente optimizado con el eje de la caja del código de intersección alineado en el trazado de rayos alineado trazado de rayos). Algunas compilaciones pueden detectar tales casos y emitir una codificación más rápida, pero no siempre es posible debido a violaciones de segmento del lenguaje C. Un código altamente optimizado debería emplear otras formas de hacer esto (como el manual de uso del código de máquina). Referencias
|