Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Imperativo
Paradigma Imperativo
Conceptos básicos
Desventajas:
Los datos son expuestos a la totalidad del
programa, por lo que pierden seguridad.
Dificultad para relacionarse con objetos del
mundo real.
Dificultad para la creación de nuevos tipos de
datos, lo que reduce la extensibilidad.
Se da importancia al proceso más que a los
datos mismos.
Paradigma Imperativo
Programación Imperativa - Lenguajes
ForTran
Primer lenguaje científico desarrollado por John Backus para
IBM, en 1957.
Su nombre se deriva de Formula Translating System:
For=Formula y Tran=Translator o Translation
Usado para el cálculo numérico y la computación científica.
Aplicable a física y química computacional durante más de
medio siglo.
Soporta tipos de datos numéricos, booleanos, arreglos,
cadenas de caracteres.
Manejo de archivos.
Paradigma Imperativo
Programación Imperativa - Lenguajes
ForTran
Ejemplo: Programa “Hola”.
program Hola
print *, ’hola mundo!’ // muestra hola mundo!
end program Hola
Paradigma Imperativo
Programación Imperativa - Lenguajes
ALGOL
Lenguaje que aparece durante los años 50.
Acrónimo formado por las siglas ALGorithmic Oriented
Language.
Diseñado para resolver algunos problemas detectados en
el lenguaje ForTran, buscando una programación más
independiente de la máquina.
Sin gran repercusión comercial, pero influyente en
muchos otros lenguajes como a Pascal, C y ADA.
Introduce conceptos de bloques de código (begin y end).
Primer lenguaje con funciones anidadas.
Paradigma Imperativo
Programación Imperativa - Lenguajes
ALGOL
Ejemplo. Mostrar Hola Mundo!
BEGIN FILE F (KIND=REMOTE);
WHILE TRUE DO
BEGIN
WRITE (F, *, A);
END;
END.
Paradigma Imperativo
Programación Imperativa - Lenguajes
COBOL
Acrónimo en inglés de COmmon Business Oriented Language.
Lenguaje orientado a los negocios, finanzas y sistemas
administrativos, ya sea para empresas o gobiernos, creado en
los años 50's.
Fue el primer lenguaje de alto nivel lenguaje ampliamente
utilizado en programación, con todas las instrucciones
codificables en simples palabras en inglés.
Es portable, con tipos de datos y estructuras que permiten
escribir grandes aplicaciones que puedan ser implementadas
en nuevas plataformas con un cambio mínimo o nulo.
En el año 2002 se agrega el soporte a orientado a objetos.
Paradigma Imperativo
Programación Imperativa - Lenguajes
COBOL
Ejemplo. Hola Mundo!
000100 IDENTIFICATION DIVISION. 100000 PROCEDURE DIVISION.
000200 PROGRAM-ID. HOLAMUNDO. 100100
000300 100200 MAIN-LOGIC SECTION.
000400* 100300 BEGIN.
000500 ENVIRONMENT DIVISION. 100400 DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
000600 CONFIGURATION SECTION. 100500 DISPLAY "Hola Mundo! " LINE 15 POSITION 10.
000700 SOURCE-COMPUTER. RM-COBOL. 100600 STOP RUN.
000800 OBJECT-COMPUTER. RM-COBOL. 100700 MAIN-LOGIC-EXIT.
000900 100800 EXIT.
001000 DATA DIVISION.
001100 FILE SECTION.
001200
Paradigma Imperativo
Programación Imperativa - Lenguajes
PASCAL
Diseñado en 1968 por Niklaus Wirth, basado en Algol.
Inicialmente, utilizado en el ámbito académico pero luego
extendido comercialmente para convertirse en una
herramienta para la creación de todo tipo de aplicaciones.
Es un lenguaje de sintaxis sencilla, sumamente estructurado y
que comprueba exhaustivamente todo tipo de datos.
Fue el lenguaje utilizado por los primeros Mac.
Paradigma Imperativo
Programación Imperativa - Lenguajes
PASCAL
Ejemplo. Mostrar ¡Hola, Mundo!
Program HolaMundo;
Begin
WriteLn('¡Hola, Mundo!');
End.
Paradigma Imperativo
Programación Imperativa - Lenguajes
BASIC
Es un lenguaje de programación para Beginner's All-purpose
Symbolic Instruction Code.
• Diseñado por John George entre otros, en los años 60's.
• Introducido para los estudiantes que no hayan tenido un
acceso a la ciencia de la computación.
Sigue siendo muy popular con dialectos modificados como
Visual Basic.
Su principal objetivo era usar una computadora para apoyar a
la enseñanza y la investigación.
Ejemplo. Mostrar Hola Mundo!
CLS
PRINT “Hola Mundo!”
Paradigma Imperativo
Programación Imperativa - Lenguajes
Lenguaje C
Desarrollado en 1972 por Dennis Ritchie en los
laboratorios Bell para el uso en sistemas operativos Unix.
Uno de los lenguajes de programación más populares de
todos los tiempos.
Influyente en los lenguajes de programación hoy en día.
Lexicalmente hablando es fácil de entender.
Con utilización de matrices y punteros.
Es un lenguaje de nivel medio.
Con gran portabilidad.
Paradigma Imperativo
Programación Imperativa - Lenguajes
Lenguaje C
Ejemplo. Hola Mundo!
#include <stdio.h>
int main()
{
printf("Hola Mundo!");
return 0;
}
Paradigma Imperativo
Clasificación de los Lenguajes
Los lenguajes de programación se pueden clasificar
según varios criterios.
Nivel de Abstracción Paradigma de Programación
Propósito Lugar de Ejecución
Evolución Histórica Concurrencia
Formas de Ejecución Interactividad
Determinismo
Forma de Desarrollar la Tarea
Paradigma Imperativo
Clasificación de los Lenguajes
Según su Nivel de Abstracción o grado de cercanía al
procesador:
Bajo Nivel. La programación se realiza teniendo muy en
cuenta las características del procesador. Ejemplo:
Lenguajes Ensambladores (Assembler), utilizan palabra
mnemotécnicas para reemplazar al código binario.
Nivel Medio. Mayor grado de abstracción pero al mismo
tiempo mantienen algunas cualidades de los lenguajes de
bajo nivel. Ejemplo: C puede realizar operaciones lógicas y
de desplazamiento con bits, tratar todos los tipos de datos
como lo que son en realidad a bajo nivel, etc.
Paradigma Imperativo
Clasificación de los Lenguajes
Enlace
Paradigma Imperativo
Traductores - Compiladores
Partes de un compilador:
Front End: es la parte que analiza el código
fuente, comprueba su validez, genera el árbol
de derivación y completa los valores de la tabla
de símbolos. Suele ser independiente de la
plataforma y se la conoce como fase de análisis.
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Análisis léxico o lexicográfico:
Lee los caracteres del programa fuente de izquierda a
derecha y los agrupa en cadenas que representan los
componentes léxicos, llamados lexema o token. Para
reconocerlos, usa un patrón, una regla que describe como
se forman las cadenas correspondientes a un token.
Elimina comentarios, espacios en blanco, tabuladores.
Registra la línea del archivo fuente que está siendo
analizada.
Genera mensajes de error léxico.
Convierte los valores literales al tipo que corresponda.
Si la entrada debe obedecer a un formato, lo verifica.
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Análisis sintáctico:
Encargado de comprobar las reglas de sintaxis del
lenguaje, en base a una gramática dada.
Obtiene la cadena de tokens del analizador léxico y
verifica que puede ser generada por la gramática
que describe el lenguaje fuente.
Genera el árbol sintáctico cuando la entrada es
correcta.
Genera mensajes de error de sintaxis cuando la
entrada es incorrecta.
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Análisis semántico:
Detecta sentencias con operaciones inválidas con
sintaxis correcta: compatibilidad entre un operador y
sus operandos.
Control de tipo y declaración de datos.
Control de parámetros en llamadas y retorno de
funciones.
Verifica que el flujo de control sea el correcto.
Revisa que no exista duplicidad de nombre cuando
no está admitido.
Genera mensajes errores por problemas semánticos.
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Tabla de símbolos:
Es generada y compartida por todas las etapas del
compilador.
Cada etapa puede incorporar nuevas entradas, evitando la
repetición de las mismas.
Nunca se utiliza en tiempo de ejecución.
Formada por: nombre del identificador, tipo de dato,
dirección de memoria, alcance, tamaño, dimensión para
los vectores o matrices, etc.
Tiene dos funciones principales:
Facilitar el chequeo semántico
Colaborar en la generación de código
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Generador de código intermedio:
Transforma la salida del análisis semántico (arboles
semánticos), en una representación o código intermedio.
Es una representación más abstracta y uniforme que un
lenguaje máquina concreto.
Su misión es descomponer las expresiones complejas en
binarias y las sentencias complejas en sentencias simples
para facilitar la optimización del código final.
Es independiente de la máquina donde se genera la
compilación.
Existen varias formas de representación: arboles sintácticos
y semánticos, notación postfija (A B +) y código de tres
direcciones (solo 3 pasos para cualquier operación).
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Optimizador de código:
Su objetivo es producir un código objeto lo más
eficiente posible, según los criterios :
• tiempo de ejecución (optimización temporal)
• espacio de memoria usado (optimización espacial)
Algunas optimizaciones a realizar son:
• evaluación de expresiones constantes,
• uso de ciertas propiedades de los operadores
(asociativa, conmutativa, distributiva)
• reducción de expresiones comunes.
• eliminación de variables temporales repetitivas.
Paradigma Imperativo
Traductores - Compiladores
Etapas de un compilador:
Generador de código:
Es la generación de código objeto, el cual consiste en
código de máquina relocalizable o código ensamblador.
Las posiciones de memoria se seleccionan para cada una
de las variables usadas por el programa.
Cada una de las instrucciones intermedias se traduce a
una secuencia de instrucciones de máquina que ejecuta
la misma tarea.
Toma como entradas la representación intermedia
optimizada del programa fuente y la tabla de símbolos y
produce como salida un programa objeto equivalente.
Paradigma Imperativo
Traductores
Ventajas de los Compiladores:
Produce un código optimizado.
La ejecución del programa objeto es mucho más
rápida que si se interpreta el programa fuente.
El compilador tiene una visión global del programa,
por lo que la información de mensajes de error es
más detallada.
Se debe ejecutar muchas veces el código fuente para
ver los cambios en el resultado.
Mayor consumo de memoria.
Paradigma Imperativo
Traductores - Intérpretes
Programa encargado de procesar y traducir cada instrucción o
sentencia, escritos en un lenguaje de alto nivel a código de
máquina y después ejecutarla.
Los intérpretes sólo realizan la traducción a medida que sea
necesaria, típicamente, instrucción por instrucción, y
normalmente no guardan el resultado de dicha traducción.
Un intérprete facilita la búsqueda de errores, pues la
ejecución de un programa puede interrumpirse en cualquier
momento para estudiar el entorno (valores de las variables,
etc.). Además, el programa puede modificarse sobre la
marcha, sin necesidad de volver a comenzar la ejecución.
Paradigma Imperativo
Traductores - Intérpretes
Usando un intérprete, un solo archivo fuente puede
producir resultados iguales incluso en sistemas sumamente
diferentes.
Usando un compilador, un solo archivo fuente puede
producir resultados iguales solo si es compilado a distintos
ejecutables específicos a cada sistema.
Los programas interpretados suelen ser más lentos que los
compilados debido a la necesidad de traducir el programa
mientras se ejecuta, pero a cambio son más flexibles como
entornos de programación y depuración.
Paradigma Imperativo
Traductores - Intérpretes
Permiten ofrecer al programa interpretado un entorno no
dependiente de la máquina donde se ejecuta el intérprete, sino
del propio intérprete (lo que se conoce comúnmente
como máquina virtual).
Para mejorar el desempeño, algunas implementaciones de
programación de lenguajes de programación pueden interpretar
o compilar el código fuente original en una más compacta forma
intermedia y después traducir eso al código de máquina (ej.
Perl, Python, MATLAB y Ruby). Algunos aceptan los archivos
fuente guardados en esta representación intermedia (ej. Python
y Java).
Paradigma Imperativo
Traductores - Intérpretes
Los intérpretes realizan dos operaciones:
Traducen el código fuente a un formato interno.
Ejecutan o interpretan el programa traducido.
Paradigma Imperativo
Traductores - Intérpretes
Tipos de Intérpretes:
Intérpretes Puros. Analizan y ejecutan sentencia a
sentencia todo el programa fuente. Reducen memoria
pues solo requieren la línea que se esta ejecutando,
pero al detectar errores se debe volver a comenzar el
proceso
Intérpretes Avanzados. Incorporan un paso previo de
análisis de todo el programa fuente. Generando
posteriormente un lenguaje intermedio que es
ejecutado por ellos mismos. En caso de errores
sintácticos, no pasan de la fase de análisis.
Paradigma Imperativo
Traductores - Intérpretes
Asignación parámetro-argumento:
Posicional. El orden de declaración de los
parámetros determina el orden de asignación de
los argumentos.
Nominativa. El nombre de los parámetros puede
ser usado para la asignación de argumentos en
la llamada (nombreParametro=valor).
Programación Procedural
Parámetros
Parámetros con argumentos o valores por defecto:
admitido por algunos lenguajes para uno o varios
parámetros, pudiendo omitir el argumento si el valor
no va a ser distinto al establecido por defecto.
Objetivos.
Reusabilidad.
Organizacional.
Bibliotecas.
Diseño.
Paradigma Imperativo
Sistemas de Tipado
Tipo de Dato. Representa un conjunto de valores junto
con las operaciones que se pueden realizar sobre ellos.
Parte abstracta. Define únicamente la forma de
construir valores de ese tipo y los nombres de las
operaciones junto con las ecuaciones que indican la
forma que actúan.
Parte de implementación. Define la representación
de los datos (el formato en que se almacenan los
valores en memoria) y los algoritmos de las
operaciones.
Paradigma Imperativo
Sistemas de Tipado
Objetivos de los tipos de datos.
Determinación del espacio del almacenamiento
de los valores.
Traducción de las operaciones a las
instrucciones adecuadas del procesador.
Detección de errores provocados por
operaciones aplicadas a valores erróneos.
Sintaxis que admita la creación de tipos
estructurados.
Fundamental en el diseño de las aplicaciones.
Paradigma Imperativo
Sistemas de Tipado
Tipos de datos habituales:
Pueden ser primitivos o estructurados, si se
pueden descomponer o no.
Respecto al sentido de la sentencia de
asignación, pueden clasificarse en valores o en
referencias.
Respecto al método de creación de valores,
pueden ser literales o dinámicos.
Los tipos de datos primitivos se guardan como
valores y los tipos estructurados como referencias o
punteros.
Paradigma Imperativo
Sistemas de Tipado
El Tipo Puntero representa una dirección de memoria, el
cual apunta a algún elemento del programa.
Tiene un tipo de dato asociado.
Cuentan con operadores para acceder al valor
referenciado.
Ejemplos en C.
Operador * devuelve el valor de la posición apuntada
Operador & devuelve la dirección de una variable.
El Tipo Referencia admite un nivel de abstracción mayor
dado que trabaja con ellas sin usar operadores de
diferencia.
Paradigma Imperativo
Sistemas de Tipado
El tipo de almacenamiento afecta a la
interpretación de las siguientes operaciones,
entre otras:
Asignación.
Llamada a subrutinas.
Operaciones de comparación.
Paradigma Imperativo
Sistemas de Tipado
Tipos Primitivos
Suelen almacenarse por valor, ocupando espacios fijos en
memoria ya conocidos.
La creación de nuevos valores suele ser implícita por
resultado de operaciones.
Suele existir una jerarquía de subtipos en enteros y
reales, según el rango de valores, signo y precisión.
Algunos lenguajes, como C, representan caracteres y
booleanos mediante enteros.
Algunos lenguajes, como Pascal, limitan las expresiones y
resultados de funciones a tipos primitivos.
Paradigma Imperativo
Sistemas de Tipado
Algunos lenguajes, como Java, dotan a ciertos tipos
estructurales (ej.String) como si fueran primitivos.
Las conversiones entre tipos de datos primitivos suelen
ser implícitas al promocionar el valor a un tipo de dato
más general.
No se pueden convertir en forma explícita referencias o
punteros entre tipos de tamaños diferentes.
Las conversiones entre tipos de datos de menor
capacidad deben ser explícitas, indicando el tipo de
dato a promocionar, normalmente entre paréntesis.
Paradigma Imperativo
Sistemas de Tipado
Tipos Estructurados
Se implementan mediante la composición de vectores (o
arrays) y de registros.
Suelen añadirse otros tipos especializados (string, unions,
conjuntos, etc.) con muchas limitaciones.
El tamaño en memoria está predefinido, al momento de
generación.
Esta permitido la modificación del tamaño (ej.
concatenación de string) generando una nueva zona de
memoria, copiando los valores antiguos.
Las estructuras dinámicas se construyen en base a
variables dinámicas y punteros o referencias.
Paradigma Imperativo
Sistemas de Tipado
Vectores
Son estructuras definidas más por eficiencia que por
utilidad.
Admiten acceso aleatorio a cualquier elemento
(directo, indexado).
Los elementos son del mismo tipo (colecciones
homogéneas).
Comprobación en tiempo de ejecución de acceso con
índice en el rango adecuado.
Registros
Permite agrupar valores de tipos distintos, relacionados
entre sí.
Acceso por identificador único a todos los elementos.
Paradigma Imperativo
Sistemas de Tipado
Existen dos clases de Sistemas de Tipado: