Você está na página 1de 34

LENGUAJES DE PROGRAMACIÓN

TEMA 1: FUNDAMENTOS GENERALES DE LOS


LENGUAJES DE PROGRAMACIÓN

INTRODUCCIÓN

En computación, un programa es una secuencia de instrucciones,


a través de un lenguaje de programación, que permiten a una
computadora digital procesar un conjunto de datos, para
transformarlos en información, que serían los resultados.

Un lenguaje de programación, es el que permite expresar los


algoritmos en una notación formal, que pueda ser entendida y
ejecutada por la computadora.

Un lenguaje de programación es una construcción, que solo


existe en la mente del ser humano para expresar programas.
Está constituido por conjuntos de reglas gramaticales, de
símbolos utilizables, de términos monosémicos (con significado
único). Un lenguaje de programación aparte de expresar los
algoritmos a las computadoras, también sirven para la
comunicación entre los elementos del grupo de desarrollo.

Para que ésta construcción mental sea operable en una


computadora, debe existir otro programa que controle la
validez o no de lo escrito.

A éste se le llama traductor, el cual puede ser un compilador


o intérprete: siendo el compilador el programa que traduce a
unos ceros, una vez depurado el programa escrito en algún
lenguaje ha sido depurado en sus errores de sintaxis, no
ejecuta el programa. El Interprete si ejecuta, pero no traduce
a ceros y unos.
Existen diferentes, clasificaciones de lenguajes de
programación, entre los que se encuentran:
• Los lenguajes de alto o bajo nivel.- En los de bajo nivel
las instrucciones son simples y cercanas al
funcionamiento de la máquina (ceros y unos). En los Py el
lenguaje se aproxima más al lenguaje natural. Es de hacer
notar, que entre más cercano sea el lenguaje de
programación al lenguaje natural, es necesario realizar
más etapas de traducción para llegar a los ceros y unos.
• Por generaciones.- Existen entre cuatro y cinco
generaciones, según diferentes expertos en el tema,
siendo a grandes rasgos las siguientes:
Primera generación.- Lenguaje de máquina (ceros y
unos).
Segunda generación, uso de nemotécnicos, como el
ensamblador.
Tercera generación.- Diferentes paradigmas,
sobre todo el imperativo y
funcional, más cercanos al lenguaje natural
(principalmente en inglés como
print, read, etc.).
Cuarta Generación.- Mucho más cercano al natural,
uso de IDE´s (Entornos de
Desarrollo Integrados), ambientes gráficos, uso de
asistentes, entre otras
herramientas.
En párrafos más adelante, se detallan, mas las
características de las generaciones de las computadoras
digitales.

La historia del Hardware, va muy a la par del software,


principalmente de los lenguajes de programación, ya que para
diseñar el software, es necesario, conocer en que equipo de
computo va a residir y para desarrollar el hardware, también
es necesario conocer que aplicaciones de software va a
sustentar.
1.1. HISTORIA DE LOS LENGUAJES

Las primeras computadoras no contaban con lenguajes de


programación como se cono en hoy en día, la mayoría de ellas
eran construidas para llevar a cabo una tarea especifica, o en
algunos casos se podía conseguir que realizara una tarea
diferente, pero para ello tenia que modificarse físicamente a
la maquina; por lo tanto la forma de programarlas era
particular a cada computadora.

Al lenguaje original de una computadora digital moderna,


se le conoce como “lenguaje maquina”, que es la notación en la
cual una computadora responde directamente, este lenguaje
utiliza el sistema binario, el cual admite ceros y unos como
únicos símbolos. El lenguaje maquina fue el primero en ser
utilizado para la programación de computadoras, pero dejó de
utilizarse por su dificultad, siendo sustituido por otros
lenguajes más fáciles de aprender y utilizar, que además
reducen la posibilidad de cometer errores (aunque no por ello
no se comenten errores). El lenguaje maquina se llamó en un
principio “código”, aunque ahora se utiliza de manera mas
extensa para referirse a cualquier texto que sea un programa
de computadora.

Los orígenes de los lenguajes de programación se


encuentran en la llamada “arquitectura de Von Neumann” o
“maquina de Von Neumann”. Dicha maquina no es mas que una
serie de ideas que el matemático húngaro John von Neumann
publico a finales de los 40’s en su articulo llamado
Preliminary Discussion of the Logical Design of an Electronic
Computing Instrument. Las ideas que contiene este artículo han
proporcionado los fundamentos para la construcción y el
desarrollo de todas las computadoras hasta el momento.

El concepto central en la arquitectura Von Neumann es el


de programa almacenado, según el cual las instrucciones y los
datos tenían que almacenarse juntos en un medio común y
uniforme, en vez de separados, como hasta entonces se hacía.
De esta forma, no sólo se podían procesar cálculos, sino que
también las instrucciones y los datos podían leerse y
escribirse bajo el control del programa. A partir de esta idea
básica se sigue que un elemento en la memoria tiene una
calidad ambigua con respecto a su interpretación; esta
ambigüedad se resuelve, sólo temporalmente, cuando se requiere
ese elemento y se ejecuta como una instrucción, o se opera
como un dato. Un beneficio de esta ambigüedad es el hecho de
que un dato, obtenido como resultado de algunas operaciones en
la unidad aritmetico-lógica del computador, podía colocarse en
la memoria como si fuera cualquier otro dato, para entonces
usarlo y ejecutarlo como si fuera una instrucción. Además la
Máquina de Von Neumann presentaba como característica
importante un pequeño número de registros para mantener la
instrucción del programa en curso, y el registro de datos que
se estaban procesando. La máquina operaba en un ciclo
repetitivo de pasos para localizar y ejecutar en secuencia las
instrucciones del programa. Esta descripción puede aplicarse a
casi todos los computadores que desde 1946 se han construido,
por lo que la aportación de Von Neumann a las Ciencias de la
Computación es más que notable.

En la década de los 50’s se creía que los programas


eficientes solo podían escribirse manualmente, usando algunas
variantes de lenguajes de maquina, sin embargo el alto costo
de creación de código fue la motivación para el desarrollo de
los primeros lenguajes de programación. Es así como se pasa de
los lenguajes de “bajo nivel” (llamados así por estar a un
nivel mas cercano al de la maquina) como el lenguaje
ensamblador, a los lenguajes de “alto nivel” (llamados así por
ser mas parecidos al lenguaje humano).

A continuación se presenta una tabla donde se muestran


las fechas de aparición de varios de los lenguajes más
importantes.

Años Factores Lenguajes


Computadoras primitivas
Programación en lenguaje Lenguajes
ensamblador y de maquina ensambladores
Conceptos fundamentales: Lenguajes
1950 - 1955
- Subprogramas experimentales de
- Estructuras de datos alto nivel: ninguno
Posibilidad de lenguaje de en uso actualmente
alto nivel
Computadoras pequeñas,
lentas y caras.
Sistemas de almacenamiento
masivo en cinta magnética.
FORTRAN
Compiladores
ALGOL 58
Interpretes de software
1956 - 1960 ALGOL 60
Optimización de código
COBOL
Manejo de almacenamiento
LISP
dinámico
Estructura de datos ligada y
procesamiento de listas
dramática BNF
Computadoras grandes y caras
Sistemas de almacenamiento
masivo en disco magnético.
FORTRAN IV
Sistemas Operativos
COBOL 61 Extendido
Multiprogramación
1961 - 1965 ALGOL 60 Revisado
Compiladores orientados a la
SNOBOL
sintaxis
APL
“Propósito general” como una
meta en el diseño de un
lenguaje
Computadoras compatibles con
conjuntos de instrucciones,
de tamaño, velocidad y costo
variables
Sistemas de almacenamiento
PL/I
masivos, grandes y caros.
FORTRAN 66
Sistemas operativos
COBOL 65
interactivos, de tiempo
ALGOL 68
1966 - 1970 compartido
SNOBOL4
Microprogramación
SIMULA 67
Optimización de compiladores
BASIC
Sistemas de traductores-
APL 360
escritura
Primeros lenguajes estándar
Flexibilidad y generalidad
como metas en el diseño de
lenguajes
Microcomputadoras
Sistemas de almacenamiento
masivo pequeños y baratos
Pruebas de la correccion de
Pascal
programas
COBOL 74 (estándar)
1971 - 1975 Programación estructurada
PL/I (estándar)
Ingenieria de software
C
Reaccion contra lenguajes
grandes y complejos
Simplicidad como una meta en
el diseño de lenguajes
Computadoras potentes y
baratas
Sistemas de almacenamiento
masivo grandes y baratos
Sistemas distribuidos de
computación
programación concurrente y
de tiempo real que utiliza Ada
lenguajes de alto nivel FORTRAN 77
1976 - 1980
Ambientes de programación (estándar)
interactiva PROLOG
Abstracción de datos
Componenetes del software
Definiciones semánticas
formales
Confiabilidad y facilidad de
mantenimiento como meta en
el diseño de lenguajes
Programación orientada a
objetos
C++
Código reusable.
1981 - 1990 Perl
Soporte de plantillas o
SQL
programación genérica.
Lenguajes multiparadigma
Lenguajes mas flexibles y
poderosos

Programación Web
Python
Lenguajes multiplataforma
1991 - Java
Diseñados para ejecutar
actualidad PHP
código de fuentes remotas de
C#
modo seguro

Algunas de las principales influencias en la evolución


de diseños de lenguajes se comentan a continnuación:

1. Hardware y Sistemas Operativos: Las computadoras


han evolucionado de las maquinas lentas con costosos tubos de
vació de los años 50 a las supercomputadoras y
microcomputadoras de hoy. Al mismo tiempo, estratos de
microprogramación y software del sistema operativo se han
insertado entre el lenguaje de programación y el hardware de
la computadora. Estos factores han influido en la estructura y
el costo de usar las características de los lenguajes de alto
nivel.

2. Aplicaciones: El uso de la computadora se ha


difundido rápidamente de la concentración original de
aplicaciones militares, científicas, de negocios e
industriales de los años 50 a los juegos de computadora y
aplicaciones en casi todas las áreas de la actividad humana de
hoy. Los requerimientos de estas nuevas áreas de aplicación
afectan a los diseños de nuevos lenguajes y las revisiones y
extensiones de las anteriores.

3. Métodos de programación: Los diseños de lenguajes


han evolucionado para reflejar nuestro cambiante conocimiento
de los métodos nuevos para escribir programas largos y
complejos y para responder a los ambientes también cambiantes
en los cuales se efectúa la programación.

4. Métodos de implementación: El desarrollo de


métodos para una mejor implementación ha afectado a la
selección de las características que se deben incluir en
nuevos diseños.

5. Estandarización: La necesidad de lenguajes estándar


que se puedan implementar con facilidad en varios sistemas de
computación y que permita que los programas sean transportados
de una computadora a otra ejerce una fuerte influencia.

Generaciones

Los lenguajes de programación se suelen clasificar en 5


generaciones (aunque las ultimas dos para muchos son
discutibles)

• Primera generación: Las primeras computadoras se


programaban directamente en código binario.

• Segunda generación: Los lenguajes simbólicos, propios


de la máquina, simplifican la escritura de las
instrucciones y las hacen más legibles.

• Tercera generación: Los lenguajes de alto nivel


sustituyen las instrucciones simbólicas por códigos
independientes de la máquina, parecidas al lenguaje
humano o al de las Matemáticas.

• Cuarta generación: Se ha dado este nombre a ciertas


herramientas que permiten construir aplicaciones
sencillas combinando piezas prefabricadas. Algunos
proponen reservar el nombre de cuarta generación para la
programación orientada a objetos.

Estos lenguajes tienen una estructura lo más parecido al


idioma Ingles, algunas características son:
- Acceso a base de datos.
- Generación de código automáticamente.
- Puede programarse visualmente como Visual Basic.

• Quinta generación: Aquí se encuentran los lenguajes


orientados a la inteligencia artificial. Estos lenguajes
todavía están poco desarrollados

Los lenguajes mas usados actualmente

En la página de Internet www.tiobe.com se hace una lista con


los lenguajes de programación más populares actualmente, las
posiciones están basadas en la disponibilidad mundial de
ingenieros expertos y cursos que se imparten sobre ese
lenguaje, así como las estadísticas de los buscadores más
conocidos de Internet, a continuación se presenta una tabla
con los primeros 15 lugares:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

1.2. ELEMENTOS COMUNES DE LENGUAJES DE PROGRAMACIÓN

Tipos de datos
Dentro de los elementos comunes, se definen los tipos de
datos. Los tipos de datos previenen de errores en una fase
inicial, como por ejemplo la división de un dato tipo fecha
por un número entero. Los tipos comunes de datos son:
variables booleanas, número entero, número real, byte y
palabra, pero también fechas, horas del día y cadenas
(strings).
Basado en estos tipos de datos, el usuario puede definir sus
propios tipos de datos, conocidos como tipos de datos
derivados. De este modo, se puede definir por ejemplo un canal
de entrada analógica como un tipo de dato.

Variables

Las variables permiten identificar los objetos de datos cuyos


contenidos pueden cambiar, por ejemplo, los datos asociados a
entradas, salidas o a la memoria del autómata programable. Una
variable se puede declarar como uno de los tipos de datos
elementales definidos o como uno de los tipos de datos
derivados. De este modo se crea un alto nivel de independencia
con el hardware, favoreciendo la reusabilidad del software.

La extensión de las variables está normalmente limitada a la


unidad de organización en la cual han sido declaradas como
locales. Esto significa que sus nombres pueden ser
reutilizados en otras partes sin conflictos, eliminando una
frecuente fuente de errores. Si las variables deben tener una
extensión global, han de ser declaradas como globales
utilizando la palabra reservada VAR_GLOBAL.
Pueden ser asignados parámetros y valores iniciales que se
restablecen al inicio, para obtener la configuración inicial
correcta.

El control del flujo

Es la manera que tiene un lenguaje de programación de provocar


que el flujo de la ejecución avance y se ramifique en función
de los cambios de estado de los datos. La ramificación,
iteración, selección y llamadas a subrutina son formas de
control de flujo.

Ramificación
En los programas se necesitará que algunas sentencias se
ejecuten condicionalmente y se omitan otras. Java proporciona
varios mecanismos para conseguir este control y decidir qué
partes del código ejecutar, mediante sus sentencias de
ramificación.
if-else
La construcción if-else provoca que la ejecución atraviese un
conjunto de estados boolean que determinan que se ejecuten
distintos fragmentos de código.
if ( expresión-booleana ) sentencia1; [ else sentencia2; ]
La cláusula else es opcional. Cada una de las sentencias puede
ser una sentencia compuesta encerrada entre llaves, { }. Una
expresión-booleana es cualquier expresión que devuelve un
valor boolean. Podría ser una variable simple declarada como
boolean.
boolean datosdisponibles; int bytesdisponibles;
// ... // ...
if (datosdisponibles) if (bytesdisponibles > 0)
ProcesarDatos(); ProcesarDatos();
else else
esperarAMasDatos(); esperarAMasDatos();
Si se desea incluir más sentencias después del if o else, hay
que utilizar las llaves como en este código ejemplo.
int bytesDisponibles;
// ...
if (bytesDisponibles > 0) {
ProcesarDatos();
bytesDisponibles -= n;
} else
esperarAMasDatos();
break
La sentencia break de Java está diseñada para cubrir aquellos
casos en los que saltar arbitrariamente a una porción de
código es una constucción valiosa y legítima para el control
del flujo. El término break se refiere al acto de salirse de
un bloque de código. Le dice al intérprete que retome la
ejecución pasado el final del bloque.
switch
La sentencia switch proporciona una forma limpia de dirigir la
ejecución a partes diferentes del código en base al valor de
una variable o expresión. Esta es la forma general de la
sentencia switch:
switch ( expresión ) {
case valor1:
break;
case valor2:
break;
case valorN:
break;
default:
}
El valor de expresión se compara con cada uno de los valores
literales de las sentencias case. Si coincide con alguno, se
ejecuta el código que sigue a la sentencia case. Si no
coincide con ninguno de ellos, entonces se ejecuta la
sentencia default (por defecto). La sentencia default es
opcional. La sentencia break, comentada anteriormente, hace,
en este caso, que la ejecución salte al final del switch. Si
no se pone el break, la ejecución continuará en el siguiente
case.
return
Como se explicará en el siguiente capítulo, Java utiliza una
forma de subrutina llamada método para implementar una
interfaz de procedimiento a las clases de objetos. En
cualquier momento dentro de un método, se puede utilizar la
sentencia return para que la ejecución salte y vuelva al punto
donde se llamó al método.
Bucles
Un bucle es lo que llamamos ejecutar repetidamente el mismo
bloque de código hasta que cumpla una condición de
terminación. Hay cuatro partes en cualquier bucle,
inicialización, cuerpo, iteración y terminación. La
inicialización es el código que establece las condiciones
iniciales de un bucle. El cuerpo es la sentencia que queremos
repetir. La iteración es el código que queremos ejecutar
después de cuerpo, pero antes de entrar de nuevo en el bucle.
Se utiliza a menudo para incrementar o decrementar contadores
e índices. La terminación es la expresión booleana que
comprueba cada vez a lo largo de un bucle para ver si ha
llegado el momento de parar de iterar. Java tiene tres
construcciones para bucles: while, do-while y for.
while
Ejecuta una sentencia repetidamente mientras una expresión
booleana sea verdadera. Esta es su forma general:
[ inicialización; ]
while (terminación) {
cuerpo;
[ iteración; ]
}
Las partes inicialización e iteración son opcionales, y
mientras la expresión terminación devuelva un valor true, la
sentencia cuerpo continuará ejecutándose.

do-while

La contrucción do-while se utiliza cuando se desea ejecutar el


cuerpo de un bucle while al menos una vez, incluso si la
expresión booleana tiene el valor false la primera vez. Es
decir si se desea evaluar la expresión de terminación al final
del bucle en vez de al principio como en el while.
[ inicialización; ]
do { cuerpo; [ iteración; ] } while ( terminación );
for
La sentencia for es una forma compacta de expresar un bucle.
for ( inicalización; terminación; iteración ) cuerpo;
Si las condiciones iniciales no provocan que la terminación
devuelva true la primera vez, entonces la sentencia cuerpo e
iteración no se ejecutarán nunca. Ejemplo de un bucle for:
for (int i = 1; i <= 10; i++)
System.out.println ("i = " + i);
Aunque no hemos estudiado todavía las clases de Java, comentar
brevemente que este bucle imprime en pantalla desde 1 hasta 10
el índice ( i ) del bucle mediante el método println.

Sentencias separadas por comas


A veces se podría desear incluir más de un sentencia en las
sentencias de inicialización y de iteración. Java proporciona
una manera de expresar sentencias múltiples mediante la
utilización de comas ( , ) en el interior de los paréntesis de
un bucle for. Por lo tanto puede ponerse tantas sentencias
como se desee, siempre y cuando estén separadas por comas.
int a, b;
for (a = 1, b = 4, a < b, a++, b--) {
System.out.println ("a = " + a);
System.out.println ("b = " + b);
}
El bucle anterior sólo se ejecuta dos veces y su salida es la
siguiente:
a = 1
b = 4
a = 2
b = 3
continue
Del mismo modo que se desea salir prematuramente de un bucle,
se podría desear continuar en el bucle, pero dejar de procesar
el resto de código en esta interación en concreto. La
sentencia continue de Java salta del cuerpo de bucle, pero
permaneciendo en el bucle.
for (int i = 0; i < 10; i++) {
System.out.print (i + " ");
if (i % 2 == 0)
continue;
System.out.println ("");
}
Este bucle utiliza continue para provocar que se impriman dos
números en cada línea.

El control del flujo es la manera que tiene un lenguaje de


programación de provocar que el flujo de la ejecución avance y
se ramifique en función de los cambios de estado de los datos.
La ramificación, iteración, selección y llamadas a subrutina
son formas de control de flujo.

Un subprograma

Un subprograma es un procedimiento (procedure) o una función


(function). La diferencia entre un procedimiento y una
función es que el primero sólo indica la ejecución de una
secuencia de instrucciones, en función de unos parámetros,
mientras que la segunda representa un valor que se genera como
resultado de su ejecución. Se pueden usar funciones para
sobrecargar los operadores del lenguaje, otorgándoles nuevos
significados.
Definición de un subprograma.
La definición de un subprograma consta de tres elementos: (1)
cabecera, donde se fija su clase y nombre, se describen sus
parámetros formales y, si es una función, se especifica el
tipo de su resultado, terminando todo ello con la palabra
"is", expresando que a continuación se desarrolla el
subprograma, (2) declaraciones locales, de cualquier elemento
declarable (tipos, variables, constantes, ...), incluyendo la
definición anidada de otros subprogramas y (3) el bloque de
sentencias ejecutables del subprograma delimitado por las
palabras reservadas "begin" y "end" (esta última suele ir
acompañada del nombre del subprograma). Si el subprograma es
una función, entre las sentencias ejecutables debe incluirse
al menos una sentencia de retorno ("return") con una expresión
que indique el valor a devolver a quien la llamó; si la
ejecución de una función alcanza el final sin encontrar una
sentencia de retorno, se produce una excepción
"Program_Error", dado que la sentencia de retorno se utiliza
en las funciones para especificar el valor a devolver. En los
procedimientos puede omitirse la sentencia de retorno cuando
el único punto de retorno se encuentra al final, como en el
siguiente ejemplo.
procedure Intercambia(A,B: in out Integer) is
C: integer;
begin
C := A;
A := B;
B := C;
end Intercambia;

function Media(A,B: Float) return Float is


begin
return (A + B) / 2.0;
end Media;
Las declaraciones locales están sujetas a las reglas de ámbito
generales de Ada.
Un subprograma puede constituir por sí mismo una unidad de
librería o estar anidado dentro de una unidad mayor. Si un
subprograma está anidado en una unidad mayor, la definición
del subprograma debe escribirse en una sección de
declaraciones de esa unidad.
procedure Principal is

procedure Intercambia(A,B: in out Integer) is

begin

end Intercambia;

begin
end Principal;
En un mismo ámbito se pueden tener varios subprogramas con el
mismo nombre, siempre que se diferencien en los parámetros o
en el tipo del resultado (si son funciones). Esto se conoce
como sobrecarga de subprogramas. La sobrecarga de operadores
es una clase de sobrecarga de subprogramas.

procedure Intercambia(A,B: in out Integer) is

begin

end Intercambia;

procedure Intercambia(A,B: in out Float) is

begin

end Intercambia;

Declaración de un subprograma.

En determinadas circunstancias (p.e. cuando un subprograma se


proporciona para ser usado desde un paquete, cuando se define
un subprograma genérico o cuando hay referencias mutuas entre
subprogramas) se precisa escribir una declaración de un
subprograma separada de su definición. La declaración de un
subprograma es como su cabecera, pero terminada en ";" en vez
de con la palabra "is", para expresar que lo que se está dando
es una vista de un subprograma cuya definición se haya en otro
lugar.
procedure Intercambia(A,B: in out Integer);
function Media(A,B: Float) return Float;

Definición separada (separate).


La definición de un subprograma que está anidado en otra
unidad puede extraerse de la misma para compilarse por
separado, dejándolo indicado en la unidad matriz mediante una
declaración con cláusula "separate". A efectos de reglas de
ámbito es como si la definición del subprograma estuviera
donde está dicha declaración. El subprograma separado debe
indicar quién es su unidad matriz.
procedure Ejemplo_Matriz is
...
-- Indicación de que Intercambia se desarrollará aparte
procedure Intercambia(A,B: in out Integer) is
separate;
...
begin
...
end Ejemplo_Matriz;
-- Lo siguiente posiblemente irá en un fichero diferente
separate(Ejemplo_Matriz)
procedure Intercambia(A,B: in out Integer) is
...
begin
...
end Intercambia;
...

Llamada a un subprograma.

La llamada a un procedimiento constituye una sentencia,


mientras que la llamada a una función sólo puede hacerse como
parte de una expresión:
Intercambia(X,Y);
Z := Media(L,M);
if Media(L,M) > 5.0 then ...
return Media(L,M);
Parámetros.
Listas de parámetros formales.
El número, tipo y clase de los parámetros formales se declara
en una lista de parámetros formales que se pone justo después
del nombre del subprograma en la especificación del mismo. La
lista de parámetros formales se delimita por paréntesis y se
compone de una o varias sublistas de parámetros de la misma
clase y tipo separadas por punto y coma (";"). Cada sublista
está formada por una secuencia de nombres separados por comas
(","), seguida de dos puntos (":") a continuación de los
cuales se pone la clase y tipo de los parámetros de la
secuencia:
procedure Muchos_Parámetros(A,B: in Integer; C: out Float;
L, M: in out Integer);
Clases de parámetros.
En función del sentido en el que se transfiere la información,
los parámetos pueden ser:
1. De entrada (in).
2. De salida (out).
3. De entrada/salida (in out).
Si no se indica de qué clase es un parámetro, se considera que
es de entrada. Las funciones en Ada sólo admiten parámetros de
entrada. Los parámetros de entrada no se pueden modificar en
el subprograma, que los considera constantes.
Correspondencia entre parámetros reales y formales.
Cuando se llama a un subprograma, hay que especificar los
parámetros reales sobre los que se quiere que actúe. Los
parámetros reales ocuparán en la ejecución el lugar de los
formales correspondientes. La correspondencia entre parámetros
reales y formales se establece normalmente por posición, lo
que quiere decir que el primer parámetro real corresponde al
primero formal, el segundo al segundo y así sucesivamente. En
el siguiente ejemplo se llama al procedimiento "Intercambia"
haciendo corresponder el parámetro real X al formal A, y el
real Y al formal B:
...
Intercambia(X,Y); -- A, toma el valor de X y B el de Y
...
La correspondencia entre parámetros formales y reales también
puede hacerse por nombre: especificando los nombres del
parámetro formal y del real, relacionándolos con una flecha
("=>"):
...
Intercambia(A => X,B => Y); -- A, toma el valor de X y B el de
Y
...
A un parámetro formal de entrada se le puede hacer
corresponder como parámetro real cualquier expresión del tipo
adecuado; a los parámetros formales de salida o de
entrada/salida sólo les pueden corresponder parámetros reales
que sean variables.

Un identificador es cualquier combinación de letras, números


y guiones de subrayado.
_Media8
Calcular_Sumatorio

No se puede comenzar un identificador con un número.

8_Media No válido

Las palabras clave de C son en minúsculas.


Se distingue entre mayúsculas y minúsculas.

CASA≠casa
Se recomienda utilizar identificadores descriptivos.

Los tipos de datos fundamentales son:


char carácter
int entero
float real
double real de doble precisión
Modificadores de los tipos
fundamentales:
short entero corto
long entero largo y double largo
unsigned entero sin signo
signed entero con signo
El rango de los valores de los tipos de datos es dependiente
de la implementación.
• Consultar limits.h y float.h
• No obstante, si que hay definidos unos mínimos:
En C existen cuatro tipos básicos de constantes:
– enteras
– reales
– carácter
– cadena de caracteres.
• Constantes enteras
– Decimal: 19, -213, 3
– Octal: 023, -0325, -03
– Hexadecimal: 0x13, 0Xd5, 0x3
– Decimal sin signo: 19U, 213U, 3U
– Octal sin signo: 023U, 0325U
– Hexadecimal sin signo: 0x13U, 0Xd5U
– Decimal largo: -213L, 3000000L
– Octal largo: 023L, -0325L
– Hexadecimal largo: 0x13L, 0Xd5L
– Decimal largo sin signo: 190000UL

Constantes reales:
4.7, -5.65, 4E3, -7e-2, 4.8E4, -7.2e-2
– La letra E substituye al número 10. Así, el número 4.8 x 104
es el 4.8E4.
– Las siguientes constantes representan el mismo valor:
0.00075E1, 0.0075, 0.075E-1, 0.75E-2,
75E-4

Constantes carácter:
– Representación: Un único carácter entre
comillas simples (‘).
– Una constante carácter tiene asociado un
valor numérico: su código ASCII.
– Una secuencia de escape es una pareja
de caracteres que representan uno solo.
El primero es siempre la barra inclinada \

Constantes cadena:
– Representación: una secuencia de caracteres delimitados por
comillas dobles “.
“Esto es una cadena”
“INICIO\n\nFIN”
“Comillas dobles \” y simples \’”
“C:\\Directorio\\Fichero.txt”
– Toda cadena tiene un carácter final de código ASCII 0 (‘\0’)
que el compilador
sitúa automáticamente al final de la cadena.

Una variable es un identificador que hace referencia a una


posición de memoria.
• Todas las variables deben ser declaradas antes de ser
usadas.

• Las variables pueden declararse en:


– Dentro de una función. Variables locales.
– En la cabecera de una función.

Argumentos.
– Fuera de todas las funciones. Variables globales.

• Es posible dar un valor inicial a las variables.


int i=0;
char a=‘a’;
• La declaración de constantes:
const float pi=3.14;
const char A = ‘A’;

Expresión: combinación de operadores y expresiones.


• La expresión más simple puede ser una constante, una
variable o una llamada a una función.
• Una expresión acabada en punto y
coma (;) se convierte en una sentencia.
• Una secuencia de sentencias dentro de llaves { } forma una
sentencia (sentencia compuesta).

Operador Acción
- Sustracción y signo unario
+ Adición
* Multiplicación
/ División
% Módulo (resto de la división entera)
-- Decremento
++ Incremento
Sentencia Equivalencia
z++; z=z+1;
++z; z=z+1;
x=++z; z=z+1; x=z;
x=z++; x=z; z=z+1;

Operador Acción
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor o igual que
== Igual
!= Distinto
• El resultado de estos operadores es un valor entero (0
FALSE, otro valor TRUE).
• En los primeros programas que se escriben en C es frecuente
confundir los operadores == y != al usar sus equivalentes en
PASCAL, = y <>.

• <> producirá un error de compilación.


• = no produce error de compilación, pues es un operador
válido en C.

Operador Acción
&& AND (Y lógico)
|| OR (O lógico)
! NOT (negación)
Condición Resultado lógico
5 Cierto
!5 Falso
!0 Cierto
5<6 && 7>=5 Cierto
5>6 && 7>=5 Falso
6>5 || 7>=5 Cierto
5>6 || 7<=5 Falso
!(5>6 || 7<=5) Cierto

Operador Acción
~ Complemento a 1 unario
& AND bit a bit
| OR inclusivo bit a bit
^ OR exclusivo (XOR) bit a
bit
<< Desplazamiento a la
izquierda
>> Desplazamiento a la
derecha
Operador Acción
= Asignación
operador= Asignación especial
Sentencia Equivalencia
a=b=c; a=c; b=c;
a+=b; a=a+b;
a*=b; a=a*b;

El operador ?: es un operador de asignación condicional.


• Su sintaxis es: (expresión_1)?expresión_2:expresión_3
• Ejemplo
x=(a>5)? 1 : 0;
• Es equivalente a:
Si a>5 entonces x=1
sino x=0

Operador Acción
& Dirección de un objeto (unario).
* Direccionamiento indirecto (unario).
[] Direccionamiento indexado.
sizeof(_) Da la talla de la variable o el tipo entre
paréntesis.
, Sirve para reunir varias expresiones
en una instrucción.
. Da acceso a los campos de las
estructuras.
-> Da acceso a los campos de las
estructuras accedidas por punteros.

Un puntero es una variable que contiene direcciones.


• Una variable puntero es una variable como cualquier otra, lo
que cambia es el tipo de los datos que almacena.

ENTORNOS SOBRE LOS LENGUAJES

ENTORNO DE DESARROLLO INTEGRADO

Un entorno de desarrollo integrado o IDE (Integrated


Development Environment) es un programa compuesto por un
conjunto de herramientas para un programador. Puede dedicarse
en exclusiva a un sólo lenguaje de programación o bien, poder
utilizarse para varios.

Un IDE es un entorno de programación que ha sido empaquetado


como un programa de aplicación, es decir, consiste en un
editor de código, un compilador, un depurador y un constructor
de interfaz gráfica GUI. Los IDE pueden ser aplicaciones por
si solas o pueden ser parte de aplicaciones existentes. El
lenguaje Visual Basic por ejemplo puede ser usado dentro de
las aplicaciones de Microsoft Office, lo que hace posible
escribir sentencias Visual Basic en forma de macros para
Microsoft Word.

Componentes de un IDE (Entorno de Desarrollo Integrado)

ü Un editor de texto.
ü Un compilador.
ü Un intérprete.
ü Herramientas de automatización.
ü Un depurador.
ü Posibilidad de ofrecer un sistema de control de
versiones.
ü Factibilidad para ayudar en la construcción de
interfaces gráficas de usuarios.

Los IDE proveen un marco de trabajo amigable para la mayoría


de los lenguajes de programación tales como C++, Java, C#,
Delphi, Visual Basic, Object Pascal, Velneo, etc. En algunos
lenguajes, un IDE puede funcionar como un sistema en tiempo de
ejecución, en donde se permite utilizar el lenguaje de
programación en forma interactiva, sin necesidad de trabajo
orientado a archivos de texto, como es el caso de Smalltalk u
Objective-C. Es posible que un mismo IDE pueda funcionar con
varios lenguajes de programación. Este es el caso de Eclipse,
que mediante pluggins se le puede añadir soporte de lenguajes
adicionales
Un entorno de programación puede estar concebido y organizado
de maneras muy diferentes, mostraremos algunas.

• En las primeras etapas de la informática la preparación


de programas se realizaba mediante una cadena de
operaciones. Cada una de las herramientas debía
invocarse manualmente por separado. En estas condiciones
no puede hablarse propiamente de un entorno de
programación

Ø El editor es un editor de texto simple


Ø El compilador traduce cada fichero de código fuente
a código objeto
Ø El montador (linker / builder / loader) combina
varios ficheros objeto para generar un fichero
ejecutable
Ø El depurador maneja información en términos de
lenguaje de máquina

• Un entorno de programación propiamente dicho combina


herramientas como éstas, mejoradas y mejor integradas.
Los componentes cuya evolución ha sido más aparente son
los que realizan la interacción con el usuario:

Ø El editor ya no es un simple editor de texto, sino


que tiene una clara orientación al lenguaje de
programación usado (reconoce y maneja determinados
elementos sintácticos)
Ø El depurador no presenta información en términos del
lenguaje de máquina, sino del lenguaje fuente
Ø El editor está bien integrado con las demás
herramientas (se posiciona directamente en los
puntos del código fuente en los que hay errores de
compilación, o que se están ejecutando con el
depurador en un momento dado.

• No es fácil establecer una clasificación dentro de la


variedad de entornos de programación existentes. En
algún momento se describieron las siguientes clases de
entornos, no excluyentes:
Ø Entornos centrados en un lenguaje
Ø Entornos orientados a estructura
Ø Entornos colección de herramientas

Entornos centrados en un lenguaje

Presentan las siguientes características generales:

v Son específicos para un lenguaje de programación en


particular
v Están fuertemente integrados. Aparecen como un todo
homogéneo
v Se presentan como una herramienta única
v El editor tiene una fuerte orientación al lenguaje
v Son relativamente cómodos o fáciles de usar

A veces son poco flexibles en la interoperación con otros


productos o en la ampliación de sus funciones y se basan en
representar el código fuente como texto.

Podemos encontrar ejemplos de estos entornos para todo tipo de


lenguajes

o Lenguajes funcionales con interpretación directa


• (Inter)Lisp, Haskell, etc.

o Lenguajes compilados a código de máquina nativo


• Delphi, Visual C++, AdaGide/GNAT, GPS, etc.

o Lenguaje ejecutados sobre máquina virtual


• Java (Visual Age, Eclipse), C# (Visual Studio .NET)

o Ejemplos especiales:
• Entornos Ada (Stoneman, Cais, Asis)
• Entornos Smalltalk
• Entornos Oberon, Component Pascal

Entornos orientados a estructura

Suelen ser específicos para un lenguaje de programación como


el entorno anterior, pero están concebidos de manera
diferente:

o El editor de código fuente no es un editor de texto,


sino un editor de estructura (editor sintáctico)

o Se basan en representar internamente el código fuente


como una estructura:
• Árbol de sintaxis abstracta: AST

o La presentación externa del código es en forma de texto


• Plantillas (elementos sintácticos no terminales)
• Texto simple (elementos terminales - a veces
"frases" para expresiones)

o Compilación incremental (en algunos casos)

o Para desarrollo personal, no en equipo

o Ejemplos:
• The Cornell Program Synthesizer (subconjunto de
PL/I)
• Mentor (Pascal)
• Alice Pascal
• Gandalf (intenta ser un entorno de desarrollo
completo, para todo el ciclo de vida)

En la actualidad los lenguajes de marcado (XML) pueden ser una


buena forma de representar la estructura del código fuente con
vistas a su manipulación. Existen editores y procesadores XML
que podrían ser la base de nuevos entornos de programación
orientados a estructura.

Entornos basados en combinación de herramientas


(toolkit)

Consisten en una combinación de diversas herramientas capaces


de inter-operar entre ellas de alguna manera. Características:

o Presentan integración débil

o Son un conjunto de elementos relativamente heterogéneos

o Son fáciles de ampliar o adaptar mediante nuevas


herramientas

o Pueden ser construidos en parte por el propio usuario


(programador)

o Ofrecen poco control de uso de cada herramienta

o El elemento frontal (front-end) para interacción con el


usuario suele ser un editor configurable, con llamadas a
herramientas externas. A veces estos editores
configurables se designan también con las siglas IDE
(que debería reservarse para el entorno completo)

o Ejemplos de editores configurables


• Emacs, Vim, Gvim
• Med, SciTE, jEdit
• Eclipse (algo más que un editor)

Entornos multilenguaje

Hay aplicaciones que combinan piezas de código fuente escritas


en diferentes lenguajes de programación. Algunas posibilidades
de combinación son las siguientes:

Entornos genéricos

o No se combinan lenguajes en un mismo programa. Hay varios


programas, cada uno en su propio lenguaje

o Bastaría combinar las herramientas correspondientes a


cada lenguaje (compiladores, etc.)

o Se podría usar un frontal común: editor personalizable


que soporte los lenguajes concretos

o Ejemplos:
• Emacs (con diferentes "modos")
• Eclipse (con diferentes "plug-ins")

Entornos específicos

o Para una combinación concreta de lenguajes

o Vienen a ser como los entornos centrados en un lenguaje,


sólo que admiten más de uno

o Usan un formato binario compatible que permite combinar


en un mismo programa partes escritas en los diferentes
lenguajes

o Ejemplo: GPS permite combinar módulos en Ada y C++


• Lenguajes ejecutados sobre máquina virtual

o La máquina virtual establece el formato del código


binario

o Pueden combinarse módulos escritos en diferentes


lenguajes para los que exista el compilador apropiado

o Cada lenguaje puede tener su entorno de programación


separado, o bien existir un entorno de programación
único
o Ejemplos:
• JVM (Java Virtual Machine). El lenguaje original es
Java. El intérprete es el JRE (Java Runtime
Environment). Hay compiladores a JVM para otros
lenguajes además de Java: Ada, Fortran, Component
Pascal (Oberon), etc. (incluso C#)
• .Net (Microsoft). El lenguaje original es C#. El
intérprete es el CLR (Common Language Runtime). Hay
compiladores a .Net para otros lenguajes además de C#:
Ada, Fortran, Component Pascal (Oberon), etc. (incluso
Java)
Algunos ejemplos de entornos integrados de desarrollo (IDE)
son los siguientes:

Anjuta (GTK, pensado para escritorio GNOME)


C++Builder y TurboC++ Explorer de Borland (ahora de
CodeGear)
Clarion
Code::Blocks
CodeWarrior
Delphi y Turbo Delphi de Borland(ahora de CodeGear)
DevCpp y wxDev-C++
Dr.Java
e-Des
Eclipse
GPS para Ada
IntelliJ IDEA
JBuilder de Borland (ahora de CodeGear)
JDeveloper de Oracle_Corporation
JCreator
KDevelop (QT, pensado para escritorio KDE)
Lazarus
MS Visual Studio .NET y Visual Studio Express de
Microsoft
MonoDevelop
NetBeans
RadRails para Ruby on Rails
RHIDE para DJGPP
#develop
Turbo C y Turbo C++ de Borland
Turbo Pascal de Borland
vDevelop ó Editor de Proyectos de Velneo
Watcom C/C++ Compiler y OpenWatcom
Xcode de Apple
WinDev de PC SOFT
Con toda esta información se da por entendido que los
alumnos cuentan ya con los conocimientos necesarios
para explicar el concepto de lenguaje de programación.
También pueden distinguir entre los distintos tipos de
lenguajes y las características que los distinguen unos
de otros. Conoce la historia a grandes rasgos de la
evolución y cambio de los lenguajes a través del tiempo
así como sus distintas etapas y empleo.
Sabe que se elementos son los esenciales para conformar
un lenguaje de programación, así como sus reglas y
enfoque asociado.

CUESTIONARIO

1. ¿Cuál fue el primer lenguaje utilizado para la programación


de computadoras?

a) Java
b) C
c) El lenguaje corporal
d) El lenguaje maquina
e) El lenguaje hablado

2. ¿En que teoría se considera que se encuentran los orígenes


de los lenguajes de programación?

a) Máquina de Babbage
b) Arquitectura de Von Neumann
c) Teoría de la relatividad
d) Máquina del tiempo
e) Teoría de conjuntos

3. ¿Cuál es la idea central en la maquina de Von Neumann?


a) La de programa almacenado, donde instrucciones y
datos se almacenan juntos
b) Guardar las instrucciones y los datos en medios diferentes
y separados
c) Utilizar el código binario para crear programas
d) Manejar cadenas de datos pequeñas en los programas de
computación
e) Estandarizar el diseño de hardware de las computadoras

4. ¿En que década comienzan a desarrollarse los primeros


lenguajes de programación?

a) 30’s
b) 40’s
c) 50’s
d) 60’s
e) 70’s

5. Fue uno de los primeros lenguajes de programación.

a) C
b) Pascal
c) PHP
d) Java
e) Fortran
6. ¿En cuantas generaciones se suele clasificar a los
lenguajes de programación?

a) 2 generaciones
b) 5 generaciones
c) 8 generaciones
d) 10 generaciones
e) 15 generaciones

7. Es un ejemplo de lenguaje de programación de bajo nivel

a) Visual Basic
b) C#
c) Java
d) Lenguaje ensamblador
e) PHP

8. Es una de las características de la cuarta generación de


los lenguajes de programación:

a) Los códigos son muy parecidos al lenguaje matemático


b) Los lenguajes están orientados a desarrollar la
inteligencia artificial
c) Se utiliza el concepto de programación orientada a
objetos
d) Se programa directamente en código binario
e) Siempre se hace referencia a localidades absolutas de
memoria

9. ¿Que es un subprograma?
a) Es un procedimiento (procedure) o una función
(function). La diferencia entre un procedimiento y una
función es que el primero sólo indica la ejecución de
una secuencia de instrucciones, en función de unos
parámetros, mientras que la segunda representa un valor
que se genera como resultado de su ejecución.

b) Es un programa más pequeño dentro de un programa.

c) Son programas o funciones pequeñas

10. ¿Para qué se utiliza la construcción do-while?

a) Se utiliza cuando se desea ejecutar el cuerpo de un


bucle while al menos una vez, incluso si la expresión
booleana tiene el valor false la primera vez. Es decir
si se desea evaluar la expresión de terminación al
final del bucle en vez de al principio como en el
while.

b) No se utiliza cuando se desea ejecutar el cuerpo de un


bucle while al menos una vez

c) No se desea evaluar la expresión de terminación al final


del bucle en vez de al principio como en el while.

11. ¿Qué es control de flujo?

a) Es la manera que tiene un lenguaje de programación


de provocar que el flujo de la ejecución avance y se
ramifique en función de los cambios de estado de los
datos.

b) Es la manera que tiene un lenguaje de programación de


provocar que no se ramifique

c) Es la manera que tiene un lenguaje de programación de


provocar que no se avance los cambios de estado de los datos.

12. ¿Qué cambia en una variable puntero?

a) Es una variable como cualquier otra cambia es el


tipo de los datos que almacena.

b) No hay ningún cambio


c) Ninguna de las mencionadas

13. Características de un entorno centrado:

a) Fáciles de usar, relativamente cómodos de usar, integración


débil

b) Fuertemente integrados, compilación incremental,


relativamente heterogéneos

c) Poco flexibles para ampliar, fáciles de usar, son


todo homogéneos

d) Compilación incremental, relativamente cómodos de usar,


para desarrollo personal

e) Son todo homogéneos, fuertemente integrados, fáciles de


usar

Bibliografía
SETHI, Ravi. Lenguajes de programación, conceptos y
constructores.
Addison -Wesley Iberoamericana.
México 1992.

PRATT, Terrence W. Lenguajes de programación, diseño e


implementación.
Prentice - Hall Hispanoamericana.
México 1998.

http://www.tiobe.com/index.html?tiobe_index
http://www.todo-
programacion.com.ar/archives/2005/04/lenguaje_de_maq.html
http://www.desarrolloweb.com/articulos/2358.php
http://etsiit.ugr.es/alumnos/mlii/ArqVonNeumann.htm
http://es.wikipedia.org/wiki/Generaciones_de_lenguajes_de_prog
ramaci%C3%B3n

http://enciclopedia.us.es/index.php/Lenguaje_de_programaci%C3%
B3n

Você também pode gostar