Un if realmente se lee cuando la condición es falsa?

Iniciado por z3nth10n, 28 Septiembre 2013, 21:12 PM

0 Miembros y 3 Visitantes están viendo este tema.

z3nth10n

Hola buenas, pues puede parecer una pregunta un poco lógica, pero realmente un if (de cualquier lenguaje de programación) es leído por el compilador de dicho lenguaje (aunque no se ejecute lo que contenga dentro) cuando su condición es falsa?

Un saludo.




Según he estado leyendo, el compilador, lee todo, y luego, va clasificando, y si un if es falso, se lo salta...

Ahora la pregunta, como la gente puede saber eso? Como es de fácil o difícil? :huh:

Puede que este tema venga a parecer un poco offtopic, pero bueno, realmente nunca se han cuestionado esto? >:D

Interesados hablad por Discord.

leogtz

No he entendido bien la pregunta.

if(condicion == true) {
    // SE EJECUTA.
} else {
    // Si la condición es falsa.
}
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

z3nth10n

A ver, no es dentro del código, dentro del compilador, como dije:

Citarel compilador, lee todo, y luego, va clasificando, y si un if es falso, se lo salta...

Me pregunto, como la gente llega a esas conclusiones, bueno, a no ser que sean los mismos programadores del compilador, entonces... Como pueden llegar a extraer dicha información y conclusiones? :huh:

Interesados hablad por Discord.

Juan.

Depende del lenguaje, en C# y por ende VB no se evalua si el compilador puede deducir que es falsa, no solo con los if, las variables no inicializadas nunca llegan a reservarse memoria por poner otro ejemplo. En ese sentido es algo inteligente y predice lo que ocurrirá

Otros lenguajes no tienen esa capacidad

~

Si hablamos en tiempo de compilación, incluso compiladores antiguos como el de Turbo C++ (para DOS) tenían la capacidad de detectar cosas como si había variables que nunca se usaban o código que nunca se iba a ejecutar (si estaba despúes de un return y no había ningún goto hacia este).

La dificultad de hacer eso depende de la complejidad del problema y es una tarea mejor realizada por un proceso automático porque requiere llevar el control de las variables que nunca se modificaron y también de las porciones de código que quedaron fuera del flujo normal de ejecución en todos los casos.





Si hablamos en tiempo de ejecución, tenemos que recordar que los compiladores modernos aplican optimizaciones, y el código generado casi nunca refleja el código fuente original.

Pero en términos generales, tenemos que tener una idea de cómo corre el código de máquina o bytecode en cuanto a las decisiones condicionales.

Para un IF, se aplican un grupo de reglas de precedencia de paréntesis, y cómo actuar ante combinaciones de AND y OR lógicos.

Por ejemplo, si tenemos 5 variables con AND:

if(variable1 && variable2 && variable3 && variable4 && variable5)
{

}



El programa tiene que asegurarse de que ambas variables/condiciones/expresiones se cumplan. Si la primera, o segunda o tercera variable/condición/expresión no se cumple, entonces efectivamente llega hasta ahí y se salta comprobar el resto de expresiones. Un AND debe comprobar hasta el final, o saltarse el resto de la comprobación del IF sin ejecutar lo que contiene tan pronto como una condición no se cumpla.


Por ejemplo, si tenemos 5 variables con OR:

if(variable1 || variable2 || variable3 || variable4 || variable5)
{

}



En este caso, si la primera, o segunda variables se cumplen, entonces se salta el resto de la comprobación y ejecuta lo que contiene el IF. Con OR, lo que contiene el IF se ejecuta tan pronto como se cumple una condición, ejecuta lo que contiene, y se salta el resto de las expresiones del IF.

Con paréntesis y combinaciones de AND y OR esto se vuelve más complejo, pero es una cuestión de resolver paso a paso cada nivel de paréntesis en la secuencia correcta, y podemos ver para muchos casos qué partes de la expresión del IF se van a ejecutar y cuáles se van a saltar. Los casos en los que todas las expresiones de un IF se cumplen son una minoría.

También debemos recordar el comportamiento de las instrucciones, por ejemplo para procesadores x86, que sirven para saltos condicionales. Tenemos, entre otras, ja (mayor sin signo), jae (mayor o igual sin signo), jb (menor sin signo), jbe (menor o igual sin signo), je (igual), jne (no igual), además de usar jmp (salto incondicional) como útlimo recurso cuando todo el IF no se cumplió. Para OR, es más eficiente usar el caso de la instrucción directamente reflejada por la expresión lógica, y para AND, es más eficiente usar la operación de salto condicional opuesta al de la expresión en el código fuente.
Sitio web (si la siguiente imagen no aparece es porque está offline):

z3nth10n


Interesados hablad por Discord.

$Edu$

Tu lo que quieres saber es aprender ingenieria inversa junto con lenguaje ensamblador para aprender como funciona un procesador, la memoria, ahi sabras como se ejecuta cada cosa.

BlackM4ster

Hay varios tipos de compiladores. Los hay que leen el código entero, lo compilan, y luego ejecutan y los que van compilando y ejecutando linea a linea.

Algunos de linea a linea, nunca llegan a compilar ciertas cosas
- Pásate por mi web -
https://codeisc.com

z3nth10n

Cita de: BlackM4ster en 30 Septiembre 2013, 08:25 AM
Hay varios tipos de compiladores. Los hay que leen el código entero, lo compilan, y luego ejecutan y los que van compilando y ejecutando linea a linea.

Algunos de linea a linea, nunca llegan a compilar ciertas cosas

Y como se como funciona el mío? :P

Interesados hablad por Discord.

ABDERRAMAH

hay que ver los códigos generados por el compilador, normalmente necesitaras dominar ensamblador para leerlo. compilar linea a linea esta mal expresado, porque compilar, la misma palabra hace referencia a juntar todos los codigos maquina necesarios para crear el programa. Eso se llama interpretar, y en ese caso deberias debuguear el codigo mientras se ejecuta, y todo sera mas ilegible.