Sie sind auf Seite 1von 9

Capítulo 1

Fundamentos generales de los lenguajes de programación

Objetivo

El alumno explicará las características y elementos fundamentales de los lenguajes (1671)

1.1. Historia de los lenguajes

Un lenguaje de programación es un lenguaje artificial diseñado para expresar instrucciones que pueden ser llevadas a cabo por máquinas como las computadoras. De acuerdo al nivel de abstracción, se clasifican en lenguajes de bajo nivel y lenguajes de alto nivel. Existen miles de lenguajes de programación, muchos de ellos pueden ser encontrados en diver- sas listas, como:

Las listas son amplias, pero no cubren la historia completa de los lenguajes de programación, hace falta, por ejemplo, el método de Ada Lovelace (http://bit.ly/OPGL9) para calcular una secuencia de números de Bernoulli utilizando la máquina analítica de Charles Babbage, el pro- puesto por Alan Turing para su Automatic Computing Engine (http://bit.ly/14GvTiu) o incluso el se olvida que el sistema binario (http://bit.ly/rzyuD) fue propuesto originalmente por Leibniz

1

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 2

FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 2 Figura 1.1: Automatic Computing Engine y Leibniz 1.2.
FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 2 Figura 1.1: Automatic Computing Engine y Leibniz 1.2.

Figura 1.1: Automatic Computing Engine y Leibniz

1.2. Elementos de los lenguajes

Un programa es un conjunto de instrucciones que una vez ejecutadas realizarán una o varias tareas en una computadora. Un programa (algoritmo) contiene instrucciones elementales seleccionadas cuidadosamente que pueden ser realizadas por un robot ó un procesador ; el procesador recibe las órdenes y ejecuta lo que indican, resulta obvio que la disposición de las instrucciones resulta crucial al momento de llevarlas a cabo. Por tanto, el algoritmo debe incluir instrucciones de control que modifiquen la ruta que debe seguir el procesador, además de indicar que debe hacerse en cada paso, así como el momento en el cual debe detenerse. Se ha probado que para implementar cualquier algoritmo, son suficientes tres construcciones básicas para control de flujo:

} Secuencia.

} Condicional.

} Ciclos iterativos (repetitivos).

A continuación se describe cada una de ellas y se muestra su representación tanto en pseudocódigo.

1.2.1. Ejecución secuencial.

La ejecución secuencial consiste de ejecutar una instrucción y al terminar, realizar lo que indica

el siguiente paso del algoritmo.

···

n. Instrucción i

o. Instrucción i + 1 ···

Figura 1.2: Ejecución secuencial.

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 3

1.2.2. Ejecución condicional.

Consiste de ejecutar un grupo de acciones A ó un grupo de acciones B (pero no ambos) en función del resultado de la evaluación de una condición C (V erdadero ó F also).

···

n. SI c ENTONCES n.1. Subinstrucción 1 ··· n.k. Subinstrucción k

o. SI NO o.1. Subinstrucción 1 ··· o.j. Subinstrucción j

···

Figura 1.3: Ejecución condicional.

Un algoritmo que solo contiene las estructuras de control anteriores funciona para tareas de longitud fija, dado que cada instrucción se ejecuta solamente una vez. Sin embargo, generalmente se requiere que algunas instrucciones sean ejecutadas más de una vez (como en el algoritmo de obtención del mcd); existen estructuras de control que se encargan de la ejecución repetida de bloques de instrucciones , se conocen de forma genérica como estructuras iterativas o ciclos.

1.2.3. Iteración definida.

Sirve para ejecutar un grupo de instrucciones A exactamente N veces, donde N es un entero positivo.

··· n. DESDE cont

1 HASTA N

n.1. Subinstrucción 1 ···

n.k. Subinstrucción k n.k+1. cont cont + 1

···

Figura 1.4: Iteración definida.

Es importante notar que en el caso de la iteración definida existe una variable implícita llamada contador, cont en el ejemplo, y sirve para tener un registro del número de iteraciones realizadas hasta el momento y para llegar a la condición de paro. Otra variable muy utilizada cuando se trabaja con ciclos es conocida como acumulador , y sirve para almacenar resultados parciales de alguna operación importante dentro del ciclo; además, al terminar el ciclo, almacena el resultado final deseado.

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 4

1.2.4. Iteración condicional.

Conocida también como iteración indefinida , se utiliza para repetir un bloque de acciones A , mientras una condición c sea verdadera, c es una condición de paro.

··· n. MIENTRAS c HACER n.1. Subinstrucción 1 ··· n.k. Subinstrucción k

···

Figura 1.5: Iteración condicional.

En este caso, a diferencia de la iteración definida, la condición de paro C depende exclusiva- mente de las operaciones realizadas dentro del cuerpo del ciclo. Cuando en un algoritmo se utilizan iteraciones, es necesario tener cuidado de no crear ciclos infinitos, esto se hace con operaciones dentro del bloque de instrucciones que garanticen que la condición de paro se cumplirá.

1.2.5. Combinación de estructuras de control.

Un algoritmo puede contener estructuras de control de flujo combinadas de forma compleja; secuencias, condicionales e iteraciones pueden estar intercaladas y anidadas.

e iteraciones pueden estar intercaladas y anidadas. Figura 1.6: Algoritmo de la amistad Ejercicio: Desarrollar

Figura 1.6: Algoritmo de la amistad

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 5

Tarea: Desarrollar pseudocódigos para:

} Dados dos números naturales M,N , obtener el máximo común divisor entre ellos.

} Dado un número natural N , obtener N !

} Dado un número natural N , imprimir todos los números primos antes de N

} Dado un

número natural N , obtener f ibonacci ( N )

Programa 1: Desarrollar un programa que realice las operaciones básicas de polinomios:

} Valor en un punto

} Suma

} Resta

} Igualdad de 2 polinomios

} Polinomio opuesto

} Multiplicación de polinomios

descritas en la siguiente URL:

Nota: Debe entregarse la documentación del programa.

1.3. Entornos sobre los lenguajes

Dada la evolución de los lenguajes de programación, ha crecido la necesidad de mecanismos de abstracción apropiados; los nombres juegan un rol fundamental en este contexto. Un nombre (identificador) no es más que un secuencia de caracteres (posiblemente con algún significado) que sirve para representar alguna otra cosa. La manipulación de nombres requiere de reglas que garanticen la correcta interpretación de esos nombres en el programa. El concepto de entorno (ambiente) y las construcciones que se usan para organizarlo son importantes para este fin. Cuando se declara una nueva variable:

int var ;

o se define una nueva función:

int foo (){ var = 1;

}

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 6

se introducen nuevos identificadores para representar objetos (en sentido amplio, no en sentido de la POO); por ejemplo var representa una variable y foo una función. La secuencia de caracteres var se puede usar cuando se desee hacer referencia a la nueva variable, de igual forma, foo permite llamar a la función que asigna a var el valor 1 . Los objetos a los que se les puede dar un nombre se conocen como objetos denotables. Aún cuando existen diferencias considerables entre lenguajes de programación, los siguientes son ejem- plos comúnes de objetos denotables:

} Objetos cuyos nombres son definidos por el usuario: variables, parámetros, procedimientos (en sentido amplio), tipos definidos por el usuario, módulos, etiquetas, constantes definidas por el usuario, excepciones.

} Objetos cuyos nombres son definidos por el lenguaje de programación: tipos primitivos, operaciones primitivas, contantes predefinidas.

La asociación (enlazado) entre un nombre y el objeto que denota, puede hacerse en diferentes momentos:

} Definición del lenguaje : por ejemplo, + indica adición; int denota el tipo entero, etc.

} Escritura del programa: el programador elige los nombres que usará en sus códigos.

} Tiempo de compilación : el compilador al traducir el código fuente en código máquina, reserva espacio en memoria para datos que pueden ser procesados estáticamente.

} Tiempo de ejecución: este término denota el periodo entre el inicio y término del progra- ma; todas las asociaciones que no se han realizado previamente, se realizan en este periodo.

1.3.1. Entornos

No todas las asociaciones entre nombres y objetos denotables se fijan desde el inicio de la ejecución del programa, para entender cómo se comportan algunas asociaciones, es necesario introducir el concepto de entorno. Un entorno es un conjunto de asociaciones entre nombres y objetos denotables que existen en tiempo de ejecución en un punto específico en el programa y en un tiempo específico de la ejecución; también suele llamarse entorno referenciable . La presencia de entornos constituye una de las características principales de lenguajes de alto nivel y que debe ser simulado de forma adecuada por cada implementación. Una declaración es una construcción que permite la introducción de una asociación en el entorno. Los lenguajes de alto nivel comúnmente incluyen declaraciones explícitas, como:

int x; int f (){ return 0;

}

type T = int ;

la primera es la declaración de una variable, la segunda una función y la tercera, declara un tipo T que coincide con el tipo básico int.

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 7

1.3.2. Bloques

Casi todos los lenguajes de programación actuales permiten el uso de bloques , un método para estructurar programas introducido en ALGOL60; los bloques son fundamentales para organizar entornos. Un bloque es una región textual del programa identificada por una señal de inicio y una señal de fin, y que puede contener declaraciones locales a esa región (es decir, que aparecen dentro de esa región). Las señales de inicio y fin varían de acuerdo al lenguaje de programación. Existen dos tipos principales de bloques:

} Bloque asociado a un procedimiento: es un tipo de bloque asociado con declaraciones locales a algún procedimiento; incluye el cuerpo del procedimiento junto con la declaración de parámetros.

} Bloque in-line : este bloque no se asocia con procedimientos y puede aparecer en cualquier posición en la que se puede colocar algún comando.

1.3.3. Tipos de entornos

El entorno cambia durante la ejecución de un programa; sin embargo, los cambios suceden generalmente en dos momentos precisos: al entrar y salir del bloque. Por tanto, el bloque se puede considerar como una construcción de mínima granularidad que tiene un entorno constante asociado. El entorno de un bloque; es decir, el entorno que existe cuando el bloque se ejecuta; se compone inicialmente de las asociaciones entre los nombre declarados localmente dentro del mismo bloque. La mayoría de los lenguajes de programación permiten tener bloques anidados : definir bloques dentro de otros bloques. El traslape de bloques en el que algún bloque interno se cierra después de algún bloque externo no está permitido; por ejemplo, secuencias de instrucciones como las siguientes no se permiten en ningún lenguaje:

open block A; open block B; close block A; close block B;

El anidamiento de bloques es un mecanismo importante para estructurar el entorno. Es común que se permita que las declaraciones locales a un bloque sean visibles a otros bloques internos. El ambiente asociado con un bloque se conforma de los siguientes componentes:

} Entorno local: compuesto por el conjunto de asociaciones para nombres declarados lo- calmente en el bloque. Cuando se trata del bloque de un procedimiento, el ambiente local contiene también las asociaciones de los parámetros.

} Ambiente no local : es el entorno formado por las asociaciones de nombre que son visibles dentro del bloque, pero que no se declararon localmente.

} Entorno global: Es el ambiente que se forma cuando inicia la ejecución del programa; contiene a las asociaciones de nombres que se pueden utilizar en todos los bloques del programa.

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 8

Ejercicio: Determinar los tipos de entornos para cada bloque en el siguiente código; para faci- litar, se asume que los bloques pueden etiquetarse y las etiquetas no modifican la ejecución:

A:{ int a = 1;

B:{ int

int

2;

c = 2;

b =

C:{ int c = 3;

}

int d;

d = a+b+c ;

}

D:{ int e ;

e = a+b+c ;

}

}

Las reglas de visibilidad especifican como los nombres declarados en bloques externos son visibles para los internos. En algunos casos es posible importar nombres desde otros módulos; las asociaciones para estos nombres forman parte del entorno global. Las reglas de visibilidad permiten solamente heredar nombres declarados en bloques exteriores hacia bloques internos pero no en el otro sentido.

1.3.3.1. Operaciones sobre entornos

Como se mencionó anteriormente, los cambios en el entorno se producen al entrar y salir de un bloque. Durante la ejecicón de un programa, cuando éste entra en un bloque, se llevan a cabo las siguientes modificaciones al ambiente:

1. Se crean las asociaciones entre los nombres declarados localmente y sus correspondientes objetos denotables.

2. Se desactivan las asociaciones entre nombres declarados de forma externa al bloque y que son redefinidos dentro del mismo.

Así mismo, cuando el programa sale del bloque, el entorno se modifica de la siguiente manera:

1. Se destruyen las asociaciones entre los nombres declarados dentro del bloque y los objetos que denotan.

2. Se reactivan las asocuaciones entre nombres declarados fuera del bloque y que fueron redefinidas dentro del mismo.

CAPÍTULO 1. FUNDAMENTOS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN 9

Ejercicio-tarea: Determinar los valores de las variables dentro de cada bloque en los siguientes códigos:

1. :

A:{ int a = 1;

B:{ int

b =

2;

int

c = 2;

C:{ int c = 3;

}

2. :

}

int d;

d

= a+b+c ;

D:{ int e ;

}

}

e

= a+b+c ;

int a = 1;

foo1 ( int b){ int c = 3;

{

int a = 4;

 

{

int d;

 

d

= a+b+c ;

 

}

}

i n t

e = a+b+c ;

}

foo2 ( int b){ b = 2;

{

int

c = 3;

{

int d;

 

d

= a+b+c ;

 

}

}

}

main (){

foo1 (5);

foo2 (5);

}