Control Flow
Capitulo 6
Control Flow
Control Flow o Ordering
Determina que se hace primero y que después en determinadas tareas.
Control Flow
- Para los L.P. Iterativos esto es fundamental.
- En otros paradigmas el compilador/interprete se encarga de esto.
Los mecanismos L.P. para determinar el orden:
- Sequncing
- Selection
- Iteration
- Procedural Abstraction
- Recursion
- Concurrency
- Exception Handling
- Nondeterminancy
int foo(int x) {
return x*2;
}
int sum(int n){
if (n<=0) then
return 0
else
return n+sum(n-1)
}
int main() {
int a = 2
a = foo(a)
foo(1);
a = sum(10)
int b = 2
int x = a/b
return 0
}
Pythontutor
Nondeterminacy
- Las construcciones no deterministas elige entre alternativas sin especificar (no determinadas)
- Es utilizado para programas concurrentes
loop
toss coin
if heads, send read to server
if tails, send write to server
loop
receive Read:
send data
OR
receive Write:
send reply
Cliente
Servidor
CSP Guarded Commands
CSP
Communicating Sequential Processes
if (a>b) max = a;
else max = b;
if (a>=b) max = a;
else max = b;
//Esto siempre produce el mismo resultado si a=b
if a>=b -> max:=a;
[] b>=a -> max:=b;
fi
//El resultado de esto es aleatorio si a=b
Expresiones
Expresiones
- Objetos (ej, variable)
- Funciones
- Operadores
Operadores
- Prefix
- Infix
- Posfix
- + 3 4
- 3 + 4
- i++
Precedencia
- if (a<b and c<d)
- if (a< (b and c) <d)
Associativity
- Usualmente left-to-right
Operador ** en Fortran
- Es right-to-left
x ** y = x ^ y
// entonces
2**3**4
//equivale a 2^(3^4) en vez de (2^3)^4.
Asignaciones
caso de contextos
Imperativo
int sum(int n){
int val=0;
for(int i=0,i<=n;i++){
val+=i;
}
return val;
}
Funcional
int sum(int n){
if (n<=0) then
return 0
else
return n+sum(n-1)
}
Imperativo
//comparativo javascript
function sum1(n) {
if(n<=0)
return 0;
else
return n + sum1(n - 1);
}
function sum2(n) {
var val = 0;
for(var i=0;i<=n;i++)
val+=i;
return val
}
x = sum2(10);
Title Text
- Imperativo, los cambios de val son dentro del contexto de sum
- Funcional, los cambios de n se hacen entro los contextos de sum
Variables
- Value model
- Reference model
Value model
- l-values son las referencias
- r-values son los valores
b = 2;
a = b;
seria
mem(1024)= 2;
mem(2036)= 2;
Reference model
- Ambos lados son referencias
b = 2;
a = b;
mem(1024)= loc(2);
mem(2036)= mem(1024);
Inicializacion de expresiones
// Implicita
$a = 3+8;
//Explicita
int z;
z=1+1;
Ortogonalidad
Orthogonal = statistically independent
Significa que una caracteristica del L.P se puede utilizar en cualquier combinacion y el significado se mantiene consistente. Algol 68
Ortogonalidad
Cambiar X no cambia B
Orthogonality System
Radio: Cambiar de estacion no cambia el Volumne.
Non-Orthogonality System
Helicoptero: Cambiar la velicidad, cambia la direccion.
if(a=b){ }
if(a==b){ }
//Non-Orthogonality C
//If you have a set of constructs.
//A language is said to be orthogonal if it allows the programmer
//to mix these constructs freely.
//For example, in C you can't return an array(static array),
//C is said to be unorthognal in this case:
int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the P.L. allows passing arrays.
// So, it is unorthognal in case.
Expresiones
Short-Circuit
p = my_list;
while (p && p->key != val)
p=p->next
Structured Flow
vrs
Unstructured Flow
Unstructured Flow
GOTO statement
- Spaghetti code
- Difícil debugging
Casos especiales
- Break & Continue
- Early returns
- Exceptions & Errrors
Ejemplos (Java)
Iteraciones & Recursion
- Lenguajes Imperativos, Iteraciones
- Lenguajes Funcionales, Recursividad
Iteraciones
//Enumeracion
for (int i=0;i<=10;i++){
...
}
//Logico
int i = 0;
while (i<=10){
...
i++;
}
//Variantes: Post-test, Midtest y Pre-test
Recursion
- No tiene sintaxis definida
- Es igual de poderoso que iteraciones-logicas
int gcd(int a,int b){
if(a ==b) return a;
else if (a>b) return gcd(a-b,b);
else return gcd(a,b);
}
int gcd(int a,int b){
while(a!=b){
if(a>b) { a = a-b;}
else {b = b-a;}
}
return a;
}
int gcd(int a,int b){
if(a ==b) return a;
else if (a>b) return gcd(a-b,b);
else return gcd(a,b);
}
int gcd(int a,int b){
int x;
if(a ==b) x=a;
else if (a>b) x= gcd(a-b,b);
else x= gcd(a,b);
return x;
}
Tail Recursion
La ventaja de la Tail Recursion, es que el espacio se puede re-utilizar
Control Flow
By Mijail Paz
Control Flow
- 958