¿Cuál es la base teórica de la programación imperativa?


48

La programación funcional tiene una base teórica en el cálculo lambda y la lógica combinatoria . Como alguien involucrado con la computación estadística, considero que estos conceptos son muy útiles para el modelado.

¿Existe una base matemática equivalente de programación imperativa , o simplemente surgió de la aplicación práctica de hardware en lenguaje máquina y el posterior desarrollo de FORTRAN ?

Respuestas:


27

En general, cuando se usan las matemáticas para estudiar algo de X , primero se necesita un modelo de X , y luego se desarrolla una teoría, un conjunto de resultados sobre ese modelo. Supongo que la teoría puede decirse que es una "base teórica" de X . Ahora establezca X = cálculo. Existen muchos modelos de computación, muchos de los cuales implican "estado". Cada modelo tiene su propia "teoría" y a veces es posible "traducir" entre modelos. Creo que es difícil decir qué modelo es más "básico" --- simplemente están diseñados con diferentes objetivos en mente.

Las máquinas de Turing fueron diseñadas para definir qué es computable . Por lo tanto, son un buen modelo si te importa si existe un algoritmo para un problema determinado. A veces se abusa de este modelo para estudiar la eficiencia de los algoritmos o la dureza de los problemas, con el pretexto de que es lo suficientemente bueno, al menos si solo te interesan los polinomios / no polinomios. El modelo RAM está más cerca de una computadora real y, por lo tanto, es mejor si desea un análisis preciso de un algoritmo. Para poner límites inferiores a la dureza de los problemas, es mejor nouse un modelo que se parezca demasiado a las computadoras de hoy porque desea cubrir una amplia gama de computadoras posibles, sin dejar de ser más preciso que solo polinomio / no polinomio. En este contexto, vi, por ejemplo, el modelo de sonda celular utilizado.

Si le importa la corrección , entonces otros modelos son útiles. Aquí tienes semántica operativa (que diría que es el análogo del cálculo lambda para cálculos completos), semántica axiomática (desarrollada en 1969 por Hoare basada en las afirmaciones inductivas de Floyd de 1967, que Knuth popularizó en The Art of Computer Programming , tomo 1), y otros.

Para resumir, creo que buscas modelos de cálculo. Hay muchos de estos modelos, desarrollados con varios objetivos en mente, y muchos tienen estado, por lo que corresponden a la programación imperativa. Si desea saber si se puede calcular algo, mire las máquinas de Turing. Si le importa la eficiencia, mire los modelos RAM. Si le importa la corrección, observe los modelos que terminan en "semántica", como la semántica operativa.

Finalmente, permítanme mencionar que hay un gran libro en línea solo sobre Modelos de Computación de John Savage. Se trata principalmente de eficiencia. Para la parte de corrección, le recomiendo que comience con los trabajos clásicos de Floyd (1967) , Hoare (1969) , Dijkstra (1975) y Plotkin (1981) . Todos son geniales.


44
Creo que Operational Semantics es de hecho lo que está buscando el cartel. Un poco más de información en wikipedia: en.wikipedia.org/wiki/Operational_semantics
sclv

22

El modelo teórico más simple de un programa imperativo es la propia máquina de turing. Tiene los dos componentes esenciales de un programa imperativo: estado modificable ilimitado y una máquina de estado que opera en él.

También puede basar la programación imperativa en programación funcional al considerar los programas como composiciones de operaciones monádicas que pasan y devuelven versiones modificadas del estado global, como se hace en el lenguaje de programación Haskell.


2
El uso de mónadas para obtener construcciones de tipo imperativo en un lenguaje puramente funcional (como Haskell) no le brinda todo el poder de la programación imperativa. En particular, sin un estado verdaderamente mutable (por ejemplo, como en muchos idiomas con referencias), todavía hay muchas estructuras de datos cuya implementación eficiente en un lenguaje puramente funcional es desconocida.
Joshua Grochow

@ Joshua: ¿Por qué crees que las mónadas estatales no expresan la semántica de las referencias? No puedo entender cuál podría ser la objeción.
Charles Stewart el

Una mónada de estado es básicamente un azúcar sintáctico por tener una colección de funciones que aceptan un argumento adicional (estado) y generan una salida adicional (estado siguiente). Pero en un lenguaje puramente funcional, en realidad no puede modificar el estado para obtener el siguiente estado, todavía tiene que copiar y reconstruir. No sé si hay estructuras de datos específicas donde se sabe que no pueden implementarse de manera eficiente en un lenguaje puramente funcional, pero ciertamente hay evidencia sugestiva (por ejemplo, Pippenger. Pure vs. impure Lisp. 1997).
Joshua Grochow el

66
Uno puede capturar la semántica de la mutación con las mónadas perfectamente bien; vea, por ejemplo, la mónada ST en Haskell. Estamos hablando de semántica aquí, no de implementación.
sclv

20

En resumen, diría que la programación imperativa evolucionó del lenguaje de máquina y la práctica de programación. Por otro lado, las mónadas proporcionan un marco semántico apropiado para describir la semántica de las características imperativas del lenguaje de programación. El documento Nociones de computación y mónadas de Moggi estableció los fundamentos formales. Phil Wadler popularizó la idea y contribuyó significativamente a que fuera la forma clave de incorporar características imprescindibles en el lenguaje de programación Haskell. El trabajo reciente de Plotkin y las nociones de poder de la computación determinan las mónadas va a la inversa, indicando que algunas, pero no todas, las nociones de computación (imperativa) realmente dan una mónada, lo que significa que de una manera muy esencial las mónadas corresponden a nociones imperativas (y otras) de computación.


8
Las mónadas se pueden utilizar para acordonar la programación imperativa en un mundo puramente funcional, pero no puedo ver el caso para afirmar que forman una base teórica para la programación imperativa análoga a la relación entre el cálculo lambda y muchos lenguajes funcionales. Las mónadas no modelan el cómputo tanto como forman una abstracción sobre las clases de cómputo (por ejemplo, cómputo puro versus cómputo que involucra IO, o cómputo que se basa en un paquete particular de estado mutable).
blucz

1
Las mónadas son una forma de escribir una semántica denotacional más clara para lenguajes efectivos, entonces, ¿por qué no?
nponeccop

15

Si está buscando un tratamiento matemático riguroso de un lenguaje de programación imperativo, el libro de Winskel "La semántica formal de los lenguajes de programación" (1993) es un ejemplo.

En el libro, define un lenguaje de programación imperativo llamado IMP y proporciona semántica operativa, denotacional y axiomática.


14

Llego tarde a esta pregunta, pero es una pregunta fascinante. Entonces, aquí están mis puntos de vista.

Cuando era estudiante universitario, teníamos un gran profesor de matemáticas, que solía darnos conferencias sobre historia y desarrollo de las matemáticas. Según él, las matemáticas se desarrollaron en oleadas de "expansión" y "consolidación". Durante una fase de expansión, se consideraron e investigaron nuevas ideas que antes eran desconocidas. Luego, durante una fase de consolidación, las nuevas teorías se integraron en el cuerpo de conocimiento existente. Sin embargo, en el siglo XX, dijo, la expansión y la consolidación están sucediendo en paralelo.

La programación imperativa es actualmente una actividad de expansión para las matemáticas. Anteriormente era "desconocido". (Eso puede no ser del todo cierto. Hoare nos dice que Euclides estaba haciendo algo como la programación imperativa en su Geometría. Pero las matemáticas perdieron interés en ella, para bien o para mal). Los matemáticos todavía no están interesados ​​en la programación imperativa. Tanto la pérdida para ellos. Pero considero toda la informática como una rama de las matemáticas en un sentido abstracto. Lo estamos estudiando, expandiendo las matemáticas en el proceso.

Por lo tanto, no me importaría especialmente si existe una base teórica a priori para la programación imperativa. Si no hay ninguno, vamos a buscarlo. Lo que sabemos ya nos dice que la programación imperativa es fantásticamente profunda y hermosa. La programación funcional palidece en comparación. Pero, tenemos mucho trabajo por hacer para llevar toda esta teoría a la gente.


"La programación funcional palidece en comparación". Ahora, si pudiera llevarte a ti y a Bob Harper a una arena de combate. Darías un gran bloque de comandos y él trataría de cerrarte. (PD: muy buena respuesta, lo voté).
Andrej Bauer

Bueno, él me evita. No sé si eso significa algo :-)
Uday Reddy

11

La programación funcional tiene una base clara en las matemáticas porque los lenguajes de programación funcional evolucionaron en paralelo con las matemáticas relevantes y sus diseñadores generalmente tenían las matemáticas en alta estima. La relación fuerte y directa es una profecía autocumplida.

La programación imperativa tiene una historia significativamente más desordenada que se vincula mucho más estrechamente con los problemas empresariales y de ingeniería y que históricamente estaba mucho más preocupada con el rendimiento de los compiladores y el código que generan que con el respeto de los formalismos matemáticos.

Muchas personas han intentado explicar la programación imperativa en términos (tradicionalmente) funcionales. Esto puede ser lo más cerca que podemos llegar a lo que está buscando, pero estos intentos son invariablemente incómodos, tediosos, forenses. Estoy bastante seguro de que preferiría arrancarme los ojos de la cara que leer una prueba de progreso / preservación para el CLR.

Por lo general, si llega al final de un libro de texto pl decente (por ejemplo, Tipos y lenguajes de programación de Pierce), comenzará a ver modelos formales de características de lenguaje imperativas. Esto puede ser interesante para ti.


11

An Axiomatic Basis for Computer Programming por CAR HOARE

En este artículo se intenta explorar los fundamentos lógicos de la programación de computadoras mediante el uso de técnicas que se aplicaron primero en el estudio de la geometría y luego se extendieron a otras ramas de las matemáticas. Esto implica la elucidación de conjuntos de axiomas y reglas de inferencia que pueden usarse en pruebas de las propiedades de los programas de computadora. Se dan ejemplos de tales axiomas y reglas, y se muestra una prueba formal de un teorema simple. Finalmente, se argumenta que importantes ventajas, tanto teóricas como prácticas, pueden derivarse de la búsqueda de estos temas.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.8553&rep=rep1&type=pdf


8

Respaldo lo que dijo Alexandre, que la máquina de Turing proporcionó la base teórica original para la programación imperativa. En la medida en que la organización de los lenguajes de programación imperativos refleje la arquitectura de la máquina, creo que el trabajo de John Von Neumann también sería una parte clave de sus fundamentos teóricos.


7

¿Existe una base matemática equivalente de programación imperativa, o simplemente surgió de la aplicación práctica de hardware en lenguaje máquina y el posterior desarrollo de FORTRAN?

Si quiere decir "base" en el sentido histórico, creo que no hay una "base matemática equivalente". Sin embargo, a pesar de que la programación imperativa surgió de preocupaciones prácticas, hay varias formas de caracterizar de manera integral el significado de la programación imperativa en formas que podría encontrar "útiles para modelar", como la lógica de Hoare .


¿de verdad querías hacer este wiki comunitario?
Suresh Venkat

Sí, quise hacer que sea wiki comunitario.
jbapple

7

Las publicaciones que mencionan la lógica hoare y la lógica de separación son las correctas en este asunto. La lógica de Hoare le permite establecer propiedades de toda la configuración de almacenamiento dinámico de un programa, y ​​la lógica de separación es el pariente más moderno que le permite utilizar una "conjunción de separación" que le permite establecer como condiciones previas y posteriores a un segmento de código qué propiedades tienen para la parte del montón que el segmento del programa manipulará mientras se cuantifica sobre el resto del montón.

La respuesta con respecto a las mónadas no es estrictamente precisa, porque en Haskell se usa una mónada simplemente porque es una abstracción que permite la codificación del orden de las restricciones de evaluación y el seguimiento explícito de la propiedad "podría usar IO".

Vale la pena señalar que tanto la lógica de hoare / separación se puede ver como mónadas, y que hay una serie de proyectos contemporáneos como el proyecto ynot en Harvard que están explorando estos temas.

La investigación en lógica de separación es un campo continuo y activo.


Me parece un error confundir el hecho de que Haskell usa una noción de mónadas (y una clase de tipo Mónada) con el enfoque más general, como lo expone, por ejemplo, Moggi, que usa mónadas para estructurar una explicación de la semántica categórica. La adopción de mónadas como una herramienta para estructurar la programación no debería cegarnos al uso de la semántica categórica como una herramienta para estructurar el razonamiento sobre la programación.
sclv

muy buena aclaración, aunque creo que una gran cantidad de personas han usado mónadas a la haskell para explorar la semántica a través de transformadores de mónada. En particular, la semántica diferente para las operaciones que surgen de diferentes composiciones de dichos transformadores (por ejemplo, estado / mutabilidad, continuaciones, no determinismo, etc.)
Carter Tazio Schonwald

5

Llegaré a esta pregunta incluso más tarde, pero estoy igualmente fascinado por ella.

Por qué la teoría de la programación imperativa se considera menos establecida que la de la programación funcional me evade. Probablemente comenzó a ponerse serio con Scott y de Bakker en 1969 con su análisis del significado de la recursividad en un lenguaje imperativo simple [1]. Cuando el lenguaje imperativo gana características, la historia se vuelve un poco más desordenada, pero ese es solo el precio a pagar por estar más cerca del metal. Para nombrar uno de los esfuerzos más completos, en 1980, de Bakker, de Bruin y Zucker escribieron una monografía sobre el tema [2]. Otros fueron mencionados anteriormente. Estas referencias, por supuesto, tienen una lógica de separación anterior a la fecha, pero [2], sin embargo, abordan las matrices y los procedimientos recursivos mutuos.

[1]: inédito en 1969, pero apareció como Jaco W. de Bakker y Dana S. Scott. Una teoría de los programas , páginas 1-30. En Klop et al. JW de Bakker, 25 años de edad. CWI, Amsterdam, 1989. Liber Amoricum.

[2]: Jacobus W. de Bakker, Arie de Bruin, Jeffrey Zucker: teoría matemática de la corrección del programa. Prentice Hall 1980.


1
La programación claramente imperativa es extremadamente bien entendida. Creo que lo que la gente quiere decir cuando dice que está menos establecido es que estructuralmente, la programación imperativa es más rica que la programación funcional pura, y se ha descubierto una estructura matemática mucho menor que surge en esta o aquella forma de programación imperativa. Por ejemplo, ciertos tipos de programas imperativos se pueden razonar acerca del uso agradable de la lógica de separación. Esto probablemente tenga que ver con formas de compartir. ¿Quizás este tipo de programas tiene una caracterización matemática abstracta y agradable?
Martin Berger

1
Personalmente, me refiero a que la teoría de la modularidad en lenguajes imperativos es muy poco clara. Sabemos lo que significa modularidad para lenguajes funcionales: parametridad relacional. Para los lenguajes imperativos, hay muchos modismos que ocultan información que (a) funcionan claramente, pero (b) para los que carecemos de buenas técnicas de prueba. Hay indicios tentadores de que aquí hay una teoría profunda: por ejemplo, cuando hago pruebas modulares de programas imperativos secuenciales, termino necesitando técnicas de concurrencia. Informalmente, el alias es como concurrencia, pero realmente no sé cómo formalizar esa idea ...
Neel Krishnaswami

@Kai. Bienvenido al hilo! Ha pasado mucho tiempo desde que vi el trabajo de De Bakker, pero creo que el problema básico es que el enfoque no se amplió. Para un resumen rápido del progreso en la programación imperativa desde entonces, vea mi publicación en "¿Qué constituye la semántica denotacional?" enlace de hilo .
Uday Reddy

@NeelKrishnaswami. Me encantaría ver esas pruebas. ¿Están en tu página web? El alias es como la concurrencia, ya que ambos implican compartir sofisticados e intercalar. En concurrencia, abstraes el entrelazado y asumes el no determinismo (lo cual es bueno). Al aliarse, te obligas a lidiar con el entrelazado. La semántica de juegos es un excelente ejemplo de este intercalado forzado, razón por la cual no me gusta.
Uday Reddy

3

Poco después de hacer su pregunta, Mark Bender de la Universidad McMaster lanzó una tesis: Cálculo de asignación: un lenguaje de razonamiento imperativo puro (8 de septiembre de 2010). Esta tesis describe un lenguaje simple e imperativo que corresponde al cálculo lambda.

El cálculo de asignación consta de solo cuatro construcciones básicas, asignación X:=t, secuencia t;u, formación de ¡tprocedimiento e invocación de procedimiento !t. Se dan tres interpretaciones para AC: una semántica operativa, una semántica denotacional y un sistema de reescritura de términos. Los tres se muestran como equivalentes.

La tesis de Mark Bender continúa explorando variantes extendidas con evaluación perezosa, retroceso, composición del procedimiento. Esto es similar a la exploración del cálculo lambda mediante el uso de pequeñas extensiones.

En general, la tesis proporciona una respuesta relativamente directa a la pregunta OP.


enlace pdf está roto
Quinn Wilson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.