Lenguajes de Programación I

Documentos relacionados
Lenguajes de Programación I

Lenguajes de Programación I

Prefacio 25 Organización de la Unidad Didáctica Cómo utilizar el libro Objetivos docentes... 27

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Principios de Computadoras II

Lenguajes de Programación I

Unidad II: Análisis semántico

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Lenguajes de Programación Programación funcional

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Operadores y Expresiones

Java. Introducción a la Programación Orientada a Objetos

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Expresiones y sentencias

Expresiones y sentencias

Tema II: Introducción al Lenguaje Funcional

Lenguajes y paradigmas de programación

Operadores. Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.

Lenguajes de Programación I

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Introducción a la programación. Cecilia Manzino

Curso de Java Introducción a la Programación II

Lenguajes de Programación. Capítulo 4. Expresiones.

Índice del capítulo. Capítulo 4. Expresiones. Las expresiones. Indice de la sección. Lenguajes de Programación. Introducción. 2.

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Tema 4. Operadores y Expresiones

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Generación de Código Intermedio

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

4. Operadores Operador asignación

Los parámetros: son los campos que se comunican a los métodos de los objetos.

token siguiente! Tabla de símbolos

Lenguajes de Programación I

Unidad VI Generación de Código Intermedio. M.C. Juan Carlos Olivares Rojas

Un. VI. Generador de código intermedio.

Índice general 7. Presentación 15

Conceptos Fundamentales. Programación Lógica y Funcional MTI. Eduardo Cruz Romero

Introducción a Haskell. Cecilia Manzino

El lenguaje C. 1. Identificadores, constantes y variables

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Conceptos básicos sobre gramáticas

Fundamentos de Informática 5. Operadores, expresiones (y su aplicación)

Introducción a la Programación

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Tema#2. Tipos de Datos 10

Lenguajes de Programación I

Tipos en Haskell. Cecilia Manzino

Lenguajes de Programación

Verificación de Tipos

Tema 2. Concepto de Algoritmo

Tema 5. Soporte lógico de computadoras.

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

2.2 Nombres, Ligado y Ámbito

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3: 3 - Paradigmas de Programación

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2018

Tema 2: Elementos básicos de un programa. Tipos de datos, variables y constantes Asignación Operadores y expresiones

Introducción a Java. Introducción a Java. Programación I

Tema 3.- Predicados y sentencias condicionales

Registros. Lenguajes de Programación I. Accediendo a los datos organizados en registros. Declarando Registros. Tipos de Datos Compuestos

AMBIENTES DE COMPILACION

Programación Funcional en LISP Lógica para Ciencias de la Computación

Lenguajes de programación

EXPRESIONES Y OPERADORES

GUÍA BÁSICA DE SCHEME v.4

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017

introducción a la computación

LÓGICA - DECISIONES. Hay dos tipos de expresiones lógicas: las expresiones lógicas relacionales y las expresiones lógicas combinacionales.

COLEGIO DE ESTUDIOS DE POSGRADO DE LA CIUDAD DE MÉXICO

Tema 2.- Expresiones y funciones

Un calculadora avanzada... y algo más!

Introducción a la programación

Tema 1: Introducción

PROGRAMACIÓN EN JAVA

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Programación Estructurada en ANSI C

Prof. María Alejandra Quintero. Informática Año

LENGUAJE FORTRAN. ESTRUCTURAS Y SENTENCIAS

GENERACIÓN DE CÓDIGO ORIENTADO A OBJETOS

Introducción a Python. Cecilia Manzino

Introducción a Haskell. El lenguaje Haskell

Programación Funcional

21/03/2018. Variables y Constantes. Los datos de un programa están representados por variables o constantes y tienen asociado un tipo.

Práctica de constantes, expresiones y operadores. Programación en C 1

Introducción a los compiladores

Repaso: Teórica. Introducción a la programación imperativa. Paradigmas de lenguajes de programación. Repaso: Tipos de datos

Lenguajes de Programación I

Tema 5: Macros. Sesión 14: Macros

JavaScript: Operadores

Conceptos básicos. IC-1800 Introducción a la programación. I semestre,

Entendiendo expresiones lambda en C# con Mono

Transcripción:

Lenguajes de Programación I Control de Flujo - Expresiones Ernesto Hernández-Novich <emhn@usb.ve> Copyright c 2006-2010

Definición El Control de Flujo es fundamental para la mayoría de los modelos de cómputo, pues establece el orden en que debe ejecutarse el programa.

Organización de los Mecanismos Secuenciación (Sequencing): orden específico, usualmente el de aparición en el programa. Selección (Selection): se escoje entre dos o más instrucciones según alguna condición a tiempo de ejecución. Iteración (Iteration): un fragmento de código se ejecuta de manera repetida bien sea un número de veces o hasta cumplirse determinada condición a tiempo de ejecución. Abstracción procedimental (Procedural Abstraction): una colección de construcciones de control se encapsula como una unidad, sujeta a parametrización.

Organización de los Mecanismos Recursión (Recursion): una expresión se define en términos de si misma directa o indirectamente. Concurrencia (Concurrency): dos o más fragmentos de programa se ejecutan/evalúan al mismo tiempo. No determinismo (Nondeterminacy): el orden o escogencia de instrucciones y expresiones no es especificado deliberadamente. Dejaremos los Procedimientos y la Concurrencia para más adelante.

Expresiones Una expresión puede ser: Un objeto simple nombre de variable o constante literal. La aplicación de una función u operador a una colección de argumentos u operandos, cada uno de los cuales es a su vez una expresión. El término operador se usa para referirse a las funciones incluídas en el lenguaje que tienen una sintaxis especial simplificada a propósito + en lugar de la función suma.

Notación Prefija (Scheme, LISP) (+ (* 4 3) (* 0.5 (sin pi))) Infija (casi cualquier lenguaje) 4 * 3 + 0.5 * sin(pi) Postfija (Forth, Postscript) 4 3 * pi sin 0.5 * + Mezclada (mixfix, Smalltalk) msg sendto: "emhn@usb.ve" text: "Hola Mundo" En ocasiones los operadores son adornos (sintactic sugar) sobre funciones concretas en C++ a + b en realidad es a.operator+(b).

Precedencia y Asociatividad La notación infija es ambigua para las expresiones aritméticas. Utilizar paréntesis para indicar explícitamente el orden de evaluación. Emplear reglas de precedencia y asociatividad para ahorrarse los paréntesis (siempre que se haya leído el manual). Precedencia en ausencia de paréntesis, cuál operador opera antes que otro? Asociatividad en ausencia de paréntesis, cómo aplicar los operadores de una secuencia en la cual todos tienen la misma precedencia?

Operadores Inusuales Incremento y decremento pre y postfijos. En vez de a = a + 1, escribir a++. El efecto de borde siempre se efectúa el valor cambia según la posición del operador. Producto de enteros por colecciones (cadenas, listas,... ) $a = $n x "a"; # $a tiene $n aes. @b = (42) x 1; # Una lista con 42 unos. @b = (42) x @b; # Ahora son 42 42. Generadores de listas por enumeración @a = -10..10; Operador ternario if-then-else a = (b > c)? d : e

Más operadores inusuales Algunos lenguajes (Haskell, Prolog) permiten crear nuevos operadores. Asociados a una función particular. Incorporados a la jerarquía de precedencia y asociatividad para cooperar con el resto del lenguaje. Suma y producto de tuplas numéricas en Haskell infixl 5 :+: infixl 7 :*: (:+:), (:*:) :: (Num a,num b) => (a,b) -> (a,b) -> (a,b) (a1,b1) :+: (a2,b2) = (a1+a2,b1+b2) (a1,b1) :*: (a2,b2) = (a1*a2,b1*b2)

Un lenguaje lleno de operadores inusuales IBM engendró APL lenguaje puramente funcional. Lleno de operadores funcionales aplicativos... Generar la lista de primos de 1 hasta N ( N N. N)/N 1 ιn

Un lenguaje lleno de operadores inusuales IBM engendró APL lenguaje puramente funcional. Lleno de operadores funcionales aplicativos... Generar la lista de primos de 1 hasta N ( N N. N)/N 1 ιn... pero requiriendo un teclado especial

Asignación Si una instrucción de cómputo influye en los cómputos que le siguen más allá de retornar un valor simple, se dice que tiene un efecto de borde o colateral (side effects). En los lenguajes puramente funcionales (Haskell) no existen los efectos de borde y se dice que tienen transparencia referencial. Asignar un valor a un símbolo sólo lo hace disponible durante la evaluación actual. Solamente hay valores que producen valores por aplicación funcional. En los lenguajes imperativos, los efectos de borde son la norma modificar el estado es lo que produce resultados. Asignar un valor a un símbolo lo hace disponible durante la evaluación actual y posiblemente más allá de ella. Existen valores y referencias a valores.

Valores vs. Referencias La dualidad existencial de las variables En los lenguajes imperativos los nombres de variable denotan contenedores para valores. Los roles del lado derecho e izquierdo son diferentes en una asignación cualquiera: El lado derecho debe producir un valor. El lado izquierdo debe referir una ubicación. Las expresiones que denotan valores se denominan r-values y las expresiones que denotan ubicaciones se denominan l-values.

l-values vs. r-values Algunas expresiones no pueden ser l-values 2 + 3 = a, no tiene sentido. a = 2 + 3, tampoco, cuando a es una constante. Un l-value no tiene que ser necesariamente un nombre ni tampoco simple Aprovechando apuntadores (f(a)+3)->b[c] = 2 El lenguaje permite funciones l-value substr($a,5,4) = "hola mundo!" El mismo objeto puede actuar como r-value o l-value en una misma expresión depende cuál atributo de la asociación interesa.

Modelo de acceso para variables En el Modelo de Valor, la variable puede considerarse un r-value o l-value según aplique. En el Modelo de Referencia, toda variable siempre es considerada como un l-value. Esto obliga a seguir la referencia (dereferencing) en los casos en que sea necesario. En la mayoría de lenguajes con ese modelo, eso es automático; en algunos es responsabilidad del programador. Acarrea la incomodidad del encajonado (boxing) en algunos lenguajes (Java).

Ortogonalidad Cuando las características del lenguaje pueden ser utilizadas en cualquier combinación de manera consistente, se dice que es ortogonal. Lenguajes orientados a expresiones no distinguen instrucción de expresión (Algol fue el primero). begin a := if b < c then d else e; a := begin f(b); g(c) end; g(d); 2 + 3; end; Lenguajes con una aproximación intermedia (como C, Java, Perl) contemplan instrucciones con valor (expression statements). a = (b < c)? d : e;

Asignaciones Especiales La asignación como una expresión. a = b = 1; $a = ($b = 5) * ($c = f($d) + 9); Combinar un operador con una asignación. a += 5; b[8].a->b *= 2; $str = "foo"; $str.= " bar"; Asignación múltiple ($a,$b) = (42, "hola"); ($b,$a) = ($a,$b) # Look ma! No temp ($a,$b,$c) = foo(...);

Inicialización de Variables Proveer un valor inicial al momento de la declaración reduce la posibilidad de errores difíciles de identificar. Para variables con almacenamiento estático, el valor inicial puede colocarse directamente a tiempo de compilación ahorrando tiempo de ejecución. Algunos lenguajes no tienen mecanismo de inicialización especial, salvo asignar manualmente los valores. Algunos lenguajes establecen reglas de inicialización automática. Los lenguajes orientados a objetos proveen constructores a ser invocados durante la inicialización.

Cuándo se evalúan los operandos? a - f(b) - c * d f(a,g(b),c) Puede influir (bugs) si hay efectos colaterales. Permite mejorar el código objeto. Es por esto que en la mayoría de los lenguajes el orden de evaluación de operandos no está definido. Algunas excepciones: Java y C# insisten en evaluar de izquierda a derecha. C y C++ evalúan los argumentos para funciones de derecha a izquierda. Algunos compiladores de Fortran reordenar expresiones según las propiedades matemáticas.

Corto circuito Evaluación de McCarthy Mínimo trabajo necesario para obtener el resultado Las expresiones lógicas (boolean expressions) pueden optimizarse para evitar la evaluación total Una secuencia de or es cierta tan pronto una sea cierta. Una secuencia de and es falsa tan pronto una sea falsa. Algunos lenguajes (Pascal) no ofrecen evaluación con cortocircuito. Algunos lenguajes (Erlang) ofrecen ambas posibilidades, vía operadores diferenciados. and y or no usan cortocircuito. andalso y orelse si usan cortocircuito. Al emplear corto-circuito, dejan de ser estrictas ya no son expresiones sino instrucciones