Está en la página 1de 92

Paradigma

Imperativo
Paradigma Imperativo
Conceptos básicos

 Uno de los paradigmas más representativos en la


programación.
 Describe cómo debe realizarse el cálculo, no el porqué.
 La programación en este paradigma consiste en :
 determinar los datos requeridos
 asociarle direcciones de memoria
 determinar secuencia de transformaciones necesarias
 lograr el estado final esperado
Paradigma Imperativo
Conceptos básicos
 Variables:
celdas de memoria con datos que pueden ser
modificadas y representan el estado del programa.
 La sentencia principal es la asignación.
 Apareció en los años 50, junto con los primeros
lenguajes de programación.
 Basado en el modelo de cómputo de la máquina de
Turing.
 Losprocesadores siguen dicha versión de cómputo y l
arquitectura John Von Neumman.
Paradigma Imperativo

 Esquema de John Von Neumman


 Memoria
 Unidad Central de Procesamiento
Paradigma Imperativo
Programación Imperativa
 Describe la programación en términos del estado de
los datos y sentencias que cambian dicho estado.
 Los programas imperativos son un conjunto de
instrucciones para indicar al procesador cómo
realizar una tarea.
 La implementación de hardware de la mayoría de
computadores es imperativa.
 Esto se debe a que el hardware de los computadores
implementa el paradigma de las Máquinas de Turing.
Paradigma Imperativo
Programación Imperativa
 Pueden resolver prácticamente cualquier problema
en cualquier área, desde cálculos simples a
complejos cálculos matemáticos.
 Basados en la implementación de procedimientos.
 Por tratarse del primer paradigma, marcó el orden
de hacer los programa y su filosofía, la forma de
implementar la solución a problemas de la vida
cotidiana.
Paradigma Imperativo
Programación Imperativa

 Basada en tres grandes conceptos:


 Celdas de memoria.
 Asignación.
 Repetición.
Paradigma Imperativo
Programación Imperativa
 Tipos de Programación Imperativa
 Programación estructurada
 Basada en la necesidad de que los programas sean correctos,
modulares y mantenibles.
 Lenguajes: Pascal, ALGOL 68, Ada.
 Programación procedural
 Uso de procedimientos, subrutinas y funciones para el
desarrollo de los cambios de estado.
 Los procedimientos especifican parámetros y valores
devueltos.
 Lenguajes: ALGOL.
Paradigma Imperativo
Programación Imperativa
 Ventajas:
 Relativa simplicidad y facilidad para la
implementación de compiladores e interpretes.
 La capacidad de reutilización del mismo código
en diferentes lugares.
 Una forma fácil de seguir el flujo del programa.
 La capacidad de ser muy modular o
estructurado.
 Necesita menos memoria.
Paradigma Imperativo
Programación Imperativa

 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);

EBCDIC ARRAY A [0:11];


REPLACE A BY "HOLA MUNDO!";

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

 Según su Nivel de Abstracción o grado de cercanía al


procesador:
 Alto Nivel. Más parecidos al lenguaje humano. Manejan
conceptos, tipos de datos, etc., de una manera
cercana al pensamiento humano abstrayéndose del
funcionamiento de la máquina. Totalmente portables.
Independientes de las características del procesador.
Ejemplos: Java, Ruby.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según el Propósito o tipo de problema a tratar:
 Propósito General. Aptos para todo tipo de tareas: Ejemplo: C.
 Propósito Específico: Hechos para un objetivo muy concreto.
Ejemplo: SIMULA o GPSS (para desarrollo de simulaciones).
 Programación de Sistemas. Diseñados para realizar sistemas
operativos o drivers. Ejemplo: C.
 Para Scripting. Para realizar tareas varias de control y auxiliares.
Antiguamente eran los llamados lenguajes de procesamiento por
lotes (batch) o JCL (“Job Control Languages”). Se subdividen en
varias clases (de shell, de GUI, de programación web, etc.).
Ejemplos: bash (shell), JavaScript (programación web).
Paradigma Imperativo
Clasificación de los Lenguajes
 Según la Evolución Histórica o por Generaciones:
 Primera Generación (1GL): Código o Lenguaje de máquina
(el único que interpreta el procesador, formado por
alfabeto binario, respondiendo a los impulsos digitales).
 Segunda Generación (2GL): Lenguaje ensamblador y
algunos lenguajes no estructurados. Ejemplos: ForTran,
Basic.
 Tercera Generación (3GL): La mayoría de los lenguajes
modernos, diseñados para facilitar la programación a los
humanos. Ejemplos: C, Java.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según la Evolución Histórica o por Generaciones :
 Cuarta Generación (4GL): Diseñados con un propósito
concreto, como los generadores de reportes, de pantallas
gráficas hasta de aplicaciones. Lenguajes para acceder a
base de datos, orientados a objetos. Ejemplos: PL-SQL,
NATURAL, PowerBuilder
 Quinta Generación (5GL): La intención es que el
programador establezca el problema que debe ser
resuelto y las condiciones a reunir, y la máquina lo
resuelve. Se usan en inteligencia artificial. Emplean la
programación con restricciones para resolver problemas,
en lugar de emplear algoritmos. Ejemplo: Prolog.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según la Forma de Ejecución:
 Compilados. Un programa traductor traduce el código del
programa (código fuente) en código máquina (código objeto).
Otro programa, el enlazador, unirá éstos ficheros con los de
las librerías necesarias para producir el programa ejecutable.
Ejemplo: C.
 Interpretado. Un programa (intérprete), ejecuta las
instrucciones del programa de manera directa. Ejemplo: Lisp.
 Mixtos. Pasan por una fase de compilación en la que el código
fuente se transforma en “bytecode”, para ser ejecutado
(interpretado) en ordenadores con distintas arquitecturas que
tengan instalado el intérprete. Ejemplo: Java
Paradigma Imperativo
Clasificación de los Lenguajes
 Según la Forma de Desarrollar la Tarea:
 Lenguajes Imperativos: Indican cómo hay que hacer la
tarea, es decir, expresan los pasos a realizar. Ejemplo: C.
 Lenguajes Declarativos: Indican qué hay que hacer.
Ejemplos: Lisp, Prolog. Otros ejemplos de lenguajes
declarativos, pero que no son lenguajes de programación,
son HTML (para describir páginas web) o SQL (para
consultar bases de datos).
Paradigma Imperativo
Clasificación de los Lenguajes
 Según el Paradigma de Programación, es decir, según el estilo
empleado:
 Lenguajes de Programación Procedural. Divide el problema
en partes más pequeñas, que serán realizadas por
subprogramas (subrutinas, funciones, procedimientos), que
se llaman unas a otras para ser ejecutadas. Ejemplos: C,
Pascal.
 Lenguajes de Programación Orientada a Objetos. Crean un
sistema de clases y objetos siguiendo el ejemplo del mundo
real, en el que unos objetos realizan acciones y se
comunican con otros objetos. Ejemplos: C++, Java.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según el Paradigma de Programación, es decir, según el
estilo empleado:
 Lenguajes de Programación Funcional. La tarea se realiza
evaluando funciones, como en matemáticas, de manera
recursiva. Ejemplo: Lisp, Haskell.
 Lenguajes de Programación Lógica. La tarea a realizar se
expresa empleando lógica formal matemática. Ejemplo:
Prolog.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según el Lugar de Ejecución. Para sistemas distribuidos, según dónde
se ejecute:
 Lenguajes de Servidor. Se ejecutan en el servidor. Ejemplo: ASP,
PHP es el más utilizado en servidores web.
 Lenguajes de Cliente. Se ejecutan en el cliente. Ejemplo:
JavaScript en navegadores web.
 Según la Concurrencia, si admiten o no procesamiento en paralelo.
 Lenguajes Concurrentes. Admiten concurrencia o paralelismo.
Ejemplo: Lisp, Java.
 Lenguajes No concurrentes. No admiten concurrencia. Ejemplo: C
Paradigma Imperativo
Clasificación de los Lenguajes
 Según la Interactividad del programa con el usuario u otros
programas:
 Lenguajes Orientados a Sucesos: El flujo del programa es
controlado por la interacción con el usuario o por mensajes de
otros programas/sistema operativo, como editores de texto,
interfaces gráficos de usuario (GUI) o kernels. Ejemplo: Visual
Basic, lenguajes declarativos.
 Lenguajes No Orientados a Sucesos: El flujo del programa no
depende de sucesos exteriores, sino que se conoce de
antemano, siendo los procesos batch el ejemplo más claro
(actualizaciones de bases de datos, colas de impresión de
documentos, etc.). Ejemplos: Lenguajes imperativos de
consola.
Paradigma Imperativo
Clasificación de los Lenguajes
 Según el Determinismo, es decir, predecir o no el
siguiente estado:
 Lenguajes Deterministas. Ejemplos: Todos los
anteriores.
 Lenguajes Probabilísticos o No Deterministas. Sirven
para explorar grandes espacios de búsqueda, (como
gramáticas), y en la investigación teórica de
hipercomputación. Ejemplo: mutt (generador de texto
aleatorio).
Paradigma Imperativo
Traductores
 Un traductor es un programa que recibe como
entrada código escrito en un cierto lenguaje y
produce como salida código en otro lenguaje.
Paradigma Imperativo
Traductores
 En general, los programas traductores de lenguajes de
programación traducen programas escritos en lenguaje
de alto nivel en otro programa, llamado objeto, en
código o lenguaje de máquina.
 Existen cuatro tipos de traductores diferentes:
 Ensambladores.
 PreProcesadores.
 Compiladores.
 Intérpretes.
Paradigma Imperativo
Traductores - Ensambladores
 Eltérmino ensamblador (del inglés assembler) es un
programa que traduce un fichero o programa fuente
escrito en un lenguaje ensamblador, a un fichero objeto
que contiene código de máquina.
 Sustituyecada uno de los códigos mnemotécnicos por su
código de operación correspondiente en sistema binario.
 Facilita la escritura de programas.
 Solousado en la actualidad, cuando se requiere control
directo de dispositivos de hardware.
Paradigma Imperativo
Traductores - Preprocesador
 Programa que manipula el texto de un archivo de
código fuente como parte inicial o primera fase de
traducción.
 No analiza el texto original, sino que lo divide en
pequeñas partes con el fin de buscar llamadas a
macros.
 Aunque el compilador invoca normalmente el
preprocesador en el primer paso, también puede ser
invocado por separado para procesar el texto sin
compilación.
 Puede eliminar comentarios, incluir otros archivos y
ejecutar sustituciones de macros.
Paradigma Imperativo
Traductores - Preprocesador
 Traduce un lenguaje de alto nivel a otro, cuando el
primero no puede pasar a lenguaje máquina.
 Ejemplos.
Directivas #include o #define en lenguaje C
Paradigma Imperativo
Traductores - Compiladores
 Programa que traduce un programa escrito en
un lenguaje de programación de alto nivel a otro
lenguaje de programación de nivel inferior, generando
un programa equivalente (programa objeto), que la
máquina es capaz de interpretar.
 Usualmente el segundo lenguaje es lenguaje de
máquina, pero también puede ser un código intermedio.
Paradigma Imperativo
Traductores - Compiladores
 Dado que los compiladores traducen código fuente a
código objeto (único para cada CPU) existen
múltiples compiladores para un mismo lenguaje.
 El compilador traduce sentencia a sentencia el
programa fuente.
Ejemplos de algunos lenguajes compilados
ADA Cobol
ALGOL Delphi
C Fortran
C++ Pascal
Paradigma Imperativo
Traductores - Compiladores
 Etapas del proceso de compilación:
Edición. Consiste en escribir el programa empleando
algún lenguaje y un editor. Como resultado nos dará el
código fuente de nuestro programa.

Compilación. Traduce el código fuente a código


máquina. Si no se produce ningún error se obtiene el
código objeto. En caso de error, se visualizan los
mismos para corregirlos y proceder a su compilación
nuevamente. Los ficheros objetoS poseen información
tanto del código máquina como a la tabla de símbolos.
Paradigma Imperativo
Traductores - Compiladores
 Linkado (o linqueado) o Enlace. Consiste en unir el
archivo objeto generado con determinadas rutinas
internas del lenguaje, obteniendo el programa
ejecutable.
Existen dos tipos de linqueados o enlaces:
 Estático: los códigos binarios de las librerías se
añaden a nuestros códigos binarios compilados
generando el archivo ejecutable.
 Dinámico: no se añaden las librerías a nuestro
binario sino que hará que se carguen en memoria
las librerías, en el momento, que se necesiten.
Paradigma Imperativo
Traductores - Compiladores
.
Compilación

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.

Back End: es la parte que genera el código


máquina, específico de una plataforma, a partir
de los resultados de la fase anterior.
Paradigma Imperativo
Traductores - Compiladores
Partes de un compilador:
 Esta división permite que el mismo Back End se
utilice para generar el código máquina de varios
lenguajes distintos y que el mismo Front End que
sirve para analizar el código fuente de un lenguaje
de programación concreto sirva para la generación
de código de máquina en varias plataformas
distintas.
 El código que genera el Back End normalmente no
se puede ejecutar directamente, sino que necesita
ser enlazado por un programa enlazador.
Paradigma Imperativo
Traductores - Compiladores
 Tipos de compiladores:
 Compiladores cruzados: generan código para un sistema distinto del
que están funcionando.
 Compiladores optimizadores: realizan cambios en el código para
mejorar su eficiencia, pero manteniendo la funcionalidad del
programa original.
 Compiladores de una sola pasada: generan el código máquina a
partir de una única lectura del código fuente.
 Compiladores de varias pasadas: necesitan leer el código fuente
varias veces antes de poder producir el código máquina.
 Compiladores JIT (Just In Time): forman parte de un intérprete y
compilan partes del código según se necesitan.
Paradigma Imperativo
Traductores - Compiladores

                                               
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

 Intérpretes Incrementales. Existen ciertos


lenguajes que, por sus características, no se
pueden compilar directamente por manejar
objetos o funciones que no son conocidos en
tiempo de compilación, dado que se crean
dinámicamente en tiempo en ejecución.
Entre estos lenguajes, pueden considerarse
Smalltalk, Lisp o Prolog.
Paradigma Imperativo
Traductores - Intérpretes

Para obtener una mayor eficiencia, se diseñan


compiladores incrementales. La idea es compilar
aquellas partes estáticas del programa,
marcando como dinámicas las que no puedan
compilarse. En tiempo de ejecución, se podrá
compilar algunas partes dinámicas o recompilar
partes dinámicas que hayan sido modificadas
Paradigma Imperativo
Traductores - Intérpretes
 Ventajas:
 Fácil depuración. Mayor interacción con el código
en tiempo de desarrollo.
 En algunos lenguajes (Smalltalk, Prolog, LISP) está
permitido y es frecuente añadir código según se
ejecuta otro código.
 Puede ser interrumpido con facilidad, modificado y
ejecutado nuevamente.
 Requiere menos memoria que un compilador.
 Facilita la búsqueda de errores.
Paradigma Imperativo
Traductores - Intérpretes
 Desventajas:
 Lentitud de ejecución, ya que al ejecutar a la vez
que se traduce no puede aplicarse un alto grado de
optimización.
 Cada instrucción debe ser traducida a código
máquina tantas veces como sea ejecutada
 Durante la ejecución, el intérprete debe residir en
memoria ya que no genera código objeto.
Paradigma Imperativo
Traductores - Compiladores
Ejemplos de lenguajes interpretados
ASP QBASIC Scripting
BASIC Prolog SmallTack
Logo Ruby Shell

Ejemplos de lenguajes mixtos


Java Python
Perl Visual FoxPro
PHP .NET
Paradigma Imperativo
Traductores - Diferencias
 Un intérprete traduce instrucciones de alto nivel en una forma
intermedia para ser ejecutado. En contraste, un compilador,
traduce instrucciones de alto nivel directamente en lenguaje de
máquina.
 El intérprete traduce un programa línea a línea mientras que el
compilador traduce el programa entero y luego lo ejecuta.
 El intérprete detecta si el programa tiene errores y permite su
depuración durante el proceso de ejecución, mientras que el
compilador espera hasta terminar la compilación de todo el
programa para generar un informe de errores.
 Ambos, intérpretes y compiladores están disponibles en la
mayoría de los lenguajes de alto nivel.
Programación Procedural
Concepto
 Indica un modelo de organización de
programas: colecciones de funciones,
subrutinas o procedimientos relacionadas
con invocaciones entre ellas.

 Propiedades de las rutinas:


 Encapsulamiento
 Independencia
 Interfaz
Programación Procedural
Subrutinas
 Ámbito: espacio exclusivo en memoria para el
almacenamiento de variables y parámetros.
 Se crea al invocar a la rutina y se destruye al
finalizar su ejecución.
 Enmascaramiento de variables y parámetros
cuando estos coinciden con identificadores
globales a ella.
 Subrutina reentrante. Al ser invocada sin
necesidad que haya finalizado su invocación
anterior (recursividad, concurrencia).
 Estructuración: tienen un único punto de entrada, sin
invocaciones de sentencia GOTO.
Programación Procedural
Parámetros
 Parámetro Formal: Representa un parámetro,
declarado en el encabezado de la misma.
 Argumento. El valor concreto del parámetro con que se
llama a una subrutina.
 Paso por valor. El parámetro formal es una variable
local de la subrutina.
 Paso por referencia. El parámetro formal es una
variable local que almacena una referencia al
argumento.
 Paso por variable. El parámetro formal es un
identificador con el que se renombra la variable que
se usa como argumento.
Programación Procedural
Parámetros
 Parámetros de Entrada-Salida: algunos lenguajes
(ADA, Delphi) permiten indicar la semántica del
parámetro, ocultando el mecanismo concreto:
 Parámetro de entrada (in). El parámetro es una
variable interna local, accesible pero no asignable.
 Parámetro de salida (out). El parámetro representa
una variable externa, asignable pero no accesible.
 Parámetro de entrada-salida (in out). El parámetro
es una variable externa, asignable y accesible.
Programación Procedural
Parámetros

 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.

 Parámetros múltiples (indeterminados): admitido


por ciertos lenguajes en el uso de subrutinas donde
se desconoce la exactitud de los argumentos (varargs
para Java, representado por “…”, params en C#).
Debe ser el último parámetro declarado al ser
combinado con otros parámetros.
Paradigma Imperativo
Módulos
 Agrupamiento de subrutinas y tipos de datos
relacionadas entre sí (Ejemplos: Package en
JAVA, Unidades en Delphi).

 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:

 Tipado Estático: la comprobación de tipos se


realiza en tiempo de compilación:
 La mayoría de errores de tipado se detectan por
el compilador.
 Es necesario declarar el tipo de las variables.
 Habitualmente asociado con valores literales y
variables de tipo prefijado.
Paradigma Imperativo
Sistemas de Tipado
 Tipado Dinámico: la comprobación de tipos se
realiza en tiempo de ejecución.
 No es necesario declarar el tipo de las
variables y normalmente, su tipo puede
cambiar (tipo de dato inferido).
 Asociado con valores dinámicos.
 Mayor dificultad para corregir un error, dado
que se deben recorrer todos los caminos para
encontrar el origen.
Paradigma Imperativo
Sistemas de Tipado
 Según la fortaleza, los Sistemas de Tipado pueden ser:
Fuertes o Débiles.
 La fortaleza está relacionada con la permisividad que el
lenguaje manifiesta respecto a la conversión de valores de
distintos tipos.
 Elementos a considerar:
 Jerarquía de subtipos del lenguaje.
 Ocurrencia de conversiones automáticas (implícitas).
 Ámbito de aplicación de las conversiones explícitas
(downcasting).
 Posibilidad de conversiones que afecten al tipo subyacente
de punteros.
 El tipado estático suele ser fuerte y el dinámico, débil.
Paradigma Imperativo
Sistemas de Tipado
 Según la seguridad, pueden ser: Seguros o Inseguros.
 Un lenguaje se considera seguro si no permite operaciones o
conversiones de tipos que puedan generar errores o estados no
definidos.
 Relacionado con la posibilidad de acceso fuera de rango de
memoria:
 Comprobación de índices en vectores.
 Acceso a elementos dinámicos que no existen.
 Conversión a tipos de datos más amplios.
 Relacionado con la seguridad de las operaciones aritméticas:
 Pérdida de precisión.
 Detección de sobrepasamiento.
Paradigma Imperativo
Diagramas de Flujo
 Es la representación gráfica de los pasos que deben
seguirse para resolver un problema.
 El traducir una descripción narrada en diagrama de
flujo agrega claridad y precisión a las tareas.
 Suelen detectarse situaciones no consideradas.
 Utiliza figuras geométricas normalizadas por el
Instituto Norteamericano de Normalización (ANSI)
conectadas por líneas.
 Cada figura geométrica representa una etapa de la
solución del problema (sentencia).
 Las líneas indican el flujo de la información,
representado por el sentido de las fechas.
Paradigma Imperativo
Diagramas de Flujo
 Simbología o Figuras Geométricas normalizadas:
Paradigma Imperativo
Diagramas de Flujo
 Ejemplos de Diagramas Estructurados y No Estructurados:
Paradigma Imperativo
Pseudocódigo
 El lenguaje de pseudocodificación o
pseudoprogramación es una imitación de los
lenguajes de programación.
 Los algoritmos se describen en un lenguaje
semejante al usado por el computador.
 Utiliza las mismas palabras que los lenguajes
naturales, llamadas palabras claves junto con
algunos símbolos privilegiados.
 No tiene reglas escritas que determinan la validez
del pseudocódigo.
Paradigma Imperativo
Pseudocódigo
 Generado a partir de los dos grandes
inconvenientes de los diagramas:
 Lentitud para su creación
 Dificultad ante alguna modificación

 El pseudocódigo a utilizar debe contener:


 Nombre del Programa
 Declaración y asignación de variables
 Algoritmo

También podría gustarte