Está en la página 1de 29

CPLP - Repaso para NO morir en el parcial

Práctica 1
¿Qué es un paradigma de programación?
Es una manera de programar, ya que existen distintas formas de diseñar un lenguaje de
programación y por lo tanto, diferentes formas de trabajar para obtener los resultados
esperados. Formalmente, un paradigma es un conjunto de métodos sistemáticos aplicables
en todos los niveles del diseño de programas que resuelven problemas computacionales.
Los lenguajes que adoptan varios paradigmas son llamados “multiparadigma”.

Distintos paradigmas (eso me recuerda que me dá asco el paradigma funcional)

Imperativo: programas que consisten en una sucesión de instrucciones, el programador da


órdenes concretas y escribe el paso a paso de lo que hará el programa.

● Tiene varios enfoques bién bizarros:


○ Programación estructurada: el flujo de control es definido mediante bucles
anidados, condicionales y subrutinas.
○ Programación procedimental: consiste en basarse (basa) en un número muy
bajo de expresiones que se repiten, se engloban todas en un procedimiento o
función y se llama cada vez que se tenga que ejecutar. Basically, programar
metiendo funciones/procedures.
○ Programación modular: consiste en dividir el programa en módulos o
subprogramas más pequeños de forma que se potencia la manejabilidad y
legibilidad del código. Es la evolución de la programación estructurada que
nos permite resolver problemas complejos.
Declarativo: no se definen algoritmos, se describe el problema en lugar de encontrar una
solución al mismo (wotefok amigo), el paradigma declarativo usa el principio de
razonamiento lógico para responder a preguntas o cuestiones consultadas.

● El paradigma declarativo se divide en dos:


○ Programación lógica.
○ Programación funcional.
○ Paradigma orientado a objetos (GOD, los demás ZZZ)
En este paradigma se construyen modelos de objetos que representan elementos del
problema a resolver, dichos elementos poseen características y funciones. De forma que
podemos separar diferentes componentes de un programa, simplificando la creación del
sistema para depurar y dejarlo listo para futuras mejoras. Dicho paradigma disminuye los
errores y promociona la reutilización del código. Es una forma especial de programar que se
acerca a cómo expresaremos las cosas en la vida real.
Posee diferentes conceptos como:
● Abstracción de datos.
CPLP - Repaso para NO morir en el parcial
● Encapsulación.
● Eventos.
● Modularidad.
● Herencia.
● Polimorfismo.
Paradigma reactivo
Este paradigma se basa en escuchar lo que emite un evento o cambios en el flujo de datos,
en donde los objetos reaccionan a los valores que reciben de dicho cambio.

Práctica 2
¿Qué se denomina regla lexicográfica y regla sintáctica?

Regla léxica: es el conjunto de reglas para formar las palabras “word” a partir de caracteres
del alfabeto.

Regla sintáctica: es el conjunto de reglas que define como formar expresiones y sentencias.
CPLP - Repaso para NO morir en el parcial

Tabla hermosa con cada meta símbolo de BNF, EBNF,


símbolos y significados

Concepto de sintaxis y sus elementos


Es el conjunto de reglas que definen cómo componer letras, dígitos y otros caracteres para
formar los programas. Es la forma de escribir en un lenguaje de programación.
Tiene los siguientes elementos:
❖ Alfabeto o conjunto de caracteres (código de caracteres -> ASCII, ASCII extendido,
UNICODE, etc).
❖ Identificadores (como llamamos a las variables, rutinas, etc).
❖ Operadores (cuales operadores para qué operaciones).
❖ Palabras claves y palabras reservadas: las palabras claves son aquellas que poseen
un significado dentro de un contexto y pertenecen al lenguaje, las reservadas son
palabras clave que NO pueden ser usadas por el programador.
CPLP - Repaso para NO morir en el parcial
❖ Comentarios y espacios en blanco.

Gramática, sus componentes


(son los mismos para BNF y EBNF)
G = (N, T, S , P) -> definición de gramática.
N = {<noTerminal1>, <noTerminal2>,...,<noTerminalN>} -> conjunto de no terminales, se
especifican así: <nombreNoTerminal>
T = {valor1,valor2,valor3,...,valorN} -> Conjunto de símbolos terminales.
S = <noTerminalBase> -> es el símbolo distinguido de la gramática que pertenece a N,
en S tenés que poner el primer símbolo no terminal que vas a empezar a definir.
P={
<noTerminal1> ::= <algo>
} -> conjunto de producciones, acá definimos que va a significar cada símbolo no
terminal, para decir que un símbolo no terminal es igual a X cosa, se usa ::=

Definición de gramática, ejemplo en BNF


Definiremos la gramática en BNF para definir una palabra cualquiera.

G = (N, T, S , P)
N = {<palabra>, <letra>}
T = {a,b,c,d,e,f,g,h,i,j,k,l,m,n,ñ,o,p,q,r,s,t,u,v,w,x,y,z}
S = <palabra>
P{
<palabra> ::= <letra><palabra> | <letra>
<letra> ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | ñ | o | p | q | r | s | t | u | v | w | x |
y|z
}
El “|” nos sirve para representar la selección de una alternativa.
Cuando hacemos <noTerminal> ::= <algo><noTerminal> | <algo> aplicamos recursión, es la
única forma que tenemos de repetir algo.

Definición de gramática, ejemplo en EBNF


Definiremos la gramática para definir números reales.
G = (N, T, S, P)
N = {<real>, <digito>, <numero>}
T = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
P={
<real> ::= [(+|-)] <numero> [,<numero>]
<numero> ::= <digito>{<digito>}*
<digito> ::= (0| 1| 2| 3| 4| 5| 6| 7| 8| 9)
}
(|) es una selección de dos o más caminos
[ ] es un elemento optativo (puede estar o no)
{} es una repetición, y si le agregas * al final es una repetición de 0 o más veces.
CPLP - Repaso para NO morir en el parcial
Diagramas sintácticos: expresan los “pasos” gramaticales necesarios para construir
una palabra válida del lenguaje.

Defina utilizando diagramas sintácticos la gramática para la definición de un identificador de


un lenguaje de programación:

Ejemplo bien wtf del uso y las limitaciones de la gramática EBNF

Defina en EBNF una gramática para la construcción de números primos.¿Qué debería


agregar a la gramática para completar el ejercicio?

G = (N, T, S, P)
N ={<nroPrimo><nroEntero>,<digito>,<digitoFinal>,<digitoUnico>,<nro>}
T = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
S = <nroPrimo>
P={
<nroEntero> ::= [(+|-)] <nro>
<nro> ::=( {<digito>}*<digitoFinal>| <digitoUnico>)
<digito> ::= ( 0|1|2|3|4|5|6|7|8|9)
<digitoFinal> ::= (1|3|7|9)
<digitoUnico>::(2|3|5|7)
}
Con esto se acotan los números primos de un solo dígito y se eliminan los números
pares y múltiplos de 5 de la lista (mayores a 2 y 5 respectivamente).
Falta poder condicionar que el número N no debe tener divisores entre los números primos
menores a raíz(N). Operación que no es posible definir en la gramática.

Si en la gramática que definiste hay dos formas de expresar lo mismo es


ambiguo, es decir hay varios caminos para llegar a lo mismo
ejemplo:
P={
CPLP - Repaso para NO morir en el parcial

<numero_entero>::=<digito><numero_entero> | <numero_entero><digito> | <digito>


<digito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
}
Que sea <digito> + <numero_entero> o <numero_entero> + <digito> es lo mismo

Práctica 3
¿Qué define la semántica?
Conjunto de reglas para saber qué pasa cuando se ejecuta, si va a ser válido o no. Se
describe el significado de símbolos, palabras y frases de un lenguaje. Explicar qué hace una
sentencia sintácticamente válida.

¿Qué significa compilar un programa? Describa brevemente


cada uno de los pasos necesarios para compilar un programa.
El compilador es un programa que traduce nuestro programa, pero el mismo se realiza
previo a la ejecución. Prepara el programa en el lenguaje máquina para que luego pueda
ser ejecutado.

¿En qué paso interviene la semántica y cual es su importancia


dentro de la compilación?
Hay dos pasos, primero está el análisis que se divide en tres etapas
Análisis léxico (Scanner): Hay un análisis a nivel de palabra (LEXEMA). Se fija que cada
elemento del programa se corresponda con un operador, un identificador, etc. De esta
forma verifica todas las palabras, sino que también se ve si son válidas o no.
Análisis semántico (Parser): Se realiza luego de análisis léxico. Se analiza a nivel de
cada sentencia Busca estructuras, sentencia, declaración, expresiones, variable
Análisis semántico (semántica estática): Es la fase más importante. Todas las
estructuras sintácticas conocidas son analizadas. Se realiza una comprobación de tipos,
se agrega información implícita (variables no declaradas), se agregan tablas de símbolos
de los descriptores de tipos, etc. a la vez que se hacen consultas para realizar
comprobaciones.
Y después está la síntesis, que consiste en construir el programa ejecutable, donde se
genera el código necesario y se optimiza el programa generado.

La semántica es importante en la fase de análisis ya que se necesita para que todas las
estructuras sintácticas sean reconocidas , además de que se comprueban tipos, nombres
y se agrega información implícita

Diferencia entre intérprete y compilador


La interpretación consiste en la traducción del programa realizado en el momento de su
ejecución, para lo cual se realiza una tarea repetitiva que consiste en:
obtener próxima sentencia -> determinar acción a ejecutar → ejecutar la acción
CPLP - Repaso para NO morir en el parcial
(Cada acción posee un subprograma asociado al lenguaje máquina que la realiza).
Por lo que el intérprete irá llamando a cada subprograma en la secuencia indicada,
traduciendo en el momento.

La parte buena del intérprete es que ahorra espacio en memoria ya que las instrucciones
del lenguaje se dejan en su forma original.
Como desventajas se puede señalar que ante procesos iterativos requiere una mayor
carga de procesador por lo que es más lento en ejecución que un compilador.

La compilación consiste en la traducción del programa en su totalidad al código máquina


que entiende el procesador.
Dicha tarea es realizada antes de la ejecución del programa, se ejecutan en dos pasos y
existe un paso opcional que es adicional.
La compilación resulta ser más rápida que la interpretación (desde el hardware).
El problema con el compilador es que puede usar mucho más espacio en memoria ya que
una sentencia puede tener asociada una cantidad alta de código máquina.
El compilador puede presentar problemas a la hora de determinar errores ya que toda
referencia al código fuente se pierde en el código objeto.

Tipos de errores {de basa}


un error sintáctico consiste en un error que se produjo al analizar la sintaxis del código,
este se genera cuando el programador escribe código que no va de acuerdo con las
reglas de escritura/sintaxis que el lenguaje posee
mientras que un error semántico se produce cuando el significado de lo escrito no es el
que se pretendía pese a que la sintaxis del mismo es correcta
la diferencia entre los semánticos en compilación y los semánticos en ejecución es que
los semánticos en ejecución no pueden ser detectados hasta que la línea sea ejecutada
el ejemplo más claro sería la división por 0, debido a que es una cuenta válida para
compilar pero genera un error al ejecutarla

● errores sintácticos ejemplos;


○ PUNTO Y COMA AHHH
○ escribir variables que empiezan en número
○ error de indentación en python

● errores semánticos en compilación ejemplos;


○ variable no definida
○ asignar un string a un integer
○ declarar una variable 2 veces

● errores semánticos en ejecución ejemplos;


○ dividir por 0
○ file not found
○ index out of bounds {bounce}
○ LOS ERRORES QUE HACEN SALTAR EXCEPCIONES SON ERRORES
SEMÁNTICOS EN EJECUCIÓN
CPLP - Repaso para NO morir en el parcial

Práctica 4
Formas de inicializar una variable al momento de declararla
Existen dos estrategias de inicialización o podés ignorar el problema.
1. Ignorar el problema: le metés lo que haya en memoria.
2. Dar una estrategia de inicialización:
a. Inicialización por defecto: dependiendo el tipo de dato, la variable se
inicializará con un valor válido, por ej: si es entero se inicializa con 0, si es
caracter se inicializa en blanco.
b. Inicializar en la declaración.
Forma de inicializar en lenguajes

Alcance de variables, L-valor y r-valor


CPLP - Repaso para NO morir en el parcial
Especifique los atributos de las variables de la linea 3 y luego compare con el puntero
de la linea 4

Atributos (linea 3)
nombre : “a” “i”
alcance: Estático {de línea 3 a 16}
tipo: Predefinido
L-value: dinámica automática
r-Value: Indefinido

Atributos (Puntero)
Nombre: p ,
alcance: estático ( de line 4 a 16 ) ,
tipo: Definido por el programador,
L-value: dinámica automática , r-value: inDefinido
Tiene un tipo distinto ( este es definido por el programador ) y un nombre distinto, además el
r-value es indefinido

Inicialización de variables en los lenguajes

Variables locales y globales (incluye algo de estaticas y


dinamicas)
a. ¿A qué se denomina variable local y a que se denomina variable global?

● Variable local: Referencias que se han creado dentro del programa o


subprograma
● Variable no local: Referencia que se utiliza dentro del subprograma, pero no
han sido creadas en él.
● Variables globales: Referencia creadas en el programa principal.
CPLP - Repaso para NO morir en el parcial
b. ¿Una variable local puede ser estática respecto de su l-valor? En caso afirmativo dé
un ejemplo
Sí: las variables static de C, cuyo binding para el l-value se realiza en
compilación, lo que lleva a que vivan durante toda la ejecución del programa, más
allá de cuál sea su alcance.
c. Una variable global ¿siempre es estática? Justifique la respuesta.
No siempre es estatica, es posible crear variables globales dinámicas aunque
no es recomnedable ya que puede llevar a errores de programación
En la programación de computadoras, una variable global es una variable
con alcance global, lo que significa que es visible (por lo tanto accesible) en
todo el programa, a menos que esté oculta. El conjunto de todas las variables
globales se conoce como el entorno global o el estado global. En los lenguajes
compilados, las variables globales son generalmente variables estáticas,
cuya extensión (lifetime) es toda la ejecución del programa, aunque en los
lenguajes interpretados (incluidos los intérpretes de línea de comandos), las
variables globales generalmente se asignan dinámicamente cuando se
declaran, ya que no se conocen antes de tiempo.
d. Indique qué diferencia hay entre una variable estática respecto de su l-valor y una
constante
El l-value de las variables estáticas queda parcialmente determinado en la
compilación. Una constante puede ser automática, con lo que su l-value se
conocería recién en ejecucion.

Tiempo de vida vs alcance de una variable, ejemplos


Ejercicio 9: Elija un lenguaje y escriba un ejemplo: Arturo, robá el código de pascal de
arriba xd (adecuandolo)
a. En el cual el tiempo de vida de un identificador sea mayor que su alcance
0-Program Uno;
1-type tpuntero=^integer;
2- var mipuntero:
tpuntero;
3- var i:integer;
4- var h:integer;
5- Begin
6- i:=3;
7- mipuntero:=nil;
8- new(mipuntero);
9- mipuntero^:=i;
10-h:= mipuntero^+i;
11-dispose(mipuntero);
12-write(h);
13-i:= h- mipuntero;
14- End.
La variable i tiene tiempo de vida 0-14 y alcance 3-14

b.
En el cual el tiempo de vida de un identificador sea menor que su alcance
CPLP - Repaso para NO morir en el parcial
0-Program Uno;
1-type tpuntero=^integer;
2- var mipuntero: tpuntero;
3- var i:integer;
4- var h:integer;
5- Begin
6- i:=3;
7- mipuntero:=nil;
8- new(mipuntero);
9- mipuntero^:=i;
10- h:= mipuntero^+i;
11- dispose(mipuntero);
12- write(h);
13- i:= h- mipuntero;
14- End.

miPuntero tiene tiempo de vida desde el new hasta el dispose 8-11


miPuntero tiene alcance desde que es declarada 3-14

c. En el cual el tiempo de vida de un identificador sea igual que su alcance

1. static int aux;


2. int v2;
3. static int fun2( )
4. { extern int v1;
5. aux=aux+1;
6. }
7. int fun3( )
8. { int aux;
9. aux=aux+1;
10. }

Todo junto
CPLP - Repaso para NO morir en el parcial

Práctica 5
Registro de activación y cada una de sus partes
CPLP - Repaso para NO morir en el parcial
● Pto retorno: cuando una rutina llama a otra y esta última rutina termina, el punto de
retorno será la dirección de memoria donde se debe seguir ejecutando el programa.
● EE (LE - Enlace estático): es el puntero a la dirección base del registro de activación
de la rutina que estáticamente la contiene. Osea, quien me contiene, si yo soy una
función/procedure definido dentro de otra, entonces esa otra me contendrá.
● ED (Enlace dinámico): puntero a la dirección base del registro de activación de la
rutina que me llamó. Osea, rutina A llama a rutina B, el enlace dinámico de rutina B
será la dirección base del registro de activación de la rutina A.
● Variables: se enumeran las variables que conforman la unidad y se le van
reemplazando los valores de acuerdo a como se ejecuta el programa.
● Procedimientos y funciones: solo se enumeran los identificadores que contiene la
unidad.
● VR (Valor de retorno): los valores retornados por las funciones llamadas desde una
unidad X se deberán escribir en el VR. Ejemplo, si yo, rutina A, llamo a rutina B y
rutina B devuelve algo, debo escribir ese algo en el VR de rutina A.

Cadena estática y cadena dinámica


Es un concepto aplicable a la hora de buscar una variable fuera de la localía de una
rutina.
Program ejemplo;
var
var1: integer;
var2: char;
Procedure A
begin
var1 := 50;
end
Procedure B;
var
var1: integer;
begin
var1:= 100;
A();
end;
Begin
var1 := 15;
var2 := ‘B’;
B();
End.

Este tipo de cosas son visibles más con código, so anyway.

Si yo te pido que hagas la pila de ejecución por cadena estática, lo que te voy a pedir es
que si encontrás que se usa una variable que no está definida en el ámbito local de una
rutina, buscala siguiendo la cadena estática.
Es decir, el enlace estático. En nuestro caso, el procedure A modifica el var1 que no lo
define localmente, a procedure A lo contiene estáticamente el Program ejemplo, por lo tanto
CPLP - Repaso para NO morir en el parcial
tomaría el var1 de registro de activación.

Ahora, si yo te pido que busques por cadena dinámica, entonces vas a buscar el ED (enlace
dinámico) de quién te llamó, al procedure A lo llama el procedure B, y este tiene definido
una variable llamada var1, por lo tanto toma dicha variable.

Pila de ejecución, ejemplo


Program ejemploPila;
var
iterador: integer;
arreglo: array[1..10] of integer;
caracter: char;
Procedure A;
begin
caracter := ‘A’;
end;
Procedure B;
var
caracter:char;
begin
caracter := ‘B’;
A();
end;
Procedure C;
var
resultado : integer;
begin
resultado := D();
write(resultado) #imprime 25
end;
Function D;
var
valor1, valor2, resultado : integer;
begin
valor1 := 5;
valor2 := 5;
resultado := valor1 * valor2;
return resultado;
end;
BEGIN
iterador := 30;
caracter := ‘C’;
write(iterador); #imprime 30
write(caracter); #imprime C
for iterador := 1 to 10 do
begin
arreglo[iterador] := 5 * iterador;
CPLP - Repaso para NO morir en el parcial
end;
iterador := 50;
for iterador := 1 to 10 do
begin
write(arreglo[iterador]) #imprime 5 10 15 20 25 30 35 40 45 50
end;
B();
write(caracter)
C();
END.

Cadena Estática

1* REG ACTIVACIÓN ejemploPila

Pto retorno

EE

ED

arreglo(1) = 5

arreglo(2) = 10

arreglo(3) = 15

arreglo(4) = 20

arreglo(5) = 25

arreglo(6) = 30

arreglo(7) = 35

arreglo(8) = 40

arreglo(9) = 45

arreglo(10) = 50

iterador = 30, 1..10 ,50, 1..10

caracter = ‘C’, ‘A’


{en caso de ser cadena dinamica, caracter = ‘C’}

Procedure A

Procedure B

Procedure C

Function D
CPLP - Repaso para NO morir en el parcial

VR

2* REG ACTIVACIÓN B

Pto retorno

EE(1*)

ED(1*)

caracter = ‘B’
{en caso de ser cadena dinamica, caracter = ’B’, ‘A’}

VR

3* REG ACTIVACIÓN A

Pto retorno

EE(1*)

ED(2*)

VR

4* REG ACTIVACIÓN C

Pto retorno

EE(1*)

ED(1*)

resultado = 25

VR = 25 (resultado de la función D)

5* REG ACTIVACIÓN D

Pto retorno

EE(1*)

ED(4*)

valor1 = 5

valor2 = 5

resultado = 25

VR
CPLP - Repaso para NO morir en el parcial

Práctica 6
Conceptos
Parámetro: variable utilizada para recibir valores de entrada en una rutina, subrutina o
método.
● Parámetro real: son las expresiones que se utilizan en la llamada de la función.
● Parámetro formal: son las variables que recibe la función, creadas al definir la función. El
contenido de esos parámetros formales se setean cuando se llama a dicha función. Los
parámetros formales son variables locales dentro de la función.
● Ligadura posicional: Se relaciona la primer variable que mandas al invocar con el
primer parámetro de la definición
● Ligadura por palabra clave o nombre: Se relaciona la variable real con la variable del
parámetro por nombre.

Pasaje de Parámetros, tipo de pasajes, forma de actuar de


cada uno
Modo IN
El parámetro formal recibe el dato desde el parámetro real.
CPLP - Repaso para NO morir en el parcial
Por valor
● El valor del parámetro real es USADO para inicializar el correspondiente
parámetro formal al invocar la unidad.
● Es transferido el dato real (NO DIRECCIÓN).
● El parámetro formal actuará como una variable local de la unidad llamada.

Por valor constante


● La implementación debe verificar que el parámetro real no sea modificado.

Modo OUT
El parámetro formal envía el dato al parámetro real.

Por Resultado
● El valor del parámetro formal es copiado al parámetro real al terminar de
.ejecutarse la unidad llamada.
● El parámetro formal es una variable local, sin valor inicial.
● Lo positivo de esto es que la unidad que llama tiene sus datos protegidos ya
que el parámetro real no es modificado en la ejecución de la unidad llamada
(se modifica cuando ésta termina).
Por Resultado de funciones
● El resultado de una función puede devolverse con una sentencia return.
● El resultado reemplazará la invocación en la expresión que contiene el
llamado.

Modo IN/OUT
El parámetro formal recibe el dato del parámetro real y el parámetro formal le envía
el dato al parámetro real.

Por Valor-Resultado
● El parámetro formal es una variable local que recibe una copia del contenido
del parámetro real, y a la salida de la unidad llamada el contenido que quedó
en el parámetro formal es copiado al parámetro real.
● Las referencias al parámetro formal son referencias locales.

Por Referencia
● Se transfiere la dirección de memoria del parámetro real al parámetro formal.
● El parámetro formal será una variable local a la unidad llamadora que
contiene la dirección en el ambiente no local (wtf).
● CADA referencia al parámetro formal será a un ambiente no local (dirección
de memoria del parámetro real). Esto implica que cualquier cambio hecho en
el parámetro formal quedará registrado en el parámetro real.
● El parámetro real es compartido por la unidad llamada.
Por Nombre (la peor de todas)
● El parámetro formal se sustituye textualmente por el parámetro real (ok si).
● Es más flexible por la evolución de valor diferida.
CPLP - Repaso para NO morir en el parcial
● Puede actuar de diferente forma en base al dato a compartir:
● Si es un único valor (una variable pete): es igual que el pasaje por
referencia.
● Si es una constante es por valor (enviás un valor y no una variable).
● Si es un elemento de un arreglo se puede cambiar el suscrito entre
las distintas referencias.

● J va a ser a(m). Si cambiamos m, cambiamos la referencia.


● el arreglo a tenía los siguientes valores: 1,2,3,4,5,6,7,8,9,10.
● m es 4 después.
● El arreglo después de ejecutar el procedure queda así:
1,2,3,9,10,6,7,8,9,10. Se modificó a(4) y a(5) -> por el cambio
de M.
● Es importante remarcar que los parámetros por nombre se
evalúan cada vez que se utilizan, usando el contexto del
parámetro real.
● Si es una expresión se evalúa cada vez.
CPLP - Repaso para NO morir en el parcial

Ejemplo de pasaje de parámetros en Pascal-like

b- Decir qué imprime el programa suponiendo que para todas las variables que se pasan
el pasaje de parámetros es por: (Deberá hacer la pila estática y dinámica para cada caso)
i- Referencia. ii- Valor iii-Valor Resultado iv- Nombre v-Resultado.

i - Referencia (estático )
Recibe imprime 5, 5, 5, 5, 6
Dos imprime 5, 5, 5
Main imprime 5, 5, 6

i- Referencia ( dinámico )
Recibe imprime 5 8 5 8 9
Dos imprime 5 8 9
Main imprime 5 8 2

ii- Valor ( estático )


Recibe imprime 5 5 1 3 6
Dos imprime 1 3 5
Main imprime 1 3 6

ii- Valor ( Dinámico )


Recibe imprime 5 8 1 3 9
Dos imprime 1 3 9
Main imprime 1 3 2
CPLP - Repaso para NO morir en el parcial

iii- Valor Resultado ( estático)


Recibe imprime 5 5 1 3 6
Dos imprime 5 5 5
Main imprime 5 5 6

iii- Valor Resultado (dinámico)


Recibe imprime 5 8 1 3 9
Dos imprime 5 8 9
Main imprime 5 8 2

iv- Nombre( estatico )


Recibe imprime 5, 5, 5, 5, 6
Dos imprime 5 5 5
Main imprime 5 5 6

iv- Nombre( dinamico )


Recibe imprime 5 8 5 8 9
Dos imprime 5 8 9
Main imprime 5 8 2

v- Da error porque usa las variables sin inicializarlas

SHALLOW AND DEEP


Estos conceptos aplican cuando hacemos referencias no locales dentro de una
función/procedimiento que se llamó siendo usada como parámetro. Es decir, una rutina X
tiene como parámetro una rutina Z, y dentro de la rutina X se usa la rutina Z (el parámetro).
Si en rutina Z hacemos referencias no locales entonces este concepto toma relevancia.

SHALLOW
(parecido a buscar una variable por cadena dinámica):
El ambiente de referencia, es el del subprograma que tiene el parámetro formal
subprograma. Ejemplo: SNOBOL.

DEEP
(parecido a buscar una variable por cadena estática):
El ambiente es el del subprograma dónde está declarado el subprograma usado como
parámetro real. Se utiliza en los lenguajes con alcance estático y estructura de bloque
CPLP - Repaso para NO morir en el parcial

Práctica 7
¿Qué es un sistema de tipos y cuál es su principal función?
Es un conjunto de reglas usadas por un lenguaje para estructurar y organizar sus tipos.
El objetivo de dicho sistema es escribir programas más seguros.

Sebesta

• Un lenguaje fuertemente tipado es uno en el cual cada variable en el programa tiene un


tipo asociado con él, y este tipo es conocido en tiempo de compilación.

La esencia de esta definición es que todos los tipos son ligados estáticamente y su
debilidad es que ignora la posibilidad de que, aunque el tipo de la variable sea conocido, la
dirección de almacenamiento a la cual está ligada puede almacenar valores de diferentes
tipos en tiempo de ejecución para tomar esta posibilidad en cuenta definimos un lenguaje de
programación como fuertemente tipado si los errores de tipos son siempre detectados
(compilación y ejecución).

Fuertemente tipado según la teoría de la cátedra:

● Sabemos que el sistema de tipos de un lenguaje se define como el conjunto de


reglas que deben seguirse para definir y manejar los datos de un programa.

● El objetivo de un sistema de tipos es escribir programas seguros.

● Se dice que un sistema de tipos es fuerte si garantiza la seguridad en el uso de


tipos.

● Un lenguaje se dice fuertemente tipado si su sistema de tipos es fuerte.

● Un lenguaje tipado estáticamente es fuertemente tipado.

● Si el lenguaje es fuertemente tipado el compilador puede garantizar la ausencia de


errores de tipo del programa.

● Un lenguaje tipado estáticamente es aquel en el que el tipo de cada expresión se


conoce en compilación y tiene un sistema de tipos estático.

● Un lenguaje puede ser fuertemente tipado y no ser tipado estáticamente. {ósea..


dinámico} Las reglas del sistema de tipos garantizan que son seguros en tipo
(lenguajes OO, lenguajes uncionales) Se requieren procedimientos de chequeo de
tipos más complejos.

Ø Tipos definidos por el usuario


CPLP - Repaso para NO morir en el parcial
Los lenguajes de programación permiten al programador especificar agrupaciones de
objetos de datos elementales y de forma recursiva, agregaciones de agregados

{agrupaciones de elementales son cosas como clases, objetos, etc. Y agregaciones de


agregados hace referencia a listas de listas, etc.}

Ø TIPOS DE DATOS COMPUESTOS - CONSTRUCTORES

o Producto Cartesiano

o Correspondencia Finita

o Unión

o Recursión

Producto cartesiano

Utilizar elementos de dos conjuntos para definir algo del mundo real
Por ejemplo un registro en pascal o una clase en java. Si yo hago registró persona con edad
y nombre combinó un elemento del conjunto de los enteros con un elemento del conjunto de
los strings para representar una persona, lo mismo si fuese un objeto en java.

Te podría dar un ejemplo del producto cartesiano para coordenadas tenés datos x e y, el
producto cartesiano sería {x,y}, es decir la coordenada de un punto

Correspondencia Finita.

Es una función de un conjunto finito de valores de un tipo de dominio DT en valores de un


tipo de dominio RT

DT-> tipo de dominio {int por ej}

RT-> resultado del dominio {acceso a través del índice}

Matemáticamente hablando ,al recibir un A vas a devolver un B, es decir, en un arreglo, si


yo le paso 1 me devuelve el elemento en la posicion 1 del arreglo. Desde este punto de
vista, una funcion en cualquier lenguaje ( cualquier lenguaje = Pascal y C ) es una
correspondencia finita, porque si yo le paso un valor me devuelve otro valor x, y siempre
devuelve el mismo resultado para el mismo valor. Otro en ejemplo puede ser una tupla en
pitón

Unión

La unión de dos o mas tipos define un tipo como la división de los tipos dados

“El único que lo utiliza es C, aunque puede haber otros”

-Profe de la clase 7
CPLP - Repaso para NO morir en el parcial
El tipo de dato va a ser 1 de los x definidos, pero no ambos. Esto no es seguro entonces
para que sea seguro se usa el discriminante que te dice que mientras se usa uno no se
puede usar el otro, para evitar errores.

Ejemplo son las uniones de C.

Tipo recursivo T

Un tipo de dato recursivo T se define como una estructura que puede contener
componentes de tipo T

Define datos agrupados cuyo tamaño puede crecer arbitrariamente y cuya estructura puede
ser arbitrariamente compleja

Los lenguajes soportan la implementación de tipos de datos recursivos a través de los


punteros. Ejemplos tenemos las listas de pascal, arboles, etc.

Mutabilidad/Inmutabilidad
( si a vos te definen y no te podes modificar, sos ininmutable hermano, en dos dias no te
tocan )

Manejo de punteros y sus problemas


a. Violación de tipos:

b. Referencias sueltas, dangling:


Si el objeto puntero no está alocado se dice que el puntero es peligroso. Un dangling
es un puntero que contiene una dirección de una variable dinámica que fue
desalocada. Si luego se usa el puntero ocurrirá un error.
c. Punteros no inicializados:
Peligro de acceso descontrolado a posiciones de memoria, se verifica
dinamicamente la inicialización. La solución a los punteros no inicializados es aplicar
CPLP - Repaso para NO morir en el parcial
valores especiales que signifiquen nulo: nil en Pascal, void en C o C++, null en ADA,
Python.
d. Punteros con uniones discriminadas:

e. Alias:

f. Liberación de memoria: objetos que se pierden.


Las variables puntero se alocan como cualquier otra variable en la pila de registros
de activación.
● Los objetos apuntados que se alocan a través de la primitiva new son
alocados en la heap.
● La memoria disponible heap podría rápidamente agotarse a menos que de
alguna forma se devuelva el almacenamiento alocado liberado.

TAD
Abstraer es representar algo descubriendo SUS características esenciales y suprimiendo
las que no lo son

El principio básico de la abstracción es la información oculta

Las TADs, satisfacen

Ø Encapsulamiento

o La representación del tipo y las operaciones permitidas para el tipo se


describen en una única unidad sintáctica

Ø Ocultamiento de información

o La representación de los objetos y la implementación del tipo permanecen


ocultos
CPLP - Repaso para NO morir en el parcial

Práctica 8
¿A qué denominamos excepción?
Es una condición inesperada o inusual que surge durante le ejecución del programa
y no puede ser manejada en el contexto local.

¿Que debe proveer un lenguaje para manejar excepciones?


1. Forma de definir excepciones.
2. Forma de alcanzar una excepción.
3. Forma de especificar manejadores de excepciones.
4. Elección de un modelo de ejecución (criterio de continuación).

Criterios de continuación (o modelos de ejecución)

Reasunción
Cuando ocurre una excepción, se maneja y cuando se termina de tratar, el control de
la ejecución es devuelto a la sentencia siguiente de donde se levantó la excepción.

Terminación
Cuando se produce la excepción, el bloque donde se levantó la misma es terminado
y se ejecuta el manejador asociado a dicha excepción.

Inseguridades del criterio de reasunción


El criterio de reasunción es más inseguro ya que puede dejar ciertas cosas sin
controlar que deberian ser controladas. Puede ocurrir que un dato que provoque una
excepción no tenga los valores correctos al terminar el manejo de la excepción, y si en el
mismo bloque dicho dato se usa de nuevo puede darme problemas.
El modelo de terminación evita todos los problemas adicionales que puedan surgir,
yo se que en X bloque ocurrió una excepción, entonces me aseguré de que el bloque
peligroso fue finalizado.

¿Como simulo excepciones?


Cuando tengo un lenguaje sin manejo de excepciones, pueden simularse usando if’s
y llamados a procedimientos que “manejan” el error, todo esto de forma muy manual. En
base a esto se concluye que simular excepciones delega muchisimas más
responsabilidades en el programador lo cual puede ser contraproducente.
CPLP - Repaso para NO morir en el parcial

Práctica 9
Sentencia simple, sentencia compuesta, ¿diferencia?
Una sentencia simple es una expresión que termina en ;
Una sentencia compuesta son varias sentencias individuales encerradas entre
delimitadores, por ejemplo begin, end, o llavecitas.

¿Una expresión de asignación puede producir efectos laterales


que afecten al resultado final, dependiendo de cómo se
evalúe?
Una expresión de asignación puede tener distintos resultados dependiendo de cómo
se evalúe, hay dos formas, izquierda a derecha, derecha a izquierda:
z := 1;
x := z + F(z);

Procedure F(var z: integer);


begin
z := z + 1;
end;

Si se evalúa de izquierda a derecha, x valdría 3.


Si se evalúa de derecha a izquierda, x valdría 4.

Circuito corto y circuito largo


La evaluación por circuito corto, también conocida como evaluación mínima, es
cuando en la evaluación de una expresión el segundo argumento no es ejecutado si el
primer argumento evalúa a falso si es un AND; y si el primer argumento dá verdadero
siendo un OR entonces toda la expresión es verdadera por lo que los siguientes
argumentos no son ejecutados.

- if condición1 AND condición2:


- Si condición1 da falso, entonces condición2 no se comprueba (como
es un AND, si uno es falso, toda la expresión lo es).
- if condiciónA OR condiciónB:
- Si condiciónA dá verdadero, entonces condiciónB no se comprueba
(como es un OR, si uno es verdadero, toda la expresión lo es).

En la evaluación por circuito largo se evalúa toda la condición.


CPLP - Repaso para NO morir en el parcial

Practica 10 ( que paja)


Paradigma funcional
En un programa funcional, todos los elementos pueden entenderse como funciones
y el código puede ejecutarse mediante llamadas de función secuenciales. Por el
contrario, no se asignan valores de forma independiente. Una función se imagina
mejor como una variante especial de un subprograma. Esta es reutilizable y, a
diferencia de un procedimiento, devuelve directamente un resultado.
Las variables son variables matemáticas, no las de celda de memoría.
A través de un mecanismo de reducción o simplificación se ejecutan los
lenguajes:

Sobre la reducción: hay dos formas de aplicarla, una es de orden aplicativo donde
se evalúan los argumentos los necesite o no, la otra forma es orden normal donde
se calcula lo necesario.

Paradigma POO
Es un conjunto de objetos que interactúan entre sí enviando mensajes.

Elementos
- Objetos: datos abstractos con comportamiento(métodos) y estado interno(variables
de instancia).
- Mensajes: petición de un objeto a otro para que este se comporte de una forma
determinada.
- Métodos: comportamiento asociado a un objeto (bloques de procedimientos o
funciones, duh), la ejecución de un método se desencadena a través de un mensaje
recibido.
- Clases: son tipos definidos por el usuario que determina las estructuras de datos y
las operaciones asociadas con ese tipo definido, cada objeto pertenece a una clase
y dicho objeto tiene su funcionalidad.
- Instancia de clase: cuando construimos un objeto se crea una instancia de esa
clase. Es un objeto individual por los valores que tomen los atributos (variables de
instancia).
CPLP - Repaso para NO morir en el parcial

La posibilidad de ocultamiento y encapsulamiento para los objetos es el


primer nivel de abstracción de la POO, ¿cuál es el segundo?
- La herencia es el segundo nivel de abstracción de la POO, con ella agrupamos las
clases en jerarquías de clases definiendo Subclases y Superclases de forma tal que
la subclase A hereda todas las propiedades de su superclase B.
- Tipos de herencia (la enojada):
- Herencia simple: Indica que se pueden definir nuevas clases solamente a
partir de una clase inicial (superclase).
- A hereda de B.
- Herencia múltiple: Indica que se pueden definir nuevas clases a partir de dos
o más clases iniciales (superclases).
- A hereda de B y C.
- Dudo que las siguientes sean herencias como tales pero bueno:
- Herencia de implementación: La implementación de los métodos es
heredada. Puede sobreescribirse en las clases derivadas.
- Herencia de interfaz: Sólo se hereda la interfaz, no hay
implementación a nivel de clase base.
- Smalltalk usa herencia simple.
- C++ tiene herencia simple y múltiple.

Paradigma lógico
Es un tipo de paradigma dentro del paradigma declarativo. Los programas son una serie de
aserciones lógicas. El conocimiento se representa a través de reglas y hechos, los objetos
se representan por términos, los cuales tienen constantes y variables. PROLOG es el
lenguaje mas utilizado ( lo gracioso es que PROgramacion LOGica xD )

los hechos son declaraciones ciertas mientras que las reglas son hechos que poseen una
condición para ser verdad

Las variables son uno de los componentes de los objetos, las constantes
son lo mismo, representadas por cadenas de string en minúscula o números

Lenguajes basados en script


En un principio estos lenguajes eran un conjunto de comandos escritos en un archivo para
ser interpretado ( momento bash). Este archivo se denomina script.

Estos lenguajes tienden a mejorar flexibilidad , desarrollo rápido y chequeo dinámico. Su


sistema de tipos se construye sobre conceptos de mas alto nivel como tablas patrones listas
y archivos.

Ejemplos serian Python ( VAMO PYTHON PAPA PYTHON MI VIDA MI CORAZON MI


PASION. POR SI NO LO SABIAN PYTHON ES DE PISCIS ) , javascript, php y Perl

La definición seria : “Los lenguajes script no asumen la existencia de componentes útiles en


otros lenguajes. Su intención no es escribir aplicaciones desde el comienzo sino por
combinación de componentes.”

También podría gustarte