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

Made with Slides.com