Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Definición
Un lenguaje de programación es un conjunto de
símbolos y palabras (instrucciones y sentencias)
que el usuario tiene a su disposición para
elaborar un programa.
Tipos de Lenguaje
• Lenguaje máquina
• Lenguajes de bajo nivel
• Lenguajes de alto nivel
Lenguaje Máquina
- Burrougs, vendedor de computadoras que más tarde se fusiono con Sperrry Univac
para formar Unisys incluye la técnica del polaco Lukasewics de evaluación de
expresiones matemáticas sin paréntesis con un proceso eficiente de evaluación con
base a pilas. Esta técnica tuvo un importante efecto sobre la teoría de compiladores. A
través del uso de la técnica de Lukasewics, Borrougs desarrollo el hardware de
computadora B5500 con base en una arquitectura de pilas y pronto tuvo un
compilador de ALGOL, mucho más rápido que cualquier compilador de FORTRAN.
Historia de los lenguajes de programación
1959.
- El departamento de defensa de USA patrocino una reunión para desarrollar el Common Business Languaje
(CBL: lenguaje común para negocios), el cual habría de ser un lenguaje orientado a negocios que usara el
inglés tanto como fuera posible para su notación.
1960´s.
- Aparecen las especificaciones de COBOL (Common Business Oriented Languaje), se reviso en 1961 y 1962,
se estandarizó en 1968, y revisado nuevamente en 1974 y 78.
Aparecen los tipos definidos por el usuario. Aparece SIMULA-67, desarrollado por Nygaard y Dahl de
Noruega introdujo el concepto de clases en ALGOL. Stroustrup lo implementa en sus clases de C++ como
una extensión de C n los 80’s..
Whirth desarrollo ALGOL-W como una extensión de ALGOL (con mediano éxito).
Whirth desarrolla PASCAL el cual se convirtió en el lenguaje de la ciencia de la computación en los 70.
Aparece ALGOL 68.
1970’s.
-IBM desarrolla NPL (new programming lenguaje). Después cambia el nombre a MPPL (multi purpose
programming lenguaje) para finalmente quedar en PL/1. Fusiona los atributos numéricos de FORTRAN con
las características de programación para negocios de COBOL . Aparece el lenguaje C, con el desarrollo de un
entorno competitivo en UNIX escrito principalmente en C, se ha demostrado la eficacia de lenguajes de alto
nivel en el entorno de los lenguajes para sistemas .
- actualidad: lenguajes orientados a objetos (C sharp, Java) y lenguajes de 4GL (oracle, ABAP, Progress)
sintaxis de los lenguajes de programación.
La sintaxis de un lenguaje de programación proporciona las reglas de cómo se escriben
los enunciados, declaraciones y otras construcciones del lenguaje.
i. Análisis Léxico.- Agrupar la serie de caracteres del programa objeto en sus constituyentes elementales:
identificadores, delimitadores, símbolos de operadores, números, palabras clave, palabras pregonadas,
espacios en blanco, comentarios, etc. Las unidades básicas de programa que resultan del análisis léxico se
llaman elementos o componentes léxicos. Además identifica el tipo de cada elemento.
ii. Análisis Sintáctico (parsing).- Se identifican las estructuras de programa más grandes (enunciados,
declaraciones, expresiones, etc.) usando los elementos léxicos producidos por el analizador léxico. Primero
identifica una serie de elementos léxicos que forman una unidad sintáctica como una expresión, enunciado,
llamada de subprograma o declaración.
iii. Análisis Semántico.- Fase modular de la traducción. Aquí se procesan las estructuras sintácticas
reconocidas por el analizador sintáctico y la estructura del código objeto ejecutable comienza a tomar
forma. El análisis semántico es, por tanto, el puente entre las partes de análisis y de síntesis de traducción.
Aquí también ocurre el mantenimiento de tablas de símbolos, la mayor parte de la detección de errores, la
expansión de macros y la ejecución de enunciados de tiempo de compilación.
Las partes del analizador semántico son:
a. Mantenimiento de tablas de símbolos.
b. Inserción de información implícita.
c. Detección de errores.
d. Procesamiento de macros y operaciones en tiempo de compilación.
Etapas de traducción
Síntesis del programa objeto:
i. Optimización.- El analizador semántico genera la forma del programa interno de manera irregular,
conforme se analiza cada segmento del programa de entrada. El optimizador lo que hace es que reemplaza
las secuencias que son irregulares por otras mejoras que evitan insuficiencias obvias.
ii. Generación de código.- Después de que se ha optimizado el programa traducido en la representación
interna, se debe transformar en los enunciados en lenguaje ensamblador, código de máquina u otra forma
de programa objeto que va a constituir la salida de la traducción. Este proceso implica dar el formato
apropiado a la salida con base en la información que contiene la representación interna del programa. El
código de salida puede ser directamente ejecutable o puede haber otros pasos de traducción por seguir, por
ejemplo, ensamblado o vinculación y carga.
iii. Vinculación y carga.- Los fragmentos de código que son resultado de las traducciones individuales de
los subprogramas se funden en el programa final ejecutable. La salida de las fases de traducción
precedentes consisten en programas ejecutables en una forma casi final, excepto cuando los programas
hacen referencia a datos externos u otros subprogramas. Estas ubicaciones incompletas en el código se
especifican en las tablas de cargador anexas que produce el traductor. El cargador vinculador (o editor de
vínculos) carga los diversos de código traducido en la memoria y luego usa las tablas del cargador anexas
para vincularlos correctamente entre sí introduciendo datos y direcciones de subprograma el código según
se requiere. El resultado es un programa ejecutable listo para usarse
Modelos formales de traducción
Las partes del reconocimiento sintáctico de la teoría de compiladores son bastante normales y
se basan en general en la teoría de lenguajes independientes de contexto planteadas por
Chomsky.
se conocen con el nombre de gramáticas de contexto libre son un método recursivo sencillo de
especificación de reglas gramaticales con las que se pueden generar cadenas de un lenguaje.
Una gramática formal es simplemente una gramática que se especifica usando una notación
definida de manera estricta. Las dos clases de gramática útiles en tecnología de compiladores
incluyen la gramática BNF (o gramática libre del contexto) y la gramática normal.
Introducción al lenguaje Dr. Racket
Racket o Dr. Racket (formalmente llamado PLT Scheme) es un lenguaje
de programación de software libre, multiparadigma de la familia
Lisp/Scheme. Proviene de la familia del lenguaje LISP utilizado en
inteligencia artificial, matemáticas y estructuras de datos.
véase: http://racket-lang.org/
Tipos de datos
Un tipo de datos es una clase de objetos de datos ligados a un conjunto de operaciones para
crearlos y manipularlos.
•La representación de almacenamiento que se usa para representar los objetos de datos del
tipo de datos en el almacenamiento de la computadora durante la ejecución del programa.
•La manera en que las operaciones definidas para el tipo de datos se representan en términos
de algoritmos o procedimientos particulares que manipulan la representación del
almacenamiento elegida para los objetos de datos.
Tipos de datos abstractos
Un tipo de datos abstracto se define como:
•Un conjunto de objetos de datos ordinariamente usando una o más definiciones de tipo.
•Un conjunto de operaciones abstractas sobre estos objetos de datos.
•El encapsulamiento de todo en forma tal que el usuario del nuevo tipo no pueda manipular
objetos de datos del tipo excepto a través del uso de operaciones definidas.
Un tipo de datos abstracto es un tipo de datos que crea un programador en base a las
necesidades y requerimientos que tiene que cubrir su programa.
Gestión de almacenamiento
Es cuando el programador ocupa a fondo la gestión de almacenamiento de los datos y debe proyectar
programas que usen el almacenamiento de manera eficiente. Sin embargo tiene poco control directo
sobre él. Un programa afecta el almacenamiento, solo de manera indirecta a través del uso de ciertas
características del lenguaje, esto es porque se trata como un tema dependiente de la máquina.
Los elementos de programas y datos que requieren almacenamiento durante la ejecución del programa:
•Segmentos de código para programas de usuario traducidos. Los llamados programas objeto y programas
interpretados.
•Programas de sistema en tiempo de ejecución.- Programas del sistema operativo que usan los programas
que hacemos, ejemplos: bibliotecas de funciones, intérpretes, traductores y las rutinas que controlan la
gestión de almacenamiento en tiempo de ejecución.
•Estructuras de datos constantes definidas por el usuario.
•Puntos de retorno en subprogramas.
•Entornos de referencia.
•Temporales en evaluación de expresiones.
•Temporales en transmisión de parámetros .
•Buffers de entrada y salida.
•Datos diversos del sistema.
•Operaciones de llamada y retorno de subprogramas.
•Operaciones de creación y destrucción de estructuras de datos.
•Operaciones de inserción y eliminación de componentes.
Gestión de almacenamiento
Fases de la gestión de almacenamiento:
• Asignación inicial.- Al inicio de la ejecución cada segmento de almacenamiento puede estar ya sea
asignado o libre. Si esta libre inicialmente, estará disponible para asignarse de manera dinámica conforme
avanza la ejecución.
• Recuperación.- El almacenamiento que ha sido asignado y usado, y que posteriormente queda
disponible, debe ser recuperado por el gestor de almacenamiento para volver a usarlo. La recuperación
puede ser muy simple, como en la reubicación de un apuntador de pila, o muy compleja, como en la
recolección de basura.
• Compactación y nuevo uso.- El almacenamiento recuperado puede estar listo de inmediato para volver a
usarse, o puede requerirse una compactación para construir bloques grandes de almacenamiento libre a
partir de fragmentos pequeños.
Control de secuencia
En un lenguaje de programación, las estructuras de control proporcionan el marco básico dentro del cual
las operaciones y datos se combinan en programas y conjuntos de programas.
El control de secuencia es el control del orden de ejecución de las operaciones, tanto primitivas como
definidas por el usuario.
Las estructuras de control de secuencia se pueden clasificar convenientemente en tres grupos:
• Estructuras que se usan en expresiones (y por tanto dentro de enunciados, puesto que las expresiones
constituyen los bloques de construcción básicos para enunciados), como regla de precedencia y paréntesis.
•Estructuras que se usan entre enunciados o grupos de enunciados, como enunciados condicionales e
iterativos.
•Estructuras que se usan entre subprogramas, como llamadas de subprograma y corrutinas.
Las estructuras de control de secuencias también pueden ser implícitas o explicitas. Las implícitas (o por
omisión) son las que el lenguaje define que están en operación, a menos que el programador las modifique
a través de alguna estructura explicita. Por ejemplo casi todos los lenguajes definen que el orden físico de los
enunciados de un programa controla el orden en el cual los enunciados se ejecutan, a menos que sea
modificado por enunciado de control de secuencia explicito. Dentro de las expresiones también hay
comúnmente una jerarquía de operaciones definida por el lenguaje y que controla el orden de ejecución de
las operaciones de la expresión cuando no hay paréntesis.
Las Estructuras de Control de
Secuencia
28
Categorias de ECS
• Expresiones
• Instrucciones o grupos • Implícitas
de instrucciones • Explícitas
• Programación
Declarativa
• Subprogramas
29
Arboles para representar
expresiones
• Composición funcional
• Operaciones y sus respectivos operandos
• Resultados de operaciones forman nuevos
operandos
• Operaciones representadas por niveles
• No se define precedencia en operaciones en el
mismo nivel
30
Ejemplo: Raíz de 2do grado
/
-B+ B2 –4*A*C
+ *
2 *A
_ SQRT 2 A
B -
^ *
B 2 * C
4 A
31
Representación Sintáctica
• Linealización de arboles.
•Notación Prefija (Polaca)
•Notación Polaca Cambridge
•Notación Postfija
•Notación Infija
32
Representación Sintáctica : Ejemplo
*
Prefija: *+AB-CD
+ - Prefija Cambridge: (*(+AB)(-CD))
Infija: (A+B)*(C-D)
A B C D
Postfija: AB+CD-*
33
Representación Semántica
• Evaluación de expresiones prefijas.
•Características
–Evaluación en una sola pasada
–Necesidad de saber el numero de argumentos por tipo de
operación
–No hay necesidad de paréntesis
–Similitud con llamadas a funciones
–Operaciones con cualquier número de operandos
–Decodificacion sencilla a secuencias de código
34
Representación Semántica
• Evaluación de expresiones infijas.
•Características
–Forma común de expresar las expresiones aritméticas
–Trabaja con operadores binarios
–Funciones y operadores unarios implementados a traves de
notación prefija o postfija
–Necesidad de uso de paréntesis para evitar ambigüedad
–Decodificación compleja a secuencias de código
35
Jerarquía de operaciones
36
Jerarquia de Operaciones : Ejemplo
• C
A= =B | C= = D evaluado (A= =B) | (C= = D)
Precedencia del operador = = sobre |
• Pascal
A=B | C=D evaluado A=(B | C)=D
Precedencia del operador | sobre =
37
Etapas de traducción
38
Formas en que se traducen
las expresiones en notación
infija
• Código máquina
• Estructura de árbol
• Prefija o postfija
39
Control de secuencia entre
instrucciones
• Instrucciones básicas
• Tipos de control de secuencia a nivel de
instrucciones
• Control de secuencia explícita
• Diseño estructurado de programas
40
Instrucciones básicas
• Instrucciones de asignación
• A:=B (PASCAL)
• A=B (C, Java)
• MOVE A TO B (COBOL)
• AB (APL)
• (SETQ A B) (LISP)
• A += B (C, Java)
• ++A
• A++
41
Instrucciones básicas
• Instrucciones de entrada y salida.
<STDIN>;
System.out.println(”Hola”);
42
Control de secuencia explicita
• GOTO incondicional
• GOTO condicional
• BREAK
• CONTINUE
43
Goto : Ejemplo
#include <iostream.h>
void main()
{
int n;
for(;;)
{
cout <<“Ingresa un número (0 para terminar): ";
cin >> n;
cout << n <<" al cubo es: " << n*n*n << "n";
if(n == 0) goto esc;
}
esc:
cout << endl;
}
44
Problemas con Goto en Basic
C64 BASIC:
750 ifnv(0)=0thenf=0:goto770
760 goto790
770 ifint(rnd(1)*100+1)<=nthen800
780 nextx:goto1640
790 ifn<>nv(1)andn<>0thennextx:goto1640
45
Break
#include <iostream.h>
void main()
{
int n, count = 0, sum = 0;
cout <<"Enter positive integers. Terminate input with 0:n";
for (;;) {
cout << "t" <<count + 1 << ": ";
cin >> n;
if(n ==0) break;
++count;
sum += n;
}
cout <<"The average of the " << count << " numbers is "
<< (float) sum / count << endl;
}
46
Continue
#include <iostream.h>
int main()
{
int n = 0;
for(;;)
{
n++;
if (n%7 == 0) continue;
cout << "n = " + n;
}
}
47
Diseño estructurado de programas
1. Diseño jerárquico
2. Representación del diseño en el código del
programa
3. La secuencia textual = la secuencia actual
4. Un grupo de instrucciones tiene solamente
una función
48
Control de Secuencia Estructurado
• Conjunto de instrucciones de control en un
lenguaje de alto nivel
– Composición o Agrupamiento
– Condicionales o de Alternación
– Iteración
49
Agrupamiento
Ejemplos: Begin {
... ...
End }
50
Condicionales
• Expresan la ejecucion alternada de dos
instrucciones o la ejecución condicional de
una instrucción
• La alternativa se controla por medio de una
condición.
51
Iteración
• Proveen capacidad de repetición de
ejecución de un mismo código
• Estructuras básicas contienen un
encabezado y un cuerpo
• El encabezado controla en número de veces
que se iterará
• El cuerpo es el conjunto de instrucciones a
repetirse
52
Iteración : Ejemplos
• Repetición Simple
(Cobol) Perform cuerpo K veces
• Repetición mientras se mantiene una condición
(C) While <cond> { cuerpo }
• Repetición mientras se incrementa un contador
(Algol) for I := 0 step 2 until 30 do cuerpo
• Repetición controlada por datos
(Perl) foreach $X(@Array) { cuerpo }
• Repetición indefinida
(Ada) Loop ... Exit when <cond> ... end Loop;
53
Problemas de ECS estructurada
• Discusión del Goto
Condiciones
Salidas
Do-While-Do
multiples
excepcionales
de loops
On Error en VB y Raise en
Utilizando go to Ada en
Exit como
Adaopción
y Break en C
como opción
For I := 1 to K do On error go to α
For I = 1 .. K loop
if Vect[I] = 0 then go to α Instrucción 1
exit when Vect[I] = 0 ;
Loop Instrucción 2
End loop;
...
α: Manejo de errores
54
Problemas de ECS estructurada
• Discusión del Goto
Condiciones
Salidas
Do-While-Do
multiples
excepcionales
de loops
Utilizando go to
Exit when en Ada e If <cond>
Exit en Ada y Break en C
Loop Break en C como opción
como opción
read(x) Loop
For I = 1 .. K loop
if EOF then go to α read(x)
exit when Vect[I] = 0 ;
process(x) If EOF break
End loop;
End loop; process(x)
End loop;
55