miércoles, 20 de marzo de 2019

PERSONAJES - CIENTÍFICOS

EDSGER W. DIJKSTRA - CONTINUACIÓN

Paradigma de la programación y la metodología editar ]

La programación de computadoras en la década de 1950 a 1960 no fue reconocida como una disciplina académica y, a diferencia de las ciencias maduras, no existían conceptos teóricos o sistemas de codificación. La programación como actividad profesional fue poco comprendida en aquellos años.
A fines de los años sesenta la programación informática estaba en estado de crisis. La crisis de software es un término usado en los primeros días de la informática para la dificultad de escribir programas de computadoraútiles y eficientes en el tiempo requerido. La crisis del software se debió a los rápidos aumentos en el poder de las computadoras y la complejidad de los problemas que podrían abordarse. Con el aumento de la complejidad del software , surgieron muchos problemas de software porque los métodos existentes eran insuficientes. El término "crisis de software" fue acuñado por algunos asistentes en la primera Conferencia de Ingeniería de Software de la OTAN en 1968 en Garmisch , Alemania. [55] [56] [57]Su conferencia ACM Turing Award de 1972 hace referencia a este mismo problema: "¡La principal causa de la crisis del software es que las máquinas se han vuelto más poderosas en varios órdenes de magnitud! En pocas palabras: mientras no hubiera máquinas, la programación fue no hay problema en absoluto; cuando teníamos algunas computadoras débiles, la programación se convirtió en un problema leve, y ahora tenemos computadoras gigantes, la programación se ha convertido en un problema igualmente gigantesco ". [30]
Si bien Dijkstra había programado ampliamente el código de máquina en la década de 1950, llegó a la conclusión de que en los lenguajes de alto nivel el uso frecuente de la declaración GOTO era generalmente sintomático de una estructura deficiente. En 1968, escribió un documento privado "Un caso contra la declaración GO TO", [58]que luego se publicó como una carta en el MCCA. [59] El editor Niklaus Wirth dio a esta carta el encabezado " Ir a la declaración considerada dañina ", que introdujo la frase " considerado dañino " en la informática.
Dijkstra argumentó que la declaración de programación GOTO, que se encuentra en muchos lenguajes de programación de alto nivel, es una fuente importante de errores y, por lo tanto, debe eliminarse. Esta carta provocó un gran debate en la comunidad de programación. Algunos llegaron a igualar la buena programación con la eliminación de GO TO . Dijkstra se negó a mencionar el debate, o incluso la declaración GO TO, en su artículo "Notas sobre la programación estructurada". El debate hace tiempo que se ha calmado; Los lenguajes de programación ofrecen alternativas al GO TO, pocos programadores de hoy lo usan de manera liberal y la mayoría nunca lo usa. [11]
La tesis de Dijkstra era que las desviaciones del flujo de control lineal eran más claras si se permitían solo en estructuras disciplinadas de nivel superior, como la instrucción if-then-else y el bucle while . Esta metodología se desarrolló como un movimiento de programación estructurada , el título de su libro de 1972, en coautoría con CAR Hoare y Ole-Johan Dahl . Considerada por muchos como el primer movimiento significativo en la historia de la programación de computadoras, la programación estructurada se convirtió en la nueva ortodoxia de programación durante los años setenta. [60] [61] [62] Bertrand Meyerobservó que "la revolución en las visiones de la programación iniciada por el iconoclasma de Dijkstra condujo a un movimiento conocido como programación estructurada, que abogaba por un enfoque sistemático y racional para la construcción del programa. La programación estructurada es la base de todo lo que se ha hecho desde la metodología de programación , incluyendo la programación orientada a objetos ". [63]
La programación estructurada a menudo se considera como "programación sin goto". Pero como señala Bertrand Meyer, "Como muestra el primer libro sobre el tema [ Programación estructurada de Dijkstra, Dahl y Hoare], la programación estructurada es mucho más que las estructuras de control y el goto . Su mensaje principal es que la programación debe considerarse una La disciplina científica basada en el rigor matemático ". [64] Como paradigma de programación , la programación estructurada, especialmente en los años 70 y 80, influyó significativamente en el nacimiento de muchos lenguajes de programación modernos como Pascal , [65] [66] C , Modula-2 y Ada[67] La versión Fortran 77 , que incorpora los conceptos de programación estructurada, se lanzó en 1978. El lenguaje C ++ fue una versión considerablemente extendida y mejorada del popular lenguaje de programación estructurado C (ver también: lista de lenguajes de programación basados ​​en C ). Dado que C ++ se desarrolló a partir de un lenguaje estructurado más tradicional , es un " lenguaje híbrido ", en lugar de un lenguaje de programación orientado a objetos puro [68]
En su artículo Programación estructurada: retrospectiva y prospectiva (1986), Harlan Mills escribe: " El artículo de Programación estructurada de Edsger W. Dijkstra de 1969 precipitó una década de intenso enfoque en las técnicas de programación que ha alterado de manera fundamental las expectativas y los logros humanos en el desarrollo de software.Antes de esta década de intenso enfoque, la programación se consideraba como una actividad privada de resolución de rompecabezas que consiste en escribir instrucciones de computadora para funcionar como un programa. Después de esta década, la programación podría considerarse como una actividad pública, basada en las matemáticas, de reestructuración de especificaciones en programas. Antes, el desafío consistía en lograr que los programas se ejecutaran, y luego en hacer que se depuraran más para hacer lo correcto. Después, se podría esperar que los programas se ejecuten y hagan las cosas correctas con poca o ninguna depuración. Antes, era una opinión común que ningún programa importante podía estar libre de errores. Después, muchos programas importantes se han ejecutado durante un año o más sin que se detecten errores. Estas expectativas y logros no son universales debido a la inercia de las prácticas industriales.
El libro Concise Encyclopedia of Computer Science (2004), editado por Edwin D. Reilly, señala que "las principales contribuciones de la programación estructurada han sido dos: la elevación de la técnica de programación a algo menos de un arte y más de una ciencia, y el "La demostración de que los programas cuidadosamente estructurados pueden ser trabajos creativos de suficiente mérito literario para merecer ser leídos por humanos y no solo por computadora" [69]

Diseño y desarrollo de programas (investigación en ingeniería de software) editar ]

Las ideas de Dijkstra sobre la metodología de programación (especialmente el movimiento de programación estructurada) ayudaron a sentar las bases para el nacimiento y el desarrollo de la disciplina profesional de la ingeniería de software (en particular, el diseño y desarrollo de software), permitiendo a los programadores organizar y gestionar proyectos de software cada vez más complejos. [70] [71] A finales de la década de 1960, Dijkstra discutió el concepto de familias de programas. Y a mediados de la década de 1970, David Parnas y otros aclararon la idea y mostraron cómo aplicarla en los principios de ingeniería de software.
El auge del movimiento de programación estructurada llevó a muchos otros enfoques estructurados aplicados al diseño de software . Las técnicas de análisis estructurado y diseño estructurado son producto de conceptos y técnicas de programación estructurada y de las ideas iniciales sobre diseño modular. Los principios de modularidad fueron reforzados por los conceptos de acoplamiento de Larry Constantine (para minimizar entre módulos) y la cohesión (para maximizar dentro de los módulos), por las técnicas de ocultación de información de David Parnas y por tipos de datos abstractos.[72] Un número de herramientas y métodos que emplean los conceptos estructurados fueron desarrollados, como diseño estructurado , programación de Jackson estructurado , Ross ' análisis estructurado y Diseño Técnica (SADT), método estructurado de Yourdon , estructurado Análisis de Sistemas y Método de Diseño (SSADM), y Ingeniería de tecnología de la información deJames Martin El campo de las métricas de software a menudo se considera como una influencia directa del movimiento de programación estructurada en la ingeniería de software en la década de 1970.
La separación de inquietudes (SoC), uno de los principios básicos de la ingeniería de software , es un principio de diseño para separar un programa de computadora en distintas secciones, de modo que cada sección aborde una preocupación separada El término separación de preocupaciones fue acuñado por Dijkstra en su artículo de 1974 "Sobre el papel del pensamiento científico". [73]

Investigación del sistema operativo editar ]

En la década de 1960, Dijkstra y sus colegas en Eindhoven diseñaron e implementaron el sistema operativo THE(que significa ' Technische Hogeschool Eindhoven ') , que se organizó en capas claramente identificadas [74] Su artículo de 1968 sobre este tema proporcionó la base para los diseños posteriores de los sistemas operativos. David Alan Grier, de la IEEE Computer SocietyLa idea de utilizar capas para controlar la complejidad se ha convertido en un pilar de la arquitectura de software. Lo vemos en muchas formas y lo aplicamos a muchos problemas. Lo vemos en la jerarquía de clases en la programación orientada a objetos y en la estructura deArquitectura Orientada a Servicios (SOA). SOA es una aplicación relativamente reciente de capas en informática. Se articuló en 2007 como un medio para controlar la complejidad de los sistemas empresariales, especialmente los sistemas distribuidos que hacen un uso sustancial de Internet. Al igual que el plan de Dijkstra para el desarrollo de sistemas, su sistema de capas se denomina SOA Solution Stack o S3. Las nueve capas del S3 son: 1) sistemas operativos, 2) componentes del servicio, 3) servicios, 4) procesos de negocios, 5) acciones de los consumidores, 6) integración del sistema, 7) control y garantía de calidad, 8) arquitectura de la información, y 9) gobernanza y políticas del sistema. " [75]
Dijkstra organizó el diseño del sistema en capas para reducir la complejidad general del software. Aunque el término "arquitectura" aún no se había utilizado para describir el diseño de software , este fue sin duda el primer vistazo de la arquitectura de software . [1] Introdujo una serie de principios de diseño que se han convertido en parte del vocabulario de trabajo de cada programador profesional: niveles de abstracción, programación en capas, el semáforo y procesos secuenciales de cooperación.Su artículo original sobre el sistema operativo THE se reimprimió en la edición del 25 aniversario de Communications of the ACM, en enero de 1983. A modo de introducción, el Editor en Jefe dice: "Este proyecto inició una larga línea de investigación en sistemas multinivel. Arquitectura: una línea que continúa hasta nuestros días debido a que la modularidad jerárquica es un enfoque poderoso para organizar grandes sistemas ". [11]

Computación concurrente y programación editar ]

Un semáforo (en holandés : seinpaal , el término utilizado en la descripción original de Dijkstra [76] ). A principios de la década de 1960, Dijkstra propuso el primer mecanismo de sincronización para procesos concurrentes, el semáforo con sus dos operaciones, P y V.
En un documento de una página de 1965, Dijkstra presentó el " problema de exclusión mutua " para n procesos y discutió una solución para él. Probablemente fue el primer algoritmo concurrente publicado [7] [13] La noción, estándar por ahora, de una " sección crítica " también se introdujo en este documento. Per Brinch Hansen , pionero en el campo de la computación concurrente , considera que los procesos secuenciales cooperativos de Dijkstra (1965) es el primer artículo clásico en programación concurrente. Como señala Brinch Hansen, "Dijkstra sienta las bases conceptuales para la programación concurrente abstracta" con ese documento. [77]
Un ejemplo simple de dos procesos que modifican una lista enlazada al mismo tiempo causando un conflicto. El requisito de exclusión mutuafue identificado y resuelto por primera vez por Dijkstra en su artículo seminal de 1965 titulado Solución de un problema en el control de la programación concurrente , y se le atribuye el primer tema en el estudio de algoritmos concurrentes .
En 1968, Dijkstra publicó su artículo seminal " Procesos secuenciales de cooperación ", un ensayo de 70 páginas que originó el campo de la programación concurrente . Discutió en él la noción de exclusión mutua ( mutex) y los criterios que una solución satisfactoria debería satisfacer. También corrigió la perspectiva histórica dejada fuera de su documento de 1965 al incluir la primera solución correcta conocida al problema de exclusión mutua , para dos procesos, debido a Theodorus Dekker . Dijkstra posteriormente generalizó la solución de Dekker para n procesos. [78] [79] Además, propuso el primer mecanismo de sincronizaciónpara procesos concurrentes, [80] el semáforo con sus dos operaciones, P y V. También identificó el " problema de punto muerto " (llamado "el problema del abrazo mortal ") [81] y propuso un elegante " algoritmo de banca " que evita el interbloqueo . La detección y prevención de puntos muertos se convirtieron en problemas de investigación perennes en el campo de la programación concurrente.
Ilustración del problema de los filósofos comedores.
El problema de los filósofos del comedor es un problema de ejemplo que se usa a menudo en el diseño de algoritmos concurrentes para ilustrar losproblemas de sincronización y las técnicas para resolverlos. Fue formulado originalmente en 1965 por Dijkstra como un ejercicio de examen para estudiantes, presentado en términos de computadoras que compiten por el acceso a periféricos de unidad de cinta . Poco después, Tony Hoare le dio al problema su formulación actual. [82] El problema del barbero para dormirtambién se atribuye a Dijkstra.
En su libro Programación concurrente: algoritmos, principios y fundamentos [83],Michel Raynal escribe: "Desde los primeros trabajos de EW Dijkstra (1965), quien introdujo el problema de la exclusión mutua, el concepto de proceso, el objeto semáforo, la noción. De una condición previa más débil , y comandos protegidos (entre muchas otras contribuciones), la sincronización ya no es un catálogo de trucos, sino un dominio de la ciencia computacional con sus propios conceptos, mecanismos y técnicas, cuyos resultados se pueden aplicar en muchos dominios. la sincronización de procesos debe ser un tema importante en cualquier plan de estudios de informática ".
John W. McCormick et al. (2011) señala: "La noción de programa concurrentecomo un medio para escribir programas paralelos sin tener en cuenta el hardware subyacente fue presentada por primera vez por Edsger Dijkstra (1968). Moti Ben-Ari(1982) resumió con elegancia la idea de Dijkstra en tres frases: 'Programación concurrente es el nombre que se le da a la notación de programación y técnicas para expresar un paralelismo potencial y resolver los problemas de sincronización y comunicación resultantes. La implementación del paralelismo es un tema en los sistemas informáticos (hardware y software) que es esencialmente independiente de la programación concurrente. La programación concurrente es importante porque proporciona un entorno abstracto en el que estudiar el paralelismo sin atascarse en los detalles de la implementación ". 

No hay comentarios:

Publicar un comentario