850 likes | 1.18k Views
Elementos de un lenguaje de programación. Que nos brinda el lenguaje. a + b que tipos de valores brinda qué operaciones proporciona qué significan los símbolos a y b es legal sumar a y b expresiones y funciones. Little Quilt. Manipula objetos geométricos ancho altura patrón
E N D
Elementos de un lenguaje de programación Lenguajes de Programación
Que nos brinda el lenguaje • a + b • que tipos de valores brinda • qué operaciones proporciona • qué significan los símbolos a y b • es legal sumar a y b • expresiones y funciones Lenguajes de Programación
Little Quilt • Manipula objetos geométricos • ancho • altura • patrón • pueden estudiarse y visualizarse de manera independiente de los constructores del lenguaje. Lenguajes de Programación
Los primeros lenguajes de programación, manejaban: enteros, reales y arreglos de enteros y reales. Que podía ser visualizados y estudiados de forma independiente de cualquier lenguaje. Lenguajes de Programación
los dos objetos primitivos del lenguaje son piezas cuadradas con los siguientes patrones: • los retazos se pueden girar y coser Lenguajes de Programación
Reglas de retazos • un retazo es una de las piezas primitivas, o • se forma girando 90° un retazo hacia la derecha, o • se forma cosiendo un retazo a la derecha de otro de igual altura • ninguna otra cosa es un retazo Lenguajes de Programación
los retazos se pueden girar y coser • los giros conducen a retazos diferentes Lenguajes de Programación
Sintaxis de las expresiones que denotan retazos • La primera etapa en la construcción de un lenguaje es asignar nombres a las piezas primitivas y a las operaciones sobre retazos. • Los objetos se llaman a y b ;las operaciones son giro y costura. Lenguajes de Programación
Las expresiones complejas se construyen a partir de expresiones más simples y las más simples comienzan con los nombres a y b. • E es una expresión si: • E es a, o • E es b, o • E es giro (E1) y E1 es una expresión , o • E es costura (E1 , E2) y E1y E2 son expresiones • Ninguna otra cosa es una expresión. Lenguajes de Programación
Una versión BNF • < expresión> ::= a • | b • | giro (<expresión>) • | costura (<expresión>), <expresión>) Lenguajes de Programación
Semántica de las expresiones • La semántica de las expresiones especifica el retazo formado por la aplicación de una expresión. ¿ qué retazo genera la siguiente expresión ? • costura (giro (giro ( b ) ), a) • la respuesta se construye a partir de los retazos generados por las sub-expresiones {28} Lenguajes de Programación
Funciones definidas por el usuario • El universo de las expresiones se expande al definir funciones de retazos a retazos. • Las funciones permiten que los retazos se especifiquen de manera más conveniente. • girar a la izquierda (giro_iz) • colocar un retazo encima de otro del mismo ancho (apila) {29} Lenguajes de Programación
De esta forma las operaciones pueden usarse sin que se necesite pensar: • fungiro_iz (x) = giro(giro(giro(x))) • fun apila (x,y) = giro_iz (costura (giro (y), giro (x))) • ahora se usa giro_iz (E) para cualquier expresión y puede usarse para declarar otras; como es el caso de apila. Lenguajes de Programación
Declaraciones locales • Las expresiones de asignación o asociaciones de asignación permiten que las declaraciones aparezcan dentro de las expresiones. • let <declaraciones> in <expresión> end Lenguajes de Programación
Las expresiones de asignación permiten el uso de nombres en los lenguajes de programación • letfungiro_iz (x) = giro(giro(giro(x))) • fun apila (x,y) = giro_iz (costura (giro (y),giro (x))) • in apila (giro_iz (b), giro (b)) • end Lenguajes de Programación
Nombres definidos por el usuario para valores • las declaraciones locales convienen cuando se escriben expresiones grandes en términos de otras más simples • val <nombre> = <expresión> • asigna nombre a una expresión • y así la declaración de valores se usa junto con las declaraciones locales Lenguajes de Programación
letval x = E1inE2end • significa las apariciones del nombre x en E2 representan el valor de E1 • se puede usar cualquier otro nombre en lugar de x, sin que cambie el significado de la expresión. Lenguajes de Programación
let valsup_izq = giro_izq (b) • valinf_der = giro (b) • in • apila (sup_izq, inf_der) • end • {31} Lenguajes de Programación
Notaciones de expresiones • Operador binario: necesita dos operandos • notación infija • a+b • notación prefija • +ab • notación posfija • ab + Lenguajes de Programación
Propiedad asociativa y precedencia • En notación infija los operadores aparecen entre sus operandos • + b *c • la división y la multiplicación tienen precedencia sobre la suma y la resta. • Sin reglas de precedencia, los paréntesis serían necesarios • los operadores con la misma precedencia se agrupan de izquierda a derecha • 4-2-1 = 1 Lenguajes de Programación
Operadores • asociativo a la izquierda: si las sub-expresiones que contienen apariciones múltiples del operador se agrupan de izq a der; 4-2-1 = (4-2) -1 = 1. Porque la resta de la izq es la primera en efectuarse. • +, -, * y / • asociativo a la derecha: si las sub-expresiones que contienen apariciones múltiples del operador se agrupan de der a izq; 234; • 3 a la 4 = 81 • 2 a la 81 Lenguajes de Programación
Declaraciones y aplicaciones de funciones • Una vez declarada una función se puede aplicar como un operador • funciones como correspondencias • función es total • función es parcial Lenguajes de Programación
Función total • Si se asocia un elemento del conjunto B con cada elemento del conjunto A; siendo A el domino y B el contra dominio. • A B, para el conjunto de todas las funciones de A en B. Si f hace corresponder a y b, escribimos f(a) = b y b se conoce como el valor de f en a. Lenguajes de Programación
Función parcial • Una función es parcial si, por cada a en su domino A, se tiene que f(a) = b, para alguna b en B, o f(a) se encuentra indefinida debido a que no existe una b tal que b = f(a) Lenguajes de Programación
Cómo se calcula el valor de f en a • Es posible definir una función • enumeración explícita de sus valores para cada elemento de su dominio. • Sucesor (0) = 1 • Sucesor (1) = 2 • Sucesor (2) = 3 • Sucesor (3) = 4 • ... Lenguajes de Programación
g(x) es el entero n 0 más grande tal que n2 x • esta regla no nos indica explícitamente cómo calcular el valor de g en x Lenguajes de Programación
Funciones como algoritmos • En cualquier lenguaje de programación una función va de la mano con un algoritmo para calcular el valor de la función en cada elemento de su dominio. • Las declaraciones de funciones tienen 3 partes: • el nombre de la función • los parámetros de la función y • una regla para calcular un resultado a través de los parámetros Lenguajes de Programación
fun <nombre> (<parámetros - formales>) = <cuerpo>; • ejem: funsucesor (n) = n + 1; • la notación prefija es la regla para la aplicación de funciones declaradas: • <nombre> (<parámetros-actuales>) • sucesor (2+3) {notación infija} Lenguajes de Programación
Nombres que se utilizan para designar a los parámetros: • parámetro = parámetros formales • argumento = parámetros actuales Lenguajes de Programación
Evaluación más interna • Se calcula como sigue: • se evalúan las expresiones en <parámetros - actuales>, • se substituyen los resultados en los parámetros formales del cuerpo de la función, • se evalúa el cuerpo de la función y • se devuelve el valor de la función como respuesta Lenguajes de Programación
Ejemplo: • sucesor (2 + 3) • se activa activa + para evaluar +(2,3) • se devuelve el resultado 5 de + • se activa el sucesor (5) y • se devuelve la respuesta 6 • la técnica de evaluar los argumentos antes del cuerpo se conoce también como técnica de invocación por valor Lenguajes de Programación
Evaluación selectiva • Si <condición> entonces <expresión>1 otro <expresión>2 • condición da como resultado verdadero/falso • expresiones booleanas • sólo se evalúa una de las expresiones dependiendo del valor de la condición falso/verdadero Lenguajes de Programación
Funciones recursivas • Una función es recursiva si su cuerpo contiene una aplicación de f • f es recursiva si f puede activarse a sí misma • Existen dos tipos de recursión • lineal • cola Lenguajes de Programación
Recursión lineal • Si la activación f(a) de f puede iniciar como máximo una nueva activación de f. • ejemlo: • funfactorial (n) = • si n = 0 entonces 1 otro n*factorial (n-1); Lenguajes de Programación
La evaluación de una función recursiva lineal tiene dos fases: • una fase de activación, en la cual se inician las nuevas activaciones, y • una fase de solución, en la cual el control regresa de las activaciones con una modalidad última entrada - primera salida Lenguajes de Programación
Función factorial líneal • Ejemplo: • f(3) = 3 * f(2) • = 3 * (2*(f (1)) • = 3 * (2*(1*f(0))) • = 3 * (2*(1*1)) • = 3 * (2*1) • = 3 *2 • = 6 Lenguajes de Programación
Recursión de cola • si una función recursiva puede ser eficientes si se puede implementar con recursión de cola • si devuelve un valor sin necesidad de recursión o si devuleve simplemente el resultado de una activación recursiva Lenguajes de Programación
ejemplo: • fung (n,a) = • sin = 0 entonces a otrog (n-1, n*a) • a si n = 0 • g (n,a) = • g(n-1, n*a) en caso contrario Lenguajes de Programación
g (3,1) • si 3 entonces 1 otrog(3-1, 3*1) • g(3,1) = g(2,3) = g(1,6) = g (0,6) = 6 Lenguajes de Programación
g(3,1) = g(2,3) g(2,3) = g(1,6) g(1,6) = g(0,6) Función factorial con recursión de cola g(0,6) = 6 Lenguajes de Programación
Todo el trabajo de una función lineal con recursión de cola se realiza en la fase de activación, cuando se inician las activaciones nuevas; siendo la fase de solución trivial debido a que el valor calculado por la activación final se convierte en el valor de toda la evaluación. Lenguajes de Programación
En el caso de f(3) = 3 * f(2) • la multiplicación se realiza después de que el control regresa de la activación de f(2). Lenguajes de Programación
Ambito léxico • EL cambio de nombre no tiene efecto en el valor de una expresión, siempre y cuando cambio es consistente • la re-asignación de nombres se especifica con precisión mediante la presentación de una noción de variables locales o acotadas Lenguajes de Programación
El principio de re-asignación de nombres es la base para la regla de ámbito léxico, que ayuda a determinar el significado de los nombres en los programas. • fun sucesor (x) = x +1; • fun sucesor (n) = n +1; Lenguajes de Programación
surgen ciertas sutilezas cuando una declaración de función puede hacer referencia a nombres no locales, es decir , a nombres que no son parámetros formales, por ejemplo el resultado de la función sumay depende del valor de y: • funsumay (x) = x + y • como yno es local algún contexto determina su valor Lenguajes de Programación
Las reglas de ámbito léxico usan el texto del programa que rodea a la declaración de la función para determinar el contexto en el cual se evaluarán los nombres no locales. • El texto del programa es estático, a diferencia de la ejecución, así que tales reglas se conocen también como reglas de ámbito estático. Lenguajes de Programación
Utilizaremos let ... • Para comprender las reglas de ámbito léxico: • let valx = 2 inx + xend • a val se le conoce como una asociación dex Lenguajes de Programación
let valx = E1 inE2end • que todas las apariciones de x en E2 se encuentran dentro del ámbito de esta asociación • el valor de una expresión no se altera si se cambia de variable • let valz = E1 inE2end Lenguajes de Programación
Caso de asociaciones anidadas de la misma variable • let valx = 2 in valx = x + 1 inx *xend end Lenguajes de Programación
Se aplica una reasignación de nombres de la asociación más interna • let valx = 2 in valy = x + 1 iny *yend end Lenguajes de Programación