Wednesday, November 21, 2007

TEMA 5:


Efectos de los entornos sobre los lenguajes

El desarrollo de un lenguaje de programación no tiene lugar en un vacío. El equipo que apoya a un lenguaje tiene gran impacto sobr el diseño del mismo. El lenguaje, como medio para resolver un problema, es parte de la tecnología global que se emplea. El entorno externo que apoya la ejecución de un programa se conoce como su entorno operativo u objetivo. El entorno en el cual un programa se diseña, se codifica, se pone a prueba y se depura, o entorno anfitrion, puede ser diferente del entorno operativo en el cual se usa el programa en el último término.

Cuatro clases de entornos objetivo cubren casi todas las aplicaciones de programación: de procesamiento por lotes, interactivo, de sistema incrustado y de programación (como caso especial de entorno interactivo). Cada uno plantea distintos requerimientos sore los lenguajes adaptados a esos entornos.

Entornos de procesamiento por lotes

El primero y más simple entorno operativo se compone ólo de archivos esternos de datos. Un programa toma un cierto conjunto de archivos de datos como entrada, procesa datos y produce un conjunto de archivos de salida; por ejemplo, un programa de nómina procesa dos archivos de entrada que contienen registros maestros de nómina y tiempos de periodos de paga semanales, y prodece dos archivos de salida que contienen registros maestros actualizados y cheques de sueldo. Este entorno operativo se designa como de procesamiento por lotes porque los datos de entrada se reunen en “lotes” de archivos y son procesados en lotes por el programa. Los lenguajes como FORTRAN, C, Pascal se proyectaron inicialmente para entornos de procesamiento por lotes, aunque ahora se pueden usar en un entorno interactivo o en un de sistema incrustado.

Efectos sobre el diseño de lenguajes

La influencia del entorno se aprecia en cuatro áreas principales: caracteristicas de entrada/salida, caracteristicas de manejo de errores y excepciones, recursos de regulación del tiempo y estructura de programas.

En un lenguaje proyectado para procesamiento por lotes por lo común de los archivos constituyen en la base para casi toda le estruvtura de entrada/salida. Aunque un archivo se puede usar para entrada/salida interactivo a una terminal, en estos lenguajes no se encaran las necesidades especiales de E/S interactiva. Por ejemplo, los archivos se guardan ordinariamente como regisros de longitud fija, pero en una terminal el programa necesitaria leer cada carácter conforme se introduce en el teclado. La estructura entrada/salida tampoco se ocupa típicamente de la necesidad de acceso a dispositivos especiales de E/S que se encuentran en sistemas incrustados.

Efectos sobre el diseño de lenguajes.

La influencia del entorno se aprecia en cuatro áreas principales:

  • Características de entrada/salida
  • Características de manejo de errores y excepciones
  • Recursos de regilación del tiempo
  • Estructura de programas

En un lenguaje proyactado para procesamiento por lotes, por lo común los archivos sonstituyen la base para casi toda la estructura de entrada/salida. Aunque un archivo se puede usar para entrada/salida interactiva a una terminal, en estos lenguajes no se encaran las necesidades especiales de la E/S interactiva. Por ejemplo, los archivos se guardan ordinariamente como registros de longitud fija, pero en una terminal el problema necesitaría leer cada cra´ter conforme se introduce en el teclado. La estructura de entrada/salida tampoco se ocupa típicamente de la necesidad de acceso a dispositivos especiales de E/S que se encuentran en sistemas incrustados.

En un entorno de procesamiento por lotes, un error que termine la ejecución del programa es aceptable aunque costoso, debido a que menudo se repite toda la ejecución despues de corregir el error. Además, en este entorno, no es posible la ayuda externa por parte del usuario para menejar o corregir el error de inmediato. Así pues, las facilidades del lenguaje para manejo de errores y excepciones enfatizan al manejo de éstos en el programa para que éste se pueda recuperar de casi todos los errores y continúe con el procesamiento sin suspender su ejecución.

Una tercera característica que distingue a un entorno de procesamiento por lotes es la carencia de resticciones de regulación de tiempo en un programa. Ordinariamente, el lenguaje no proporciona recursos para monitorear o afectar directamente la velocidad de ejecución del programa.

La estructura de programa repesentativa desde este entorno consiste en un programa principal y un conjunto de subprogramas. Esta estructura típica de programa está presente en FORTAN, C y Pascal. Los subprogramas, en su totalidad, son procesados por el compilador y éste interactúa rara vez con el programador durante el proceso de compilación.

Entornos interactivos

En un entorno interactivo, el más común en la actualidad en computadoras personales y estaciones de trabajo, un programa interactúa durante su ejecución directamente con un usuario en una consola de visualización, enviando alternativamente salidas hacia ésta y recibiendo entradas desde el teclado o ratón. Son ejemplos de los sistemas de procesamiento de tectos, hoojas de cálculo, juegos de video, sistemas de gestión de bases de datos y sistemas de instrucción asistida por computadora. Todos estos ejemplos son herramientas con las cuales el lector puede estar familiarizado.

Efectos sobre el diseño de lenguajes

Las característica de la entrada/salida interactiva son lo sumficientemente diferentes de las operaciones ordinarias con archivos como para que casi todos los lenguajes proyectados para un entorno de procesamiento por lotes experimenten cierta dificultad para adaptarse a un entorno interactivo. En C, por ejemplo, incluye funciones para tener acceso a líneas de texto desde un archivo y otras funciones que alimentan directamente de cada carácter conforme lo digita el usuario en la terminal. La INTRODUCCIÓN DIRECTA DE TEXTO DESDE UNA TERMINAL DE Pascal, sin embargo, suele ser muy engorrosa. Por esta razon, C y su derivación C++ se ha vuelto mucho más popular como lenguaje para escribir programas interactivos.


Entornos

Como hemos visto, la operación set! (asignación) nos permiten modelar objetos que tiene estado local. Cuando una asignación está presente, una variable no es sólo considerada como un nombre asociado a un valor, sino que la variable debe estar asociado a un “lugar” donde los valores se guarden. En el modelo de evaluación de Scheme, esos “lugares” se denominan entornos. Los entornos permiten formalizar también el concepto de ámbito de variable.

Definimos un "entorno" como un conjunto de variables y valores asociados a ellas. El entorno principal es el que existe cuando arrancamos el intérprete de Scheme.

Cuando usamos las formas especiales set! estamos modificando el entorno.

En el nuevo modelo de computación que veremos más adelante el concepto de entorno es central.

Una expresión se evalua en un entorno.

Ejemplo 1 de entorno:

(define x 5)
(set! x (+ 1 x))
x -> 6

Dibujo de los entornos resultantes:

Imagen del entorno 1

En el entorno global la variable x queda ligada al valor 5.

Imagen del entorno 1

Al evaluar la instrucción (set! x (+ 1 x)), la variable x incrementa en uno su valor.

Imagen del entorno 1

Se devuelve el valor ligado a x, que es 6.

Ejemplo 2 de entorno:

¿Qué pasa si la modificación de la variable x la hacemos en una llamada a una función?

(define x 5)
(define (prueba)
(set! x (+ 1 x))
x)
(prueba) -> 6
x -> 6

Dibujo de los entornos resultantes:

Imagen del entorno 2

En el entorno global la variable x queda ligada al valor 5.

Imagen del entorno 2

En el entorno global, el identificador prueba queda ligado a un procedimiento sin argumentos y cuyo cuerpo es (set! x (+ 1 x)) x). Éste a su vez está sociado al entorno global.

Imagen del entorno 2

Al hacer la llamada al procedimiento (prueba), se extiende el entorno asociado al procedimiento. En este entorno local a la función es donde se evalúa la función. Se incrementa la variable x en 1 y se devuelve.

Ejemplo 3 de entorno:

¿Qué pasa si dentro de la llamada a "prueba" se define otra variable x?

(define x 5)
(define (prueba)
(define x 10)
(set! x (+ 1 x))
x)
(prueba) -> 11
x -> 5

Dibujo del entorno resultante:

Imagen del entorno 3

La invocación a un procedimiento (como prueba en el ejemplo anterior) genera un entorno en el que se evalúa el cuerpo del procedimiento. Este entorno es algo así como la memoria local asociada a la evaluación del procedimiento. Una regla muy importante que veremos más adelante: este entorno local debe extender el entorno en el que fue creado el procedimiento que se invoca.

Estado local

Vamos a jugar con el ejemplo más sencillo posible de programación no funcional: un contador. Y vamos a utilizar este ejemplo para continuar introduciendo los elementos que posteriormente utilizaremos en el modelo de entornos.

Se trata de definir una funcion count que implemente un contador y devuelva cada vez un valor incrementado en 1.

(count) -> 0
(count) -> 1
(count) -> 2
...

Ejemplo 1: contador global

Vamos a jugar con el ejemplo más sencillo posible de programación no funcional: un contador.

Se trata de definir una funcion count que implemente un contador y devuelva cada vez un valor incrementado en 1.

; (count) -> 0
; (count) -> 1
; (count) -> 2
; ...
(define counter 0)

(define (count)
(set! counter (1+ counter))
counter)

(count) -> 1
(count) -> 2

Es necesario mejorar esta versión, porque la utilización de un contador global nos puede llevar a errores. Por ejemplo, alguna otra función puede cambiar el valor del contador sin que nos demos cuenta.

Vamos a intentar implementar en Scheme el estado local algo asi como el static de C. Buscamos poder definir un contador que vayamos incrementando y que podamos consultar a traves de una funcion, pero que no esté disponible globalmente.

int count(){
static int iCount = 0;

iCount += 1;
return iCount;
}

count = count(); // devuelve 1
count = count(); // devuelve 2

Ejemplo 2: primer intento de estado local (que no funciona).

Utiliza let para definir una variable local, pero no tiene estado ya que cada llamada a count vuelve a inicializar su valor a 0.

(define (count)
(let ((counter 0))
(set! counter (+ counter 1))
counter))

Ejemplo 3: Estado local (sí que funciona).

Usamos un constructor del contador (make-counter) que va a devolver el contador propiamente dicho.

(define (make-counter)
(define x 0)
(lambda ()
(set! x (+ counter 1))
x))

(define count (make-counter))
(count) ;-> 1
(count) ;-> 2

Nuevo modelo computacional: evaluacion del entorno. Cuando llamamos a lambda() para crear la función, ésta se crea en el entorno definido por la llamada a make-counter, en el que se ha creado la variable x con el valor 0. A partir de este momento la función creada por el lambda queda asociada a este entorno y usa x como una variable local. El valor de x no es visible desde el entorno global.

Los entornos resultantes son los siguiente:

Imagen del entorno ejemplo 3

En el entorno global, el identificador make-counter queda ligado a un procedimiento sin argumentos cuyo cuerpo es:

   (define x 0)
(lambda ()
(set! x (+ counter 1))
x)

Imagen del entorno ejemplo 3

En el entorno global, el identificador count queda ligado al resultado de la llamada a make-counter, que ha obligado a evaluarlo:

  • En primer lugar, se ha extendido el entorno asociado a make-counter. En este entorno local E1 a la función, la variable x ha quedado ligada al valor cero.
  • En segundo lugar, la evaluación de lambda(x).... ha devuelto un procedimiento, que ha quedado ligado al identificador count en el entorno global. Este procedimiento queda asociado al entorno local E1 que es donde fue creado.

Imagen del entorno ejemplo 3

La llamada a count obliga a evaluar este procedimiento, el cual extiende su entorno asociado. En este entorno local E2 se evalúa el cuerpo de la función, modificando el valor de x incrementándolo en 1.

Ejemplo 4: Variable local como parámetro

Igual que el 3, pero usando como variable local un parámetro de la funcion make-counter que representa el valor inicial del contador.

(define (make-counter x)
(lambda ()
(set! x (+ 1 x))
x))

(define count (make-counter 0))
(count) ;-> 1
(count) ;-> 2

Los entornos resultantes se muestran en la siguiente figura:

Imagen del entorno 5

En el entorno global, el identificador make-counter queda ligado a un procedimiento con un argumento x cuyo cuerpo es:

    (lambda ()
(set! x (+ counter 1))



x)

Imagen del entorno 5

En el entorno global, el identificador count queda ligado al resultado de la llamada a (make-counter 0), que ha obligado a evaluarlo:

  • En primer lugar, se ha extendido el entorno asociado a make-counter. En este entorno local E1 a la función, la variable x ha quedado ligada al valor cero (valor pasado como parámetro).
  • En segundo lugar, la evaluación de lambda(x).... ha devuelto un procedimiento, que ha quedado ligado al identificador count en el entorno global. Este procedimiento queda asociado al entorno local E1 que es donde fue creado.

Imagen del entorno 5

La llamada a count provoca la evaluación de este procedimiento, el cual extiende su entorno asociado. En este entorno local E2 se evalúa el cuerpo de la función, modificando el valor de x incrementándolo en 1.



Control de secuencia de procedimientos.

Las estructuras de secuencias se pueden clasificar en 3 grupos:

· Estructuras que se usan en expresiones, como reglas de precedencia y paréntesis;

· Estructuras que se usan entre enunciados o grupos de enunciados, como enunciados condicionales e iterativos; y

· Estructuras que se usan entre subprogramas, como llamadas de subprogramas y corrutinas.

Las estructuras de control de secuencias pueden ser implícitas o explícitas. Las estructuras de control de secuencias implícitas (o por omisión) son las que el lenguaje define que están en operación, a menos que sea modificado por alguna estructura explícita. Dentro de estas expresiones existen una jerarquía de operación definidas por el lenguaje, que controla el orden de ejecución de las operaciones de la expresión cuando no existe paréntesis.

Las estructuras explícitas de control de secuencias son las que el programa puede optar para modificar el orden implícito definido por el lenguaje; ejemplo, usando paréntesis dentro de las expresiones y etiquetas de enunciados.

Formas de control de secuencias al nivel de enunciados.

A nivel de enunciados hay tres formas principales de control de secuencia:

1.- Composición: Los enunciados pueden disponer de una serie textual de modo que deben ejecutarse en orden y siempre la ejecución de la estructura mayor del programa que contenga la serie.

2.- Alternancia: Dos series de enunciados pueden formar alternativas de modo que se ejecute una u otra serie, pero no las dos siempre que se ejecute la estructura mayor del programa que contenga la serie.

3.- Iteración: Cuando hay una serie de enunciados pueden ejecutar en forma repetitiva, cero o más veces; cuando es cero significa que se puede omitir del todo la ejecución. Para esto se debe ejecutar la estructura mayor del programa que contenga la serie.

Control explícito de secuencia.

Las maquinas se componían de posiciones de memoria, los primeros lenguajes por ejemplo (FORTRAM, angol) las modelaban con tipos de datos simples traducibles directamente a objetos de maquina ( FLOAT DE C ) Y ( REAL DE FORTRAM ) a punto flotante de hardware.

Enunciado goto: En muchos lenguajes están presentes dos forma de enunciado goto (ir a), uno es el enunciado goto incondicional y el otro es el enunciado goto condicional.

Goto incondicional: Dentro de una seré de enunciados, un goto incondicional, como:

Goto PROXIMO

GOTO CONDICIONAL: Dentro de una serie de enunciados, un goto condicional, como:

If A = 0 then goto próximo

En tanto los lenguajes contengan estructuras de control anidables , como las intrucciones while e if, las cuales se analizan en breve, el goto es un artefacto que se puede pasar en alto sin dificultad. Desdichadamente, en ciertos lenguajes, como las primeras versiones de FORTRAM y APL, la transferencia explícita del control es necesaria, puesto que faltan las estructuras compuestas apropiadas.

Enunciado break: Ciertos lenguajes, como C, incluyen un enunciado break ( escapar) como una forma de control explícito estructurado. Por lo común, el break causa que el control pase más adelante en el programa hasta un punto explícito al final de una estructura de control dada. Este break en C hace que el control salga del enunciado while, for o switch que lo encierra directamente.

En resumen el enunciado break cumple la función de que cauda la salida de una iteración, mientras que el continúe ocasiona una nueva iteración.

Diseño de programación estructurada

Algunas de las ventajas aparentes de los goto son:

1.- Manejo directo por el hardware para una ejecución eficiente si las etiquetas son simplemente marcas sintácticas locales en los enunciados.

2.- Sencillos y fáciles de usar en programas pequeños.

3.- Familiares para los programadores capacitados en lenguaje ensamblador o lenguajes más antiguos.

4.- De uso completamente general como bloque de construcción para representar ( simular ) cualquiera de otras formas de control que se analizan mas adelante.

Es más importante que el programa se ejecute correctamente en ves de tener la máxima eficiencia. El diseño de lenguajes de programación debe reflejar estas necesidades.

El concepto de la estructura de control de un punto de entrada y uno de salida contribuye a un diseño más inteligible. Un programa de mas de unos pocos enunciados es difícil de entender a menos que los enunciados estén organizados jerárquicamente en grupos, donde cada grupo represente una unidad conceptual del cómputo subyacente.

No es necesario que el orden de los enunciados en el programa corresponda al orden de ejecución. Mediante el uso de enunciado goto, es fácil escribir en los programas en los cuales el control salta entre diferentes series de enunciados siguiendo patrones irregulares. En este caso, el orden en que los enunciados aparecen en el programa tienen poca relación con el orden de ejecución de los mismos.

Programación estructurada

Este término se usa para el diseño de programas que hace énfasis en:

1.- El diseño jerárquico de estructuras de programas usando solo las formas simples de control, de composición, alternancia e iteración.

2.- La representación directa del diseño jerárquico en el texto del programa, usando los enunciados de control estructurados.

3.- El texto de programa en el cual orden textual de los enunciados corresponden al orden de ejecución.

4.- El uso de grupos de enunciados de propósito único, aun cuando sea necesario copiar los enunciados.

Control de secuencia estructurado

Casi todos los lenguajes suministran un conjunto de enunciados de control para expresar las formas básicas de control: composición, alternancia e iteración. Un aspecto importante de los enunciados que se van a analizar es que cada uno es un enunciado de entrada por salida, lo que significa de que cada enunciado hay un solo punto de entrada al enunciado y un solo punto de salida al mismo.

Los lenguajes más antiguos, como COBOL y FORTRAM, contienen algunos enunciados de control de entrada por salida, pero todavía se apoyan fuertemente en enunciados goto y etiquetas de enunciados. Ha sido difícil adaptar ambos lenguajes a conceptos modernos de lenguaje.

Enunciados compuestos

Ejemplos:

Begin

….. - serie de enunciados ( uno o más )

end

En C se escriben simplemente como {…}

Enunciados condicionales

Ejemplos:

Enunciados if. La ejecución opcional de un enunciado se expresa como un if de una bifurcación.

Ejemplo.

If condición then enunciado endif

Enunciados de iteración

La iteración suministra el mecanismo básico para los cálculos repetidos en casi todos los programas. La estructura básica de un enunciado de iteración consiste en una cabeza y un cuerpo. La cabeza controla el número de veces que el cuerpo se va a ejecutar, en tanto que el cuerpo es ordinariamente de enunciado ( compuesto ) que proporciona la acción del enunciado.

Repetición simple

El tipo mas sencillo de cabeza de enunciado de iteración especifica que el cuerpo se debe ejecutar cierto número fijo de veces. El PERFORM de COBOL es representativo de esta construcción:

Perform cuerpio K time

Hace que se evalúe K y luego se ejecute el cuerpo del enunciado ese número de veces.

Repetición mientras se cumple la condición. Se puede construir una iteración algo mas compleja usando una cabeza de repetir mientras. Una forma típica es:

While prueba do cuerpo

En esta forma de enunciado de iteración, la expresión de prueba se evalúa después de cada vez que se ha ejecutado el cuerpo.

Repetición mientras se incrementa un controlador. La tercera forma alternativa de enunciado de iteración es el enunciado cuya cabeza especifica una variable que sirve como un contador o índice durante la iteración. En la cabeza se especifica un valor inicial, un valor final y un incremento, y el cuerpo se ejecuta repetidamente usando primero el valor inicial como valor de la variable índice, luego el valor inicial mas el incremento, después el valor inicial mas dos veces el incremento, y así sucesivamente, hasta que se alcanza el valor final. En FORTRAM-77 ésta es la única forma de enunciado de iteración disponible. El enunciado for en ANGOL ilustra la estructura típica.

For l := l step 2 until 30 do cuerpo

En su forma general:

For k := N-1 step 2 * (W-1) until M * N do cuerpo

Repetición indefinida

Cuando hay problemas en la salida de la iteración, se suele emplear una iteración sin prueba explícita de terminación en la cabeza.

Ejemplo en ADA :

loop

…..

exit when condición:

end loop:

En pascal:

While cierta do begin…. End;

El enunciado for en C permite todos estos conceptos en una sola construcción:

For ( opción; opción; opción ) { cuerpo }

Implementación en enunciados iterativos

Para implementar una iteración for, las expresiones de la cabeza de la iteración que definen el valor final y el incremento se deben evaluar a la entrada final de la iteración y guardar en áreas especiales de almacenamiento temporal.

Problemas en el control de secuencia estructurada.

El enunciado goto se usa como último recurso cuando los enunciados de control son inadecuados, hay áreas que hacen innecesario el enunciado goto las cuales son:

ITERACIONES DE SALIDAS MULTIPLES

EJEMPLO DE ESTA ES :

For 1 en 1..K iteración

Exit when vect(1) = 0

End loop;

OTRO EJEMPLO ES EL DE DO-WHILE-DO:

Loop

Read ( x )

If fin-de-archivo then goto & { afuera de la iteración }

Process ( x )

End loop;

A do-while-do se le conoce como ( HACER MIENTRAS HACER ), ya que while “intermedio” maneja la secuencia.

OTRO EJEMPLO ES:

Dowhiledo

Read ( x )

While ( no fin_de_archivo )

Process ( x )

Endowhiledo;

Desafortunadamente ningún lenguaje implementa esta estructura, aunque en C, if ( condición ) BREAK se acerca y exit when de ADA es similar.

Se puede realizar cualquier tipo de problema con la unica aplicación de 3 estructuras de control:

  1. condicon;
  2. interacción:
  3. secuencia;

1.-Estructuras condición: Es el punto en el algoritmo en el que se condiciona el estado del proceso y se tienen dos o una alternativa; cuando es Verdadera o Falsa.

Si(expresión)entonces

Accion 1

Si no si(expresión2)entonces

Accion 2;

Sino

Accion n

Fin si.




2.-Estructuras de iteración: Es un mecanismo de lazo. Permite repetir varias veces un grupo de pasos, hasta que se satisfaga esta condición. La repetición puede programarse para un cierto número de veces.

Accion 1

Accion 2

Accion 3

Accion 3

·

·

·

Accion n

·

·

Accion n

http://dis.um.es/%7Elopezquesada/documentos/FP0405/Proyecto/web4/webalgo/teoria_archivos/image011.gif


3.- Estructura de control de secuencia: Es un grupo de instrucciones que se ejecuta en orden, de la primera a la última. Una acción hasta que se vuelva Verdadera la condición.

Accion 1

Accion 2

Accion 3

Accion 4

Accion x

…..

Accion N



http://dis.um.es/%7Elopezquesada/documentos/FP0405/Proyecto/web4/webalgo/teoria_archivos/image012.gif


Ejemplo 1 :

Leer un número y decidir si es menor que 10

Ejemplo 2 :

Modificar el anterior para ver si el número es mayor o igual a 10 (dos formas).

Ejemplo 3 :

Modificar el anterior para ver si el número es mayor o igual a 5 y menor que 10.

Ejemplo 4 :

Modificar el anterior para ver si el número es: mayor o igual a 5 y menor que 10 o si es mayor que 25 y menor que 32.

Ejemplo 5 :

Leer un texto y decir si es igual a: Marc

Modificadores de Acceso.

Estos modificadores son partículas que se les colocan delante para
indicar desde qué códigos puede accederse a ellos, entendiéndose por
acceder el hecho de usar su nombre para cualquier cosa que no sea
definirlo, como llamarlo si es una función, leer o escribir su valor
si es un campo, crear objetos o heredar de él si es una clase, etc.

Por defecto se considera que los miembros de un tipo de dato sólo
son accesibles desde código situado dentro de la definición del mismo,
aunque esto puede cambiarse precediéndolos de uno los siguientes
modificadores (aunque algunos de ellos ya se han explicado a lo largo
del tema, aquí se recogen todos de manera detallada) al definirlos:

* public: Puede ser accedido desde cualquier código.
* protected: Desde una clase sólo puede accederse a miembros
protected de objetos de esa misma clase o de subclases suyas. Así, en
el siguiente código las instrucciones comentadas con // Error no son
válidas por lo escrito junto a ellas:


public class A
{
protected int x;
static void F(A a, B b, C c)
{
a.x = 1; // Ok
b.x = 1; // Ok
c.x = 1; // OK
}
}

public class B: A
{
static void F(A a, B b, C c)
{
//a.x = 1; // Error, ha de accederse a traves de objetos tipo B o C
b.x = 1; // Ok
c.x = 1; // Ok
}
}

public class C: B
{
static void F(A a, B b, C c)
{
//a.x = 1; // Error, ha de accederse a traves de objetos tipo C
//b.x = 1; // Error, ha de accederse a traves de objetos tipo C
c.x = 1; // Ok
}
}


Obviamente siempre que se herede de una clase se tendrá total
acceso en la clase hija –e implícitamente sin necesidad de usar la
sintaxis .- a los miembros que ésta herede de su
clase padre, como muestra el siguiente ejemplo:


using System;
class A
{
protected int x=5;
}

class B:A

{
B()
{
Console.WriteLine("Heredado x={0} de clase A", x);
}

public static void Main()
{
new B();
}
}


Como es de esperar, la salida por pantalla del programa de ejemplo será:


Heredado x=5 de clase A



A lo que no se podrá acceder desde una clase hija es a los miembros
protegidos de otros objetos de su clase padre, sino sólo a los
heredados. Es decir:


using System;
class A
{
protected int x=5;
}

class B:A
{
B(A objeto)
{
Console.WriteLine("Heredado x={0} de clase A", x);
Console.WriteLine(objeto.x); // Error, no es el x heredado
}

public static void Main()
{
new B(new A());
}
}

* private: Sólo puede ser accedido desde el código de la clase a
la que pertenece. Es lo considerado por defecto.
* internal: Sólo puede ser accedido desde código perteneciente al
ensamblado en que se ha definido.
* protected internal: Sólo puede ser accedido desde código
perteneciente al ensamblado en que se ha definido o desde
clases que deriven de la clase donde se ha definido.

Si se duda sobre el modificador de visibilidad a poner a un
miembro, es mejor ponerle inicialmente el que proporcione menos
permisos de accesos, ya que si luego detecta que necesita darle más
permisos siempre podrá cambiárselo por otro menos restringido. Sin
embargo, si se le da uno más permisivo de lo necesario y luego se
necesita cambiar por otro menos permisivo, los códigos que escrito en
base a la versión más permisiva que dependiesen de dicho miembro
podrían dejar de funcionar por quedarse sin acceso a él.

Es importante recordar que toda redefinición de un método virtual
o abstracto ha de realizarse manteniendo los mismos modificadores que
tuviese el método original. Es decir, no podemos redefinir un método
protegido cambiando su accesibilidad por pública, pues si el creador
de la clase base lo definió así por algo sería.

Respecto a los tipos de datos, por defecto se considera que son
accesibles sólo desde el mismo ensamblado en que ha sido definidos,
aunque también es posible modificar esta consideración anteponiendo
uno de los siguientes modificadores a su definición:

* public: Es posible acceder a la clase desde cualquier ensamblado.
* internal: Sólo es posible acceder a la clase desde el ensamblado
donde se declaró. Es lo considerado por defecto.

También pueden definirse tipos dentro de otros (tipos internos) En
ese caso serán considerados miembros del tipo contenedor dentro de la
que se hayan definido, por lo que les serán aplicables todos los
modificadores válidos para miembros y por defecto se considerará que,
como con cualquier miembro, son privados. Para acceder a estos tipos
desde código externo a su tipo contenedor (ya sea para heredar de
ellos, crear objetos suyos o acceder a sus miembros estáticos), además
de necesitarse los permisos de acceso necesarios según el modificador
de accesibilidad al definirlos, hay que usar la notación
., como muestra en este
ejemplo:


// No lleva modificador, luego se considera que es internal
class A
{
// Si ahora no se pusiese public se consideraría private
public class AInterna {}
}

// B deriva de la clase interna AInterna definida dentro de A.
// Es válido porque A.AInterna es pública
class B:A.AInterna
{}

Nótese que dado que los tipos externos están definidos dentro de
su tipo externo, desde ellos es posible acceder a los miembros
estáticos privados de éste. Sin embargo, hay que señalar que no pueden
acceder a los miembros no estáticos de su tipo contenedor.



Páginas utilizadas:

http://www.lsi.upc.es/~euetit/tp/recur.pdf

http://html.rincondelvago.com/secuencias.html

http://computacion.cs.cinvestav.mx/~acaceres/courses/itesm/lp/clases/lp07.pdf

Friday, July 06, 2007

Both my parents were raised in the 70's, they grew up with disco music, Camilo Sexto, Jose Jose etc. They went out on Fridays and had fun in parties, they danced around, kissed. they also played sports, they studied, they basically enjoyed their life.
Camilo Sexto

Now a days, a lot of us would have a lot of trouble living the way they did in the 70's. They didn't have cell phones,didn't have cable TV, they didn't have computers, and worst of all, they didn't have Internet!
I use the Internet nearly everyday of my life. I log in to talk to my friends, I do a lot of my learning online, I study Computer Engineering, so it really helps to aid myself with the online tutorials, I can get a lot of my work done, by reading them. I like to listen to online radio stations from Germany,because I can practice my German, I also love watching German TV, I visit YouTube, and I watch many cartoons, soaps etc from Germany, my German accent has gotten a lot better since I have be doing this.
If you asked me now, I would say that I could not live without the Internet, my life would not be complete. But the truth is, I lived without it for almost 13 years. And I've actually lived with it, for almost 8 years.



I believe that we all get used to living with certain things, but human beings can adapt very easily, so when we are given something new, we adjust to it, and when something is taken from us, we also adjust to live without it. Human Beings have that gift, they can adjust very quickly to different situations, and still feel well. Humans feel well not on the amount of new gadgets that they have, but on the amount of love that they have. All you need is love, love, books and music. With these three factors, I believe we can all be very happy. The rest is just in order to live a little more comfortable .
Future Generations, could live like my parents did in the 70's or like how I live right now, and if they had music, love and books, I could assure you that they'd be happy, they would be able to adjust very well.



Angry
I don't really remember knowing anyone who didn't think about their childhood with great joy. Suddenly everything we did when we were growing up seems as if it had been nearly perfect. We don't think much about how we cried a lot the day we scrapped our knee when playing tag in that rocky hill, or how we had gotten really mad at Rochell for not wanting to share her Malibu Barbie with us. Instead we normally think about the great things that went on in our lives. We think about the sunny days in summer, were we would run around in the grass with our ice cream cones, we think about the days were we could spend all day doing bike races, sometimes pretending they were horses, days were we could play pretend and laugh all afternoon.

Yes, we normally remember the good things that occurred in our childhood. Although this doesn't mean that our childhood was indeed our happiest period of time. I think we tend to over rate the past, old folks usually say that the past was far better than the present, in the past, they say, people had manners, people were much more smarter ,easy going etc. Although I don't think, this is always true.

Angry
I believe the real problem is that humans, can never be happy in the present. It is until an event has happened, that they can finally state:"...oh yeah, I guess I was happy in that time after all..."
It is only after it has passed, that a person really starts to appreciate it.
That is why, everyone normally says: "Oh my childhood, was one of the happiest time of my life. "
It is an event that has passed, and since we can never be happy with our present, and because we have to be happy with something, we tend to think that our childhood was indeed a very joyful time.

Angry

Thursday, July 05, 2007

We have all been there. We´re sitting in our living room surfing through the Internet

Wednesday, July 04, 2007

We´ve all been there, we´re sitting in our living room, clicking through the channels of our television set, when suddenly we hear it. It is that old melodie we used to listen to when we were young, that song that was playing when we got our first kiss.
We listen to it, and suddenly, suddenly we´re taken back for an instance to that place, to that time.
We can see Victor´s face again, we can smell his sweet breath over our skin, we can feel his lips coming closer ,and closer ,and closer, and then... the song is over, and we´re back to our living room,we´re back to our Tuesday afternoon of Soaps.

Saturday, June 30, 2007

We all know the tragic story about Kip Kinkel, the young 15 year old boy , who shot and killed both his parents , or what about the Coloumbine high school case, about the two 17 old and 19 year old who killed about 12 students, 2 teachers and hurt many more.

Society at the time, was as they say "totally freaked out". Everyone was trying to bring up an answer to what turned these children, these young teens into these horrible murders, into these sick persons that killed in cold blood.

In the Coloumbine case, after some research in the lives of the two murders, it was found that they both listened to a lot of Marylin Manson music, and had a lot of violent films in their bedrooms. It was then all very clear! It was surely Marylin Manson with his satanic lyrics that brought these kids to brutally killing their fellow classmates.

But , is the media the true factor in incrementing the aggression inside individuals, inside children?
My answer to that, would be no.
We currently live in a globalized world, where the same music that is played in London is played in Germany is played in Brazil is played even here in Mexico. The sameTV shows can be seen worldwide. I have recently, for example, been watching "old episode of" Cow and Chicken (a famous cartoon from the USA) in a German translation. It is clear that the world is watching, now a days, the same shows and listening basically to the same music.
Despite this, not every country has the high levels of violence in schools as the ones that the US presents.
I believe the US presents its high levels of violence due to other factors, cultural factors. But we cannot just blame television for it .It would make sense to blame television for an increment in violence , when the rate of violence world wide had incremented. And, this is not all true. Not all countries that display violent TV shows, TV shows that come from the US, display aggressive behavior.
The world is full of horrible things, but this does not mean that we have to be like that.

I believe we have a power to decide, therefore despite seeing violence, we can decide whether or not we wish to be violent. Television dosen´t need to be the factor that pushes us to be violent. I believe our friends, or our family members could have a greater influence on us becoming violent or not. They could be key factors on the decisions we make...But television?
I don´t know anyone who takes television too seriously. When you are a child, you learn that television is full of make believe. You have to learn that it is not real.

If one knows it´s fake, how could a fake thing ever influence me on what I decide to do in real life ?

Our decisions are influenced by our family, teachers, friends etc. Not by a screen with light.
The problem is, many children are forgotten and are left alone to make their own decisions. It´s the fault of the lack of attention given to them, that brings them to make incorrect decisions and turn violent. It´s a scream for help, coming from a failed family.

Violence has incremented in the US, due to the fact that the family structure in that country is failing. There are more and more single mothers with children, single mothers that leave for work and leave their children behind, untaught and forgotten.

it is not the fault of the violent television programs, or the violent lyrics from Marilyn Manson, it is the fault of family system.
We were given a graph, which shows the amount of time that people from different age groups in Someland invested in different activities throughout a year.
Teens are the group that invested the largest amount of time in watching TV/videos. The number of hours that they spent was around 1,200. This comes very close, to the hours that people over 70 invested in this activity. (1100 hours per year).
Despite the fact, that teens spent the great majority of their time watching TV, they only spent 100 hours a year to go to the Cinema. (Although in this activity they were also one of the groups which invested the most time in .)
The group that invested the most time in socialising with 4 or less people, was the one which had people in their 30´s. After this group, the ones that also invested plenty of their time in this activity were people in their 40´s,50´s and 60´s.
On the contrary, people in their 20´s and teens, invested a lot more time in group activities.

We can clearly see, that the amount of time invested in each activity, has a lot to do with the age group in which a person is in. When a person is young, they will tend to invest a lot more time to socialize with large groups of people, on the contrary when they start to age, the people with which they socialize starts to decrease.
Although young and old people have a common trend, they both spend a lot of their time watching television.
We were given two graphs, that compare the highest level of education of women in Someland between 1945 and 1995.
In the mid forties, the great majority of the women in Someland ( 35% of the women population) either studied up to 12 years of school or didn´t study at all . It was also popular for the women to study for just around 6 years, (15% of the women population did this) Only 1% of the population studied up to first degree. And no one studied up to Post graduate.

This contrasted greatly with what went on in woman´s education in 1995 in Someland. The great majority of the Woman in the mid nineties, finished their First Degree. ( 50% of the population accomplished this.) Not one woman studied less than 9 years. And 20 % of the women in Someland were able to study up to a Post Graduate.

We can therefore conclude that throughout the years in Someland, the level of woman´s education rose. The great majority accomplished to finish a degree.

Friday, June 29, 2007

We have here two different graphs.
One of them shows the millions of lives that were taken in Someland by 6 different diseases during 1990.
the other graph shows how much money was invested on medical research for each disease.

When looking at the graph of Deaths in Someland, we can clearly see that the disease that caused the greatest number of deaths, was TB. TB produced nearly 2 million deaths in 1990 in Someland. No other disease came close to producing the number of deaths that TB produced. The second disease that took the most number of souls was Diarrhoea. Although Diarrhoea, was responsible only for .6 million deaths, contrasting greatly of course with TB!
The other diseases that were responsible responsible for deaths, presented mostly the same death rate as Diarrhoea.They oscillated between .1 million deaths and .6 millions. The disease that took the lowest number of lives was Leprosy, which took approximately .5 million deaths, this was closely followed by Aids, who took about .6 deaths.

On the other hand, the graph that shows how much money was invested on the medical research of each disease, clearly states that the disease which received the greatest amount of funding for medical research was aids. Aids received almost 180 million dollars of funding. No other disease was even close to receiving that amount of money for research.Tropical Diseases received almost the same amount of funding as Leprosy. The disease that received the least amount of money was TB.

Seeing these two graphs, we could conclude that: the more a country invests on medical research of a certain disease, the lower the number of deaths produced by this disease.
If a country wants to reduce its death rate caused by a certain disease, it has to invest money on medical research related with this disease.
Someland invested more in medical research related with AIDS, than with any other disease. This has paid off on the fact that AIDS diseases took only about .3 deaths on 1990.

Thursday, June 28, 2007

It was not actually very common, for ladies to smoke in the early sixties, only 10% tended to do this activity. This was actually very different to what occurred in the case of men. In the sixties, about 60% of them smoked . It was very trendy for them to do so .
Despite the popularity that cigarette had with men in the early sixties, the number of men smokers started to decrease drastically throughout the years. By the early nineties, for example, only 30% of the male population smoked, half of what had existed in the early sixties.

The Female population, reacted strangely different from the male . A large group of ladies has never smoked. The highest percentage of women smokers that has existed, occurred in the mid seventies. Where almost 35% of the women population took up smoking. From then on, the number of women smokers has been kept constant. Oscillating between 35 % and 30 %. Being almost equal to the current male smoker population.
As we all know, I have to present in JUly an English test. The IELTS, I could just start blogging in English and stuff, to practice for the writing part...But I think, it´s a lot better to practice with real test exercises. So from now on, my writing is going to be related with test questions..

I) Writing about graph 1 : Number of children in X orphanage

In the mid seventies, the number of children in X orphanage was at its highest point. Nearly 1400 children slept, ate and basically lived in the X orphanage. Despite the high numbers that existed in the mid seventies, this number started to reduce it self through out the years. In the beginning of the eighties the number of orphans was eight hundred. And in 1985 this number reduced itself to more than its half. It was reduced by a third of what it had had in 1980, only 200 children now lived in the X orphanage.

-----
Ok, before writing this, I checked the spelling in Gmail´s spell check, and I got wrong the following word:
beginning.(DOUBLE N N!!!!)
and
BASICALLY: (IT SOUNDS BETTER IN SPANISH YOU KNOW!!)

Monday, June 04, 2007

Soucion tarea.
Parentesis>
Surge apartir de estas reglas>

1. S SS

2. S (S)

3. S ()

El Backus-Naur form (BNF) (también conocido como Backus-Naur formalism, Backus normal form o Panini-Backus Form) es una metasintaxis usada para expresar gramáticas libres de contexto: es decir, una manera formal de describir lenguajes formales. El BNF se utiliza extensamente como notación para las gramáticas de los lenguajes de programación de la computadora, de los sistemas de comando y de los protocolos de comunicación, así como una notación para representar partes de las gramáticas de la lengua natural (por ejemplo, el metro en la poesía de Venpa). La mayoría de los libros de textos para la teoría y/o la semántica del lenguaje de programación documentan el lenguaje de programación en BNF. Algunas variantes, tales como la augmented Backus-Naur form (ABNF), tienen su propia documentación. Descripción El BNF fue nombrado originalmente después de que John Backus y más adelante (con la sugerencia de Donald Knuth) también después de Peter Naur. Eran dos pioneros en informática, especialmente en el arte del diseño del compilador. La Backus-Naur Form o las gramáticas de BNF tiene semejanzas significativas a las reglas de la gramática de Pāṇini, y a veces también se conoce como Panini-Backus Form . El BNF fue creado como parte de crear las reglas para ALGOL 60. Una especificación de BNF es un sistema de reglas de la derivación, escrito como ::= donde es un nonterminal, y la expresión consiste en secuencias de símbolos y/o secuencias separadas por la barra vertical, '|', indicando una opción, el conjunto es una posible substitución para el símbolo a la izquierda. Los símbolos que nunca aparecen en un lado izquierdo son terminales. Ejemplo [editar] Como ejemplo, considere este BNF para una dirección postal de los E.E.U.U ::= ::= | "." ::= [] | ::= [] ::= "," Esto se traduce a español como: · Un dirección postal consiste de un nombre, seguido por una dirección, seguida por un código postal. · Una parte "personal" consiste en un nombre o una inicial seguido(a) por un punto. · Un nombre consiste de: una parte pesonal seguida por un apellido seguido opcionalmente por una jerarquía o el trato que se la da a la persona (Jr., Sr., o número dinástico) y un salto de línea (end-of-line), o bien una parte personal seguida por un nombre (esta regla ilustra el uso de la repetición en BNFs, cubriendo el caso de la gente que utiliza múltiples nombres y los nombres medios y/o las iniciales). · Una dirección consiste de una especificación opcional del departamento, seguido de un número de casa, seguido por el nombre de la calle, seguido por un salto de línea (end-of-line). · Un apartado posta consiste de una ciudad, seguida por una coma, seguida por un código del estado (recuerden que es un ejemplo que ocurre en EU), seguido por un código postal y este seguido por un salto de línea (end-of-line). Observe que muchas cosas (tales como el formato de una parte personal, de una especificación del apartamento, o código postal) están dejadas sin especificar aquí. Si es necesario, pueden ser descritas usando reglas adicionales de BNF, o dejadas como abstracción si es inaplicable para el propósito actual. Bastante interesante, la sintaxis de BNF se puede representar en BNF como sigue: ::= [] ::= "<" ">" "::=" ::= ::= [ "|" ] ::= ("<" ">" | | "(" ")" | "[" "]") [] ::= [" " ] ::= [] [] Esto asume que no hay Whitespace necesario para la interpretación apropiada de la regla. El se presume para ser el carácter ", y el para ser el fin de línea apropiado especificado (en ASCII, retorno de carro y/o línea nueva, dependiendo del sistema operativo). El y el deben ser substituidos con nombre/etiqueta o el texto literal de una regla declarada, respectivamente. Variantes Hay muchas variantes y extensiones de BNF, posiblemente conteniendo algunos o todos los comodines de expresiones regulares como un "*" o "+". El Extended Backus-Naur form (EBNF) es una variante común. De hecho el ejemplo anterior no es la forma pura inventada para el informe del ALGOL 60. La notación de los corchetes "[ ]" fue introducida algunos años más tarde en la definición de PL/I de la IBM pero ahora se reconoce universal. La ABNF es otra extensión usada comúnmente para describir protocolos del IETF. Las expresiones gramaticales de analizadores sintácticos construidas en BNF y las notaciones de expresión regular para formar una clase alternativa de la gramática formal, que es esencialmente analítica más que generativa en carácter.





Cambaindo de tEMA

saboan que puedes buscar rebelde en wikipedia en la edicion en aleman y

relamente encontrar algo de la teleovela!!!>

RBD (sprich: Rebelde) ist eine Popmusikgruppe aus Mexiko-Stadt in Mexiko. Seit ihrer Gründung im Jahre 2004 hat sie sich zu einem der kommerziell erfolgreichsten Acts der lateinamerikanischen Musik entwickelt und ihre Alben auch in Portugiesisch (für den brasilianischen Markt) und Englisch veröffentlicht.

Neben einer Nominierung für einen Latin Grammy Award in 2006 gewann RBD im gleichen Jahr auch 3 Billboard Latin Music Awards.

Als hilfreich für die Karriere als Band erwies es sich, dass alle Mitglieder dem (jüngeren) Zielpublikum bereits aus der erfolgreichen Telenovela Rebelde bekannt waren, in der sie die Mitglieder einer Popgruppe darstellten. Allerdings konnten die Bandmitglieder zu dieser Zeit bereits auf Karrieren als TV-Schauspieler, Sänger und Kinderstars zurückblicken.



Sunday, June 03, 2007

Pues bien tengo una nueva canción favorita:
(se llama katze...has kitties,und musik!..everything I could ever want...)
In dem Brief den du mir gabst, steht nur Scheiß.
Wenn du mich wirklich magst, sag`s doch gleich.
Ich hab kein` Bock auf Schwierigkeiten, keine Energie mich um mich um was zu streiten, das lass ich lieber bleiben.
Denn, im Himmel steht geschrieben ihr sollt euch lieben.
Denn, im Himmel steht geschrieben ihr sollt euch lieben.

In dem Brief den du mir gabst, steht nur Scheiße.
Wenn du mich wirklich magst, sags du`s leise.
Zu vertraut sind mir die Gebärden wenn aus Menschenaffen plötzlich Menschen werden, da kann ich mich nicht wehren. Denn, im Himmel steht geschrieben ihr sollt euch lieben. Denn, im Himmel steht geschrieben ihr sollt euch lieben. im himmel steht im himmel steht im himmel steht ihr sollt euch ihr sollt euch ihr sollt euch ihr sollt euch lieben ..... In dem Brief den du mir gabst, steht nur Scheiß.

ah, sí, hay nuevas cosas que decir de Quake...
The Quake III posee un engine que te permite caragr mdelos 3d en un formato de tipo loads MD3 . Este tipo de formato utliza movimientos de tipo vertices, ( aqui se controla y se guarda cada vertice de modo independiente, no es una animacion que posee jerarquias.Como es el caso de la animacion esqueletal) La ventaja de este tipo de animaciones, es que permite tener más key frames por segundo que lo estandar que era 10, esto hace que haya animaciones mucho mucho más complejas que las que encontrabamos en Quake II.

Otra cosa importantem es que con estos modelos de tipo MD3, los modleos son dividos en 3 difenretes partes las cuales estan atadas entre si. esto se hace para que se pueda separar la cabeza del torso y el torso de las piernas, para que asi cada elemento se mueva libremente. Esto faiclita mucho la animacion procendetal.(you know the kind of animation you use to simulate smoke and stuff)

ahora hablemos de unreal:
Casi todos los personajes, se hacen de dos mallas: un malla en tiempo real con miles de trianbgulos y una malla en detalle con milones de triangulos.


Animation
tiene animacion esqueletal que soporta hasta 4 huesos por vertice y esqueltos muy muy complejos.

La animacion es controlaa por el “AnimTree” - un arbol de nodos d animacion.

Que contiene controladorados de como se debe doblar un objeto.
Controladores que dicen como se debe mover tal objeto.
Controladores de fisica , para que respond ante impulsos etc.