Diferencia entre revisiones de «Programación Imperativa»

m (Texto reemplazado: «<div align="justify">» por «»)
 
(No se muestran 14 ediciones intermedias de 7 usuarios)
Línea 1: Línea 1:
{{Objeto|nombre=Programación Imperativa|imagen=Codigo.jpg|descripcion=pasos, instrucciones u ordenes que se le escriben a la computadora}}'''Programación Imperativa.''' Es una ciencia de la [[computación]] llamada lenguajes imperativos a aquellos en los cuales se le ordena a la [[computadora]] cómo realizar una tarea siguiendo una serie de pasos o instrucciones.  
+
{{Objeto
 +
|nombre=Programación Concurrente en CSharp
 +
|imagen=Proc.JPG
 +
|descripcion=conjunto de [[técnica]]s y notaciones que sirven para expresar el [[paralelismo]] potencial en los programas
 +
}}
 +
'''Programación Imperativa.''' Se entiende por [[programación]] [[concurrente]] el conjunto de [[técnicas]] y notaciones que sirven para expresar el [[paralelismo]] [[potencial]] en los programas, así como resolver problemas de [[comunicación]] y [[sincronización]].
  
== Paradigma de programación imperativa ==
+
Un [[proceso]] es un programa en ejecución con un estado asociado. Las distintas [[aplicaciones]] que se ejecutan en un [[sistema operativo]] [[multitarea]] son procesos independientes. Cada una de ellas tiene asociado un contexto (prioridad, estado del [[procesador]], lista de interrupciones y señales que admite, páginas de [[memoria]] que ocupa, etc.).
  
El paradigma de programación imperativa es el paradigma de programación más utilizado. Surgió con los primeros ordenadores sobre los años [[1940]] reflejando las características de la arquitectura Von Newman de la mayoría de ordenadores: el ordenador dispone de una memoria para almacenar las instrucciones de los programas (the program store) y los datos (the data store). La [[programación]] imperativa, en contraposición a la programación declarativa es un paradigma de programación que describe la programación en términos del estado del programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea.  
+
Una aplicación concurrente está formada por un conjunto de procesos concurrentes. En ella existen distintas hebras de control independientes, vías simultáneas de ejecución. Dichas hebras de control pueden ser [[procesos independientes]] en el [[sistema operativo]] o hebras dentro de un [[proceso]]. Una [[aplicación multihebra]] está constituida por distintas hebras que comparten el espacio de un [[proceso]] en el [[sistema operativo]].
  
La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing.  
+
== Consideraciones ==
 +
Cada hebra/proceso supone una carga adicional para el [[sistema]].
 +
* El [[diseño]] de [[aplicaciones concurrentes]] es complejo, ya que hemos de garantizar la independencia de las hebras/procesos y la [[integridad]] de los datos con los que trabajan simultáneamente.
 +
* La [[depuración]] de las [[aplicaciones concurrentes]] es difícil, dado que la ejecución de los distintos procesos/hebras se realiza de forma atómica.
 +
* [[Hebras]] y procesos han de coordinarse de algún modo, para lo cual hemos de emplear mecanismos de [[comunicación]] y [[sincronización]] que permitan coordinar la ejecución de las distintas hebras/procesos.
  
Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma.  
+
== ¿Por qué usar hebras y procesos? ==
 +
El uso de [[paralelismo]] (múltiples procesos y hebras, en particular) proporciona una serie de ventajas frente a las limitaciones de los [[sistemas monotarea]].
 +
===Ejemplo===
 +
*Aprovechamiento de los recursos del [[sistema]].
 +
*Establecimiento de prioridades.
 +
*[[Multiprocesamiento]] real.
  
Los primeros lenguajes imperativos fueron los lenguajes de máquina de los computadores originales. En estos lenguajes, las instrucciones fueron muy simples, lo cual hizo la implementación de [[Hardware|hardware]] fácil, pero obstruyendo la creación de programas complejos.  
+
== Estructuración, Paralelismo implícito ==
 +
'''Importante''': El objetivo principal del uso de [[paralelismo]] es mejorar el rendimiento del [[sistema]]. El diseñador/programador deberá decidir hasta qué punto debe utilizarse en cada momento.
 +
*Ejecución de procesos.
 +
*Finalización de procesos.
 +
*[[Monitorización]] de procesos.
 +
*Operaciones de E/S
  
[]Fortran]], cuyo desarrollo fue iniciado en 1954 por John Backus en [[IBM|IBM]], fue el primer gran lenguaje de programación en superar los obstáculos presentados por el código de máquina en la creación de programas complejos.
+
=== Ejecución de procesos ===
 
+
La clase System.Diagnostics.Process permite crear y monitorizar procesos (accediendo a la [[información]] que se visualiza en el Administrador de Tareas de Windows). El método Process.Start() equivale a la llamada ShellExecute del API de Windows (Win32) y es el que deberemos utilizar para lanzar un [[proceso]]. Los parámetros del [[proceso]] se especifican mediante un objeto de la clase ProcessStartInfo. Al encapsular una llamada al shell de Windows, el método Start también podemos usarlo para abrir un [[Archivo (Informática)|fichero]] de cualquier tipo de los que tengan acciones asociadas en el registro de Windows.
== Ejemplo de Lenguajes imperativos ==
 
 
 
Algunos lenguajes imperativos: [[ASP]], [[BASIC]], [[C]], [[C++]], Fortran, [[Pascal]], [[Perl]], [[PHP]] y Lua. John Backus fue un informático estadounidense, ganador del Premio Turing en 1977 por sus trabajos en sistemas de programación de alto nivel, en especial por su trabajo con FORTRAN. Para evitar las dificultades de programación de las calculadoras de su época, en [[1954]] Backus se encargó de la dirección de un proyecto de investigación en IBM para el proyecto y realización de un lenguaje de programación más cercano a la notación matemática normal. <br> De ese proyecto surgió el lenguaje FORTRAN, el primero de los lenguajes de programación de alto nivel que tuvo un gran impacto, incluso comercial, en la emergente comunidad informática. Tras la realización de FORTRAN, Backus fue un miembro muy activo del comité internacional que se encargó del proyecto de lenguaje ALGOL. En ese contexto propuso una notación para la representación de las gramáticas usadas en la definición de un lenguaje de programación (las llamadas gramáticas libres de contexto). Tal notación se conoce como BNF, o Forma de Naur y Backus (Backus-Naur Form) y une al nombre de Backus al de Peter Naur, un informático europeo del comité ALGOL que contribuyó a su definición.
 
 
 
== Lenguaje FP ==
 
 
 
En los años [[1970]], Backus se interesó sobre todo por la Programación funcional, y proyectó el lenguaje de programación FP, descrito en el texto que le sirvió para ganar el premio Turing, "Can Programming be Liberated from the Von Neumann Style?" Se trata de un lenguaje de uso fundamentalmente académico, que sin embargo animó un gran número de investigaciones. El proyecto FP, transformado en FL, se terminó cuando Backus se jubiló en IBM, en 1991. <br> John Backus falleció el sábado [[17 de marzo]] de [[2007]], a la edad de 82 años en su casa en Ashland, Oregón por causas naturales, de acuerdo la declaración de su familia.
 
 
 
=== Características: ===
 
 
 
*Celdas de memoria: El principal componente de la arquitectura es la memoria, compuesta por un gran número de celdas que contienen los datos.
 
*Asignación: Estrechamente ligado a la arquitectura de memoria se encuentra la idea de que cada valor calculado debe ser almacenado, o sea, asignado, en una variable. Estas asignaciones se realizan repetitivamente sobre la misma celda de memoria, remplazando los valores anteriores.  
 
*Algoritmos: Un programa imperativo, normalmente realiza su tarea ejecutando repetidamente una secuencia de pasos elementales, ya que en este modelo computacional la única forma de ejecutar algo complejo es repitiendo una secuencia de instrucciones. La programación requiere la construcción de "algoritmos", a modo de receta, método, técnica, procedimiento o rutina, que se definen como conjuntos finito de sentencias, ordenadas de acuerdo a sus correspondientes estructuras de control, que marcan el flujo de ejecución de operaciones para resolver un problema específico.
 
*Programación estructurada: La programación estructurada surge como un conjunto de técnicas para facilitar el desarrollo de sistemas en lenguajes del paradigma imperativo, pero presenta ideas que también fueron tenidas en cuenta en lenguajes de otros paradigmas.
 
*Estructuras básicas de control: La base teórica de la programación estructurada plantea que cualquier programa, por más grande y complejo que fuera, puede representarse mediante tres tipos de estructuras de control: secuencia, selección e iteración.
 
 
 
== Lenguajes que soportan este paradigma ==
 
 
 
=== BASIC ===
 
 
 
El lenguaje BASIC fue inventado en 1964 por John George Kemeny (1926-1993) y Thomas Eugene Kurtz (1928- ) en el Dartmouth College. <br> BASIC (Código de instrucción simbólica universal para principiantes: Begginners Allpurpose Symbolic Instruction Code) comienza como una herramienta para enseñar sobre programación a estudiantes. Fue desarrollado por Jhon Kemeny y Thomas Kurtz en 1964. Por su simplicidad se volvió ampliamente popular y usado en educación y entre los programadores aficionados, pero no ha llegado a ser un lenguaje viable para aplicaciones comerciales. Esto último se debe a que no posee un amplio repertorio de herramientas como el que ofrecen otros lenguajes. Además, sus compiladores no producen archivos ejecutables tan compactos, rápidos y eficientes como los que producen otros lenguajes.
 
 
 
=== C ===
 
 
 
Por su parte C es un lenguaje de programación creado en 1972 por Kenneth L. Thompson, Brian Kernighan y Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado en BCPL. <br> C, desarrollado a principios de los sesenta por Brian Kernighan y Dennis Ritchie, quienes buscaban un mejor lenguaje de integrar con el sistema operativo UNIX, para que los usuarios pudiesen hacer modificaciones y mejoras con facilidad. El código ejecutable obtenido del lenguaje C, es rápido y eficiente. El C es poderoso, puesto que brinda la libertad de conseguir que se realice casi cualquier cosa en una computadora. Esta es una de las razones por la cual se ha vuelto tan popular entre quienes desarrollan software para aplicaciones comerciales profesionalmente. Su dificultad estriba, en que no es tan sencillo de aprender en comparación con otros lenguajes.
 
 
 
=== C++ ===
 
 
 
C++ (pronunciado "C plus plus" o "C más más", por algunos programadores de habla hispana) es un lenguaje de programación, diseñado a mediados de los ochenta, por Bjarne Stroustrup, como extensión del lenguaje de programación C.
 
 
 
El nombre C++ fue propuesto por Rick Masciatti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico.
 
 
 
Antes se había usado el nombre "C con clases". En el C++, "C++" significa "uno más de C" y se refiere a que C++ es una extensión del C. Algunos dicen que "C++" todavía significa "C", porque "++" en este caso es el operador de la pos incrementación, es decir, aumenta el valor de la expresión a la que se refiere, después, en las instrucciones siguientes. Por esto el valor de la expresión en este momento permanece original.  Es un lenguaje híbrido, que se puede compilar y resulta más sencillo de aprender para los programadores que ya conocen C. Las principales características del C++ son abstracción (encapsulación), el soporte para programación orientada a objetos (polimorfismo) y el soporte de plantillas o programación genérica (Templetes). Pero añade otra serie de propiedades que se encuentran más difícilmente en otros lenguajes de alto nivel:
 
 
 
*Posibilidad de redefinir los operadores.
 
*Identificación de tipos en tiempo de ejecución (RTTI).
 
  
 
== Fuentes ==
 
== Fuentes ==
  
*Libro Breve historia de los lenguajes de programación. Juan de Dios Rosas Días
+
*[[Berzal Galiano Fernando]]. ''Concurrencia''.
*Edsger. W. Dijkstra. "El Programista Humilde" (la Conferencia del Premio de Turing), Comunicaciones del ACM, Vol 15, No. 10 (el octubre 1972).  
+
*[[David Carmona]].''Programming the Thread Pool in the .NET Framewor''.June [[2002]].
 
+
*Colaboración de Ing. Yordanger Fernández Reyna. Joven Club de Computación y Electrónica Palma Soriano II.
 
[[Category:Informática]]
 
[[Category:Informática]]

última versión al 21:30 6 jul 2019

Programación Concurrente en CSharp
Información sobre la plantilla
Proc.JPG
conjunto de técnicas y notaciones que sirven para expresar el paralelismo potencial en los programas

Programación Imperativa. Se entiende por programación concurrente el conjunto de técnicas y notaciones que sirven para expresar el paralelismo potencial en los programas, así como resolver problemas de comunicación y sincronización.

Un proceso es un programa en ejecución con un estado asociado. Las distintas aplicaciones que se ejecutan en un sistema operativo multitarea son procesos independientes. Cada una de ellas tiene asociado un contexto (prioridad, estado del procesador, lista de interrupciones y señales que admite, páginas de memoria que ocupa, etc.).

Una aplicación concurrente está formada por un conjunto de procesos concurrentes. En ella existen distintas hebras de control independientes, vías simultáneas de ejecución. Dichas hebras de control pueden ser procesos independientes en el sistema operativo o hebras dentro de un proceso. Una aplicación multihebra está constituida por distintas hebras que comparten el espacio de un proceso en el sistema operativo.

Consideraciones

Cada hebra/proceso supone una carga adicional para el sistema.

¿Por qué usar hebras y procesos?

El uso de paralelismo (múltiples procesos y hebras, en particular) proporciona una serie de ventajas frente a las limitaciones de los sistemas monotarea.

Ejemplo

Estructuración, Paralelismo implícito

Importante: El objetivo principal del uso de paralelismo es mejorar el rendimiento del sistema. El diseñador/programador deberá decidir hasta qué punto debe utilizarse en cada momento.

  • Ejecución de procesos.
  • Finalización de procesos.
  • Monitorización de procesos.
  • Operaciones de E/S

Ejecución de procesos

La clase System.Diagnostics.Process permite crear y monitorizar procesos (accediendo a la información que se visualiza en el Administrador de Tareas de Windows). El método Process.Start() equivale a la llamada ShellExecute del API de Windows (Win32) y es el que deberemos utilizar para lanzar un proceso. Los parámetros del proceso se especifican mediante un objeto de la clase ProcessStartInfo. Al encapsular una llamada al shell de Windows, el método Start también podemos usarlo para abrir un fichero de cualquier tipo de los que tengan acciones asociadas en el registro de Windows.

Fuentes

  • Berzal Galiano Fernando. Concurrencia.
  • David Carmona.Programming the Thread Pool in the .NET Framewor.June 2002.
  • Colaboración de Ing. Yordanger Fernández Reyna. Joven Club de Computación y Electrónica Palma Soriano II.