You are on page 1of 13

DOMINIOS DE PROBLEMAS Y PARADIGMAS DE

PROGRAMACIÓN
BASADO EN EL LIBRO DE ARVIND KUMAR INTRODUCTION
TO PROGRAMMING LANGUAGES
ENERO 2018
DOMINIOS DE PROGRAMACIÓN

En la era moderna, los problemas que deben resolver las computadoras se encuentran en
diferentes dominios problemáticos como son :

a) Computación científica,
b) Procesamiento de texto
c) Programación de bases de datos
d) Aplicaciones comerciales
e) Programación de sistemas, automatización de procesos
f) Sistemas inteligentes
g) Aplicaciones basadas en la web
h) Procesamiento en tiempo real.

Todos estos dominios son bastante diferentes entre sí con diferentes requisitos de la
siguiente manera.

Un ejemplo de computación científica es el razonamiento con respecto al universo, donde


hay miles de millones de estrellas. Para encontrar modelos acerca de su interacción entre
ellos y con nuestro sistema solar, tenemos que procesar y analizar los datos de los
telescopios computarizados que obtienen billones de bytes de datos. Otro ejemplo de
computación científica es la simulación y el seguimiento de las condiciones atmosféricas,
como los tornados que causan la devastación en las zonas costeras. Otro ejemplo de
informática científica es el procesamiento, análisis y seguimiento de actividades sísmicas
en la tierra. El procesamiento de datos científicos y el desarrollo de modelos útiles para
resolver problemas científicos requieren la capacidad de asignar y procesar grandes
matrices en la computadora. Los números deben procesarse con precisión. Por ejemplo,
calcular la trayectoria de una nave espacial o un transbordador espacial requiere cálculos
de gran precisión.
Ejemplos de procesamiento de texto son los procesadores de texto y las herramientas de
productividad que utilizamos todos los días para escribir cartas y preparar presentaciones.
Este tipo de problemas requieren la capacidad de representar y procesar gran cantidad de
cadenas, imágenes, tablas, videoclips y otros objetos multimedia de manera eficiente. Si
bien se necesita una gran cantidad de cálculos, la necesidad computacional no es tan
grande como la que se necesita en el dominio de la computación científica. Sin embargo,
requiere más interacción con los humanos y facilidad de uso.

La programación de la base de datos requiere organizar, procesar y buscar grandes


cantidades de datos de una manera lógica para que se pueda acceder a ellos de
inmediato sin duplicaciones innecesarias. Ejemplos de programación de bases de datos
en el mundo en tiempo real son (1) procesar datos de estudiantes en la oficina de un
registrador y (2) deslizar una tarjeta de crédito en una bomba de gasolina. Cuando los
estudiantes caminan en la oficina de registro y proporcionan sus identificaciones de
estudiante, un contador sabría, en una fracción de segundo, información detallada sobre
los pagos del estudiante, la dirección del apartamento y los cursos que se están tomando.

Las aplicaciones empresariales requieren una amplia generación de informes que se


pueden presentar a los clientes y ejecutivos de la división superior de una manera fácil de
usar. Las aplicaciones empresariales requieren capacidades para integrar la
programación de bases de datos con generación de informes fácil de usar. Sin embargo,
una parte del procesamiento de aplicaciones comerciales se puede hacer en modo por
lotes; el procesamiento de tiempo no siempre es necesario.

La programación del sistema requiere la gestión de múltiples procesos que se ejecutan


simultáneamente, proporcionando entornos virtuales para mejorar la productividad de los
programadores e interconectando con programación de bajo nivel para mejorar la
eficiencia de ejecución. La programación del sistema requiere pasar por la memoria de la
computadora, generar excepciones, emitir advertencias si el proceso no funciona bien e
interconectar las llamadas a nivel del usuario con las llamadas al sistema de bajo nivel.
El procesamiento en tiempo real requiere capturar y procesar datos en tiempo real.
Cualquier trabajo de mantenimiento de cuentas no debe ralentizar la captura o el
procesamiento de los datos, de lo contrario, el evento correspondiente en tiempo real
puede pasar desapercibido con resultados catastróficos. Por ejemplo, si una computadora
en una planta nuclear responde lentamente a una condición de sobrecalentamiento,
entonces la planta de energía nuclear puede dañarse. OPC_UA

Si una computadora de abordo en un avión de combate es lenta


para responder, el avión puede ser aniquilado por un misil enemigo. Estos ejemplos
requieren proporcionar un alto nivel de prioridad a las tareas en tiempo real y tomar
decisiones rápidas y en tiempo real para facilitar la captura y el procesamiento de eventos
en tiempo real.
En los últimos años, la programación basada en la web combinada con sistemas
multimedia ha puesto un requisito diferente en los lenguajes de programación. Los
programas deberían poder recuperarse desde sitios web remotos (URL) y ejecutarse en
máquinas locales. Mientras que la recuperación de las máquinas remotas requiere la
conversión de estructuras de datos a cadenas y viceversa, la ejecución eficiente requiere
una traducción eficiente a instrucciones de bajo nivel. Lamentablemente, la traducción y la
ejecución de programas basados en la web se producen simultáneamente, lo que
ralentiza la ejecución de los programas y requiere técnicas de compilación “justo a tiempo”
para acelerar el procesamiento. En el futuro, veremos lenguajes específicos de dominio
para manejar diferentes dominios.
HISTORIA DE LOS PARADIGMAS DE PROGRAMACIÓN

El paradigma de programación significa estilo de programación. A medida que la


programación maduró, los usuarios y los científicos de la computación encontraron
inconvenientes y ventajas en los estilos de programación anteriores y evolucionaron
nuevos estilos de programación. Los idiomas modernos son una combinación de dos o
más paradigmas de programación, como se muestra en el Apéndice I.

Podemos clasificar programas en una combinación de uno o más paradigmas de


programación:

(1) programación imperativa,


(2) programación declarativa,
(3) programación orientada a objetos,
(4) programación concurrente y distribuida,
(5) programación visual
(6) programación basada en la web,
(7) programación basada en eventos,
(8) programación multimedia,
(9) programación basada en agentes,
(10) programación sincrónica.

1.8.1 Paradigma de Programación Imperativo

La base de la programación imperativa es la afirmación o declaración de asignación que


cambia el estado de la máquina de bajo nivel de von Neuman. Un programador traduce
manualmente la lógica explícitamente para decirle a la computadora qué hacer. Una
variable en los programas imperativos se asigna a una ubicación de memoria en una
computadora, y la ubicación de la memoria se puede modificar repetidamente mediante el
uso de instrucciones de asignación. El efecto de la instrucción de asignación es que se
escribe un nuevo valor en la ubicación de la memoria; el viejo valor se pierde La ventaja
de la instrucción de asignación es la reutilización de memoria, ya que la misma ubicación
de memoria se ha utilizado para almacenar múltiples valores. Sin embargo, hay muchas
desventajas de escribir en la ubicación de la memoria varias veces de la siguiente
manera:

1. Si se reescribe una ubicación de memoria, se pierde el valor anterior, lo que imposibilita


el uso del valor anterior en el futuro. En la programación de inteligencia artificial, donde
se busca una solución en un gran espacio de búsqueda, retroceder, y deshacer parte de
la búsqueda y probar rutas de búsqueda alternativas se vuelve imposible.

2. Si un espacio de memoria perteneciente a otro procedimiento o función se escribe


mediante el procedimiento llamado actualmente, entonces se pierde el valor anterior. Si el
procedimiento de llamada o los procedimientos no son conscientes de la modificación o
necesitan usar el valor anterior, la actualización ha dañado la ubicación de la memoria. El
resultado sería generar soluciones incorrectas. Este problema se llama efecto secundario

3. La intercalación de la declaración de asignación con la lógica del programa causa


problemas en la comprensión del programa, ya que el control es muy subjetivo para el
estilo de pensamiento de un programador individual y causa problemas de mantenimiento
del programa a largo plazo. El paradigma de programación imperativa fue el primero
desarrollado en los años 50 y 60 en diferentes versiones de FORTRAN y en la década de
1960 en el desarrollo lenguajes estructurados en bloques como ALGOL.
Entre los paradigmas de programación imperativa, cuatro lenguajes antiguos eran
bastante populares: FORTRAN, ALGOL y COBOL, y C, un descendiente de Algol.

Muchos lenguajes de programación imperativos como ADA, FORTRAN y COBOL


siguieron evolucionando al incorporar construcciones probadas. Las versiones más
nuevas de FORTRAN y COBOL tienen muchas características tales como programación
estructurada en bloque, programación recursiva, implementación basada en pila,
procesamiento de cadenas, punteros, estructuras y programación orientada a objetos.
Con el paso del tiempo, los diseñadores de idiomas identificaron las ventajas y
desventajas de los lenguajes contemporáneos e incorporaron las construcciones útiles.

1.8.2 Paradigma de programación declarativa

En la programación declarativa, el control ha sido eliminado del programa. Hay una


máquina abstracta que se ocupa implícitamente de la parte de control. Un programa
declarativo consiste en lógica + abstracción a nivel de programador. La noción de variable
en los programas declarativos es bastante diferente de la noción de variables en los
lenguajes imperativos. Una variable en el programa declarativo es un titular del valor; una
vez que se ha asignado un valor a una variable, no puede ser alterado por el
programador. La ventaja de la propiedad asignar una vez es:

 Hay menos posibilidad de efectos secundarios, ya que un procedimiento llamado


(o función) no puede reescribir en el espacio de la memoria del procedimiento de
llamada (o función)
 Los valores antiguos de variables pueden ser retenidos y utilizado si es necesario.

También hay muchas desventajas de la propiedad write-once de la siguiente manera:

1. La ubicación de la memoria no puede reutilizarse incluso si no es necesaria, como para


el uso de la variable de índice en un for . El manejo de cálculos iterativos y el
procesamiento de entrada y salida, como la impresión de una gran variedad de elementos
de datos, provoca la explosión de localidades de memoria
2. La programación recursiva se usa con mayor frecuencia, ya que no se permite la
iteración tradicional con variable de índice variable debido a la restricción impuesta a la
mutación variable. La programación recursiva tiene gastos generales de memoria y
ejecución y es más difícil de programar en comparación con la programación iterativa.

3. No se permiten las variables mutables globales que admiten el almacenamiento de


cálculos parciales que pueden ser utilizados posteriormente por otras partes del programa
para mejorar la eficacia de la ejecución. Sin embargo, muchos lenguajes de programación
declarativos han intentado superar esta limitación: Lisp permite la reescritura parcial en la
ubicación de la memoria al permitir el uso limitado de variables globales; y Prolog,
dependiendo de las implementaciones, permite construcciones, como "assert",
"blackboard" o variables mutables globales, para almacenar el resultado de cálculos
parciales.

Aquí hay dos tipos principales de lenguajes de programación declarativos: lenguajes de


programación funcionales y lenguajes de programación lógica. Los lenguajes de
programación funcional se basan en el uso de funciones matemáticas, y los lenguajes de
programación lógica se basan en el uso de la lógica de predicados: lógica booleana
combinada con la noción de cuantificación.

Los lenguajes de programación declarativos se han usado tradicionalmente en inteligencia


artificial. Las características clave de los lenguajes declarativos necesarios en inteligencia
artificial son las siguientes:

1. Los sistemas de inteligencia artificial necesitan desarrollar dinámicamente y actualizar


el conocimiento. Los lenguajes de IA admiten abstracciones para incorporar el
conocimiento.

2. La mayoría de los lenguajes declarativos tratan el programa como un objeto de primera


clase(u orden como se conoce en lógica de predicados) , lo que significa que los
programas se pueden construir en tiempo de ejecución, a medida que los datos se
transforman en un programa que se puede ejecutar. La inteligencia artificial necesita esta
propiedad para compilar nuevos conocimientos.

1.8.3 Paradigma de Programación Orientada a Objetos

A medida que el tamaño de la memoria de las computadoras se incrementó, la ejecución


de programas grandes se hizo posible. SIMULA fue el primer lenguaje orientado a objetos
en la década de 1960. Sin embargo, la noción de programación orientada a objetos
alcanzó a la comunidad de desarrollo de software a principios de los años ochenta. A
medida que crecía el tamaño del programa, las personas comenzaron a darse cuenta del
valor de la modularidad y la reutilización de software para desarrollar software aún más
complejo.

Muchos conceptos importantes relacionados entre sí, como la modularidad, la reutilización


de software, la biblioteca disponible en el mercado y el ocultamiento de la información se
concibieron para facilitar el desarrollo, el mantenimiento y la evolución del software. La
modularidad significa dividir los programas de software grandes en un conjunto de
módulos interconectados, de modo que cada uno de ellos tenga una funcionalidad clara
que no se superponga con la funcionalidad de otros módulos.

1.8.4 Paradigma de programación concurrente

Durante la década de 1980, cuando el software comenzó a crecer, la tecnología de


hardware también estaba cambiando muy rápido. Múltiples procesadores rápidos estaban
disponibles en una sola computadora, y el desarrollo de las redes informáticas permitía el
intercambio de información entre múltiples computadoras.

Sobre la base de este nuevo avance, las subtareas independientes podrían mapearse en
procesadores separados para mejorar la eficiencia de ejecución de los programas. El
desarrollo tomó dos direcciones:

1) Paralelizar compiladores que podrían tomar un programa secuencial como entrada, y


transformarlo automáticamente a una versión paralela para ejecutar al mismo tiempo

(2) incorporando construcciones de programa de alto nivel como threads, forking, busy-
wait-loop y llamadas de procedimiento remoto (RPC) en los idiomas existentes. En todos
estos constructos, un proceso, la parte activa de un programa que se ejecuta en una
CPU, podría iniciar una o más subtareas simultáneas para mejorar la eficacia de la
ejecución.

1.8.5 Paradigma de Programación Visual

El paradigma de programación textual usa una dimensión. Sin embargo, nosotros, los
humanos, somos muy buenos para percibir la noción de proximidad en lugar de solo la
programación secuencial unidimensional. La mayoría de los lenguajes de programación
desarrollados son textuales y adolecen de esta limitación de secuencialidad causada por
la dimensión única presente en la representación textual de los programas.

A finales de la década de 1980, a partir de un trabajo anterior en Smalltalk para


proporcionar interfaces fáciles de usar, el paradigma de programación visual tomó
múltiples direcciones. Algunas sugerencias fueron para liberar los lenguajes de
programación utilizando la representación simbólica para diferentes abstracciones de
datos y abstracciones de control en la programación de bajo nivel.

Sin embargo, el esfuerzo para incorporar la programación visual se limitó a la


programación de arrastrar y soltar para proporcionar interfaces y animaciones fáciles de
usar. Más recientemente, la programación visual se ha utilizado en lenguajes como C#
para la programación basada en eventos: los símbolos correspondientes a eventos y
atributos de objetos se arrastran y sueltan para crear un escenario complejo de objetos
que interactúan. En el nivel bajo, estos eventos y objetos que interactúan se traducen
automáticamente a la versión de texto de bajo nivel del idioma. De manera similar, los
lenguajes de educación visual como Alice usan programación visual para desarrollar
código para animación, y lenguajes como SMIL, VRML y Java3D usan programación
visual para presentación y animación a pedido basada en web multimedia.

1.8.6 Paradigma de Programación Multimedia

El paradigma de programación multimedia significa integración de múltiples modos de


visualización: texto, imágenes, audio, video y gestos. Los humanos interactúan entre ellos
usando todas estas señales. Sin estas señales, nuestras comunicaciones con los demás y
nuestra percepción de los objetos y los fenómenos del mundo real serían incompletos. A
principios de la década de 1990, con el avance de la programación basada en la web y el
desarrollo de formatos completos para audio, imágenes y video, se hizo posible insertar
objetos multimedia y videoclips en programas de visualización y percepción humana.
El video puede ser representado por una secuencia de fotogramas donde cada fotograma
es un conjunto de posibles objetos que interactúan. Hay idiomas, como Alicia y Lenguaje
de marcado de realidad virtual (VRML), que crean objetos y movimiento animados en 3D
para modelar la realidad virtual. En los últimos años, se han desarrollado muchos
lenguajes de modelado 3D como X3D y Java3D que integran computación y modelado 3D
para la animación en tiempo real a través de Internet.

1.8.7 Paradigma de programación basado en la web

El advenimiento de Internet a principios de 1990 nos brindó una enorme capacidad para
compartir sitios web remotos ubicados en códigos de datos, imágenes, audiovisuales,
bases de datos y códigos móviles. También nos ha proporcionado la capacidad de código
y movilidad de datos. Si un recurso remoto no desea compartir el código, puede calcular
los datos en la fuente y transmitir los datos resultantes. Por otro lado, si el servidor no
desea sobrecargarse, envía el código al cliente para realizar el cálculo al final del cliente.
La programación basada en la web se ha convertido en un gran motor para la
visualización multimedia y ha tenido un gran impacto en la informática financiera, como
los mercados bursátiles y la banca. Hay muchos lenguajes basados en Internet, como
Java y SMIL, y lenguajes de desarrollo web como PHP, Javascript y XML. XML se ha
convertido en un lenguaje intermedio popular para representar bases de datos, cálculos y
animaciones a través de Internet. Java tiene una popular máquina abstracta de nivel
intermedio llamada JVM.

Una máquina de dirección cero no usa un registro o una dirección de memoria en la


instrucción. Más bien es una máquina basada en pila, donde los operandos se colocan en
una pila de evaluación, se abren, se evalúan y se vuelven a colocar en la pila. La razón
para tener una máquina con dirección cero era que Java se diseñó para implementarse en
cualquier computadora incorporada en dispositivos modernos de uso cotidiano, como
microondas, hogares inteligentes y refrigeradores. Una máquina con cero direcciones es
la máquina abstracta más común que se puede ejecutar en todas estas computadoras
integradas.
PARADIGMAS IMPLEMENTADOS EN LENGUAJES

You might also like