haskell literate-programming

¿Es la programación alfabetizada en Haskell realmente "programación alfabetizada"?



literate-programming (1)

Soy nuevo en el concepto de programación alfabetizada . Estaba leyendo el documento de Donald Knuth (PDF) sobre este tema, y ​​al principio, en la Introducción, dice:

En lugar de imaginar que nuestra tarea principal es instruir a una computadora sobre qué hacer, concentrémonos más bien en explicar a los seres humanos lo que queremos que haga una computadora.

Él o ella [el practicante de la programación alfabetizada] se esfuerza por lograr un programa que sea comprensible porque sus conceptos se han introducido en un orden que es mejor para la comprensión humana , utilizando una mezcla de métodos formales e informales que se refuerzan entre sí.

Luego, sigue leyendo:

Una cosa sobre un programa es sus relaciones estructurales. Una pieza compleja de software consiste en partes simples y relaciones simples entre esas partes; la tarea del programador es establecer esas partes y esas relaciones, en el orden que sea mejor para la comprensión humana, no en un orden rígidamente determinado como arriba-abajo o abajo-arriba .

(...)

La programación descendente te da una idea clara de a dónde vas, pero te obliga a tener muchos planes en la cabeza; el suspenso se acumula porque nada está realmente clavado hasta el final. la programación tiene la ventaja de que usted maneja continuamente un lápiz cada vez más poderoso, ya que se han construido más y más subrutinas; pero te obliga a posponer la organización general del programa hasta el último minuto, por lo que podrías ser torpe sin rumbo.

Por lo tanto, el lenguaje WEB le permite a una persona expresar programas en un orden de "flujo de conciencia" . TANGLE puede mezclar todo en el arreglo que exige un compilador PASCAL . Esta característica de WEB es quizás su mayor activo;

El extracto anterior me hizo interesarme por el tema, así que investigué un poco más. No es difícil ver en los resultados proporcionados por ningún motor de búsqueda la relación entre Haskell y la programación alfabetizada, pero no veo el "mejor orden para la comprensión humana". Más bien, veo una documentación muy bien hecha mientras mantengo el orden que requiere la computadora para funcionar.

  • ¿Se puede usar el término "programación alfabetizada" para eliminar ese problema de orden?
  • ¿Hay alguna otra definición de programación alfabetizada que no requiera la función de orden "flujo de conciencia"?
  • ¿Es Haskell realmente capaz de leer y escribir (usando la definición de Knuth)?

Por último, debo decir, como opinión personal, que incluso lo que Haskell hace (y probablemente muchos otros lenguajes) no es la programación alfabetizada de Knuth, todavía me gusta la idea cuando se trata de descripciones exhaustivas de métodos y algoritmos. Cuando los comentarios exceden por mucho el código, tiene un gran propósito.

WEB y TANGLE son parte del sistema que originalmente usó D. Knuth en su primera implementación del concepto de programación alfabetizada.


Haskell es, en su mayor parte, muy flexible cuando se trata de pedidos. Dentro de un módulo de Haskell, todas las declaraciones y definiciones pueden ocurrir en cualquier orden. Gracias a la transparencia referencial, también es muy fácil extraer subproblemas para implementarlos en otro lugar.

El área principal donde el orden importa es la coincidencia de patrones. Todas las ecuaciones de una función deben estar juntas y, dado que están emparejadas en orden, no siempre pueden ser reordenadas. Sin embargo, no creo que esto sea una limitación significativa, ya que (a) generalmente es muy localizada y (b) las funciones grandes con muchas ecuaciones pueden (y probablemente deberían) ser refactorizadas en partes más pequeñas que luego son más fáciles de reordenar .

La restricción quizás más molesta es que las declaraciones de importación deben estar en la parte superior del módulo. Esto rompe un poco la corriente de conciencia, y muchos programas alfabetizados escritos en Haskell comienzan con una afirmación como "no importa estas importaciones, verás dónde las necesitamos más adelante". Habría sido más coherente con la definición de Knuth de la programación alfabetizada para poder nombrar las importaciones en puntos más naturales durante el texto, donde se desprende del contexto por qué son necesarias.

Aparte de eso, creo que Haskell funciona bien para la programación alfabetizada. Puede que no se ajuste perfectamente a la definición de Knuth, pero creo que se acerca lo suficiente.