Sunteți pe pagina 1din 9

Mtodos

Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora

Mtodos (Funciones y Procedimientos)


Los procedimientos y funciones son subrutinas que permiten resolver una tarea especfica, la diferencia entre estos dos es que las funciones retornan valores. En programacin orientada a objetos se le llaman especficamente mtodos. Sobre este paradigma los mtodos estan asociados a una clase (mtodos de clase o estticos) o a un objeto (mtodos de instancia). Un mtodo esta compuesto por varias partes: Nombre nico en su mbito (con excepcin cuando tenemos sobrecarga de mtodos) Tipo de dato de retorno (si es que retorna algo) Lista de parmetros (que diferencian mtodos cuando usamos sobrecarga de mtodos) Cdigo ejecutable (algoritmo del mtodo) Podemos agregar otros atributos como: Acceso (publico, privado o protegido) Esttico entre otros Los mtodos almacenan sus variables en el Stack de memoria y tienen un comportamiento de pila. Un mtodo tambin tiene un tamao especfico y esta definido por la cantidad de variables dentro de el. La suma del tamao de cada variable es el tamao del mtodo en el Stack.

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora Suponiendo de que un entero es de tamao de una celda de memoria public static void main(){ int a; int b; int c; } Como el mtodo main es el primero que se ejecuta, es el primero que es colocado en el Stack. Podemos ver en la figura que el mtodo main tiene sus tres variables en la memoria Stack, a esto se le llama mbito del mtodo, osea que ese segmento de memoria le pertenece exclusivamente al mtodo main, y si otro mtodo que fuera llamado ocupara ese espacio, corrompera los datos, provocando error en el programa. Si llamramos a un mtodo: public static void metodo1(){ int a; int b; } public static void main(){ int a; int b; metodo1(); int c; }

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora Ahora cuando el mtodo main esta llamando a metodo1() a este se le asigna un nuevo mbito arriba del mtodo del main, para que no se toquen sus variables. Si llamramos a otro mtodo desde metodo1():

public static void metodo2(){ int z; } public static void metodo1(){ int a; int b; } public static void main(){ int a; int b; metodo1(); int c; }

Ahora tenemos que metodo2() tiene su propio mbito, separado de los dems mtodos. Cuando termina metodo2() de ejecutarse, se regresa al mbito anterior y as sucesivamente.

Y que pasa con los parmetros?? Cuando se llama un mtodo se preparan los parmetros en el Stack de memoria, que quiere decir? Supongamos esto: public static void procesar(int x, int y){ z = y + x; print(z); }

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora public static void main(){ int a = 5, b = 9; procesar(b, a); } Podemos ver que nos quedamos antes de llamar al mtodo, se asignaron valores a las posiciones de memoria de las variables en el mtodo main, ahora, lo siguiente es preparar las variables en el mbito de procesar(int, int), como son variables simples lo que hacemos es pasar los valores por valor, osea, copiamos el valor de las variables en el mbito nuevo.

Ahora despus de pasar los parmetros nos trasladamos al nuevo mbito y se ejecutan las instrucciones que estn en el mtodo. Pero, como diferenciamos los mbitos de cada mtodo?? Vamos a tener una variable especial que nos dar la posicin relativa de los mtodos. En nuestra tabla de smbolos tenemos que las posiciones de las variables siempre comienzan con cero, pero cuando estamos en la pila, podemos ver en el caso del mtodo procesar(int, int), que la variable 'x' esta en la posicin 2 de la pila y no en cero como la variable 'a' del mtodo main.

Pero, respecto el mtodo procesar(int, int) esta en la posicin cero

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora

A nuestra variable de mbito le llamaremos ptr y guardara el valor de donde comienza el mtodo, as cuando tengamos que alcanzar una variable, solo tenemos que sumar su posicin en nuestra tabla de smbolos, la tabla de smbolos del mtodo procesar(int, int) es la siguiente:

Nombre procesar(int, int) x y z

Tipo mbito Rol Posicin Tamao void Mtodo 3 int procesar(int, int) Variable local 0 1 int procesar(int, int) Variable local 1 1 int procesar(int, int) Variable local 2 1

Para alcanzar la variable 'y', usamos a ptr, que en este momento tendria el valor de '2' en cdigo 3Dir quedaria: t1 = ptr + 1; t2 = stack[t1]; Ese '1' lo obtenemos de nuestra tabla de smbolos, entonces al sumar, 't1' tendra un valor de '3' y como podemos ver en la direccin absoluta. Ahora podemos obtener o colocar un valor en esa posicin de memoria, En este caso lo obtendremos.

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora t3 = ptr + 0; t4 = stack[t3]; Ahora en estas lneas obtendremos el valor de 'x' para posteriormente hacer la suma y almacenarla en la direccin de memoria de 'z'. Hacemos la suma correspondiente y luego almacenamos en la variable 'z'.

t5 = t2 + t4;

t6 = ptr + 2; stack[t6] = t5

Obtenemos primero donde esta 'z' en el Stack de memoria. Y por ultimo almacenamos la suma en esa direccin.

Ahora que termina el mtodo, ptr regresa tantas posiciones como el tamao del mtodo que llamo a procesar(int, int), en este caso el mtodo main() que es de tamao 2. Pero que pasa con las variables del mtodo anterior? Simplemente son descartadas, una vez que el mtodo termina, carecen de significado.

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora

Si llamramos a un mtodo nuevo, reescribira los datos que estn en el Stack de memoria, pero eso no importa pues esos valores ya no los necesitamos.

Como preparamos las variables en tres direcciones? Pasaremos los valores del main() hasta procesar(int, int). Usaremos la tabla de smbolos y la variable ptr para poder hacer esto. La tabla de smbolos del mtodo main() quedara de la siguiente forma:

Nombre main() a b

Tipo mbito Rol Posicin void Mtodo int main() Variable Local 0 int main() Variable Local 1

Tamao 2 1 1

t1 = ptr + 1; t2 = stack[t1]; t3 = ptr + 2; t4 = t3 + 0; stack[t4] = t2;

Primero necesitamos obtener la direccin de 'b'. Ahora obtenemos el valor de 'b' en la direccin que tenemos en 't1'. Ahora vamos a desplazarnos fuera del main SIN cambiar ptr, cambiarlo antes de tiempo producira un error fatal. Ahora nos desplazamos en el mbito nuevo hacia la posicin que le corresponde al parmetro. Ahora almacenamos el valor en el Stack en el mbito nuevo.

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora Lo mismo para pasar el otro parmetro: t5 = ptr + 0; t6 = stack[t5]; t7 = ptr + 2; t8 = t7 + 1; stack[t8] = t6; Primero necesitamos obtener la direccin de 'a'. Ahora obtenemos el valor de 'a' en la direccin que tenemos en 't6'. Nos desplazarnos fuera del main, podemos ver que ese '2' lo obtenemos de la tabla de smbolos. Ahora nos desplazamos en el mbito nuevo hacia la posicin que le corresponde al parmetro, en este caso '+1'. Y por ultimo almacenamos el valor en el Stack en el mbito nuevo.

Ahora que terminamos de preparar las variables, nos cambiamos de mbito para saltar hacia procesar(int, int). ptr = ptr + 2; procesar(); ptr = ptr 2; Ahora si cambiamos el valor de ptr, para poder obtener una posicin relativa, respecto procesar(int, int) y por ultimo lo llamamos. Cuando termina el mtodo, regresamos al mbito del mtodo main(). Como podemos ver el '2' que sumamos y restamos para cambiar de mbito lo obtenemos de la tabla de smbolos.

Que pasa si es un mtodo que regresa valores, cambiaremos un poco el cdigo: public static int procesar(int x, int y){ z = y + x; return z; } public static void main(){ int a = 5, b = 9; int resultado = procesar(b, a); }

Mtodos
Organizacin de lenguajes y compiladores 2 Aux. Oscar Estuardo de la Mora

Nombre procesar(int, int) x y z return

Tipo void int int int int

mbito procesar(int, int) procesar(int, int) procesar(int, int) procesar(int, int)

Rol Posicin Tamao Mtodo 4 Variable local 0 1 Variable local 1 1 Variable local 2 1 Variable local 3 1

Cuando tenemos un mtodo que retorna valores, tendremos en nuestra tabla de smbolos una variable extra, y le corresponde al return, este SIEMPRE estar al final del mbito del mtodo, y es considerada una variable local del mismo.

Despus de ejecutar el mtodo y termina regresamos al mbito de main(). Pero necesitamos el valor que esta todava en el mbito de procesar(int, int), el procedimiento para poder obtener dicho valor es el siguiente:

S-ar putea să vă placă și