stringtranslate.com

Programación alfabetizada

Literate Programming de Donald Knuth es el libro fundamental sobre programación alfabetizada.

La programación alfabetizada es un paradigma de programación introducido en 1984 por Donald Knuth en el que se presenta un programa informático como una explicación de cómo funciona en un lenguaje natural , como el inglés, intercalado (incrustado) con fragmentos de macros y código fuente tradicional , a partir del cual se puede generar código fuente compilable . [1] El enfoque se utiliza en la informática científica y en la ciencia de datos de forma rutinaria para fines de investigación reproducible y acceso abierto . [2] Millones de programadores utilizan herramientas de programación alfabetizada en la actualidad. [3]

El paradigma de programación alfabetizada, tal como lo concibió Donald Knuth, representa un alejamiento de la escritura de programas de computadora en la forma y el orden impuestos por el compilador, y en su lugar proporciona a los programadores macros para desarrollar programas en el orden demandado por la lógica y el flujo de sus pensamientos. [4] Los programas alfabetizados se escriben como una exposición de la lógica en un lenguaje más natural en el que se utilizan macros para ocultar abstracciones y código fuente tradicional , más parecido al texto de un ensayo .

Las herramientas de programación alfabetizada (LP) se utilizan para obtener dos representaciones de un archivo fuente: una comprensible para un compilador o intérprete, el código "enredado", y otra para ver como documentación formateada , que se dice que está "tejida" a partir de la fuente alfabetizada. [5] Si bien la primera generación de herramientas de programación alfabetizada era específica del lenguaje de computadora , las posteriores son independientes del lenguaje y existen más allá de los lenguajes de programación individuales.

Historia y filosofía

La programación alfabetizada fue introducida por primera vez en 1984 por Donald Knuth, quien pretendía crear programas que fueran literatura adecuada para los seres humanos. La implementó en la Universidad de Stanford como parte de su investigación sobre algoritmos y tipografía digital . La implementación se llamó " WEB " ya que creía que era una de las pocas palabras de tres letras del inglés que aún no se había aplicado a la informática. [6] Sin embargo, se asemeja a la naturaleza complicada del software delicadamente ensamblado a partir de materiales simples. [1] La práctica de la programación alfabetizada ha experimentado un resurgimiento importante en la década de 2010 con el uso de cuadernos computacionales , especialmente en la ciencia de datos .

Concepto

La programación literaria consiste en escribir la lógica del programa en un lenguaje humano con fragmentos de código y macros incluidos (separados por un marcado primitivo). Las macros en un archivo fuente literario son simplemente frases explicativas o similares a títulos en un lenguaje humano que describen abstracciones humanas creadas al resolver el problema de programación y ocultan fragmentos de código o macros de nivel inferior. Estas macros son similares a los algoritmos en pseudocódigo que se utilizan normalmente en la enseñanza de la informática . Estas frases explicativas arbitrarias se convierten en nuevos operadores precisos, creados sobre la marcha por el programador, formando un metalenguaje sobre el lenguaje de programación subyacente.

Un preprocesador se utiliza para sustituir jerarquías arbitrarias, o más bien "redes" interconectadas de macros", [7] para producir el código fuente compilable con un comando ("tangle"), y la documentación con otro ("weave"). El preprocesador también proporciona la capacidad de escribir el contenido de las macros y de agregar macros ya creadas en cualquier lugar del texto del archivo fuente del programa alfabetizado, eliminando así la necesidad de tener en cuenta las restricciones impuestas por los lenguajes de programación tradicionales o de interrumpir el flujo de pensamiento.

Ventajas

Según Knuth, [8] [9] la programación alfabetizada proporciona programas de mayor calidad, ya que obliga a los programadores a indicar explícitamente las ideas detrás del programa, haciendo que las decisiones de diseño mal pensadas sean más obvias. Knuth también afirma que la programación alfabetizada proporciona un sistema de documentación de primera clase, que no es un complemento, sino que crece naturalmente en el proceso de exposición de las propias ideas durante la creación de un programa. [10] La documentación resultante permite al autor reiniciar sus propios procesos de pensamiento en cualquier momento posterior y permite que otros programadores comprendan la construcción del programa más fácilmente. Esto difiere de la documentación tradicional, en la que se presenta al programador un código fuente que sigue un orden impuesto por el compilador y debe descifrar el proceso de pensamiento detrás del programa a partir del código y sus comentarios asociados. También se afirma que las capacidades de metalenguaje de la programación alfabetizada facilitan el pensamiento, proporcionando una "vista de pájaro" superior del código y aumentando el número de conceptos que la mente puede retener y procesar con éxito. La aplicabilidad del concepto a la programación a gran escala, la de los programas de nivel comercial, queda demostrada mediante una edición del código TeX como programa alfabetizado. [8]

Knuth también afirma que la programación alfabetizada puede conducir a una fácil portabilidad del software a múltiples entornos, e incluso cita la implementación de TeX como ejemplo. [11]

Contraste con la generación de documentación

Muy a menudo se confunde la programación literaria [12] con la idea de que se refiere únicamente a la documentación formateada producida a partir de un archivo común con código fuente y comentarios (lo que se denomina propiamente generación de documentación ) o a voluminosos comentarios incluidos con el código. Esto es lo opuesto a la programación literaria: el código bien documentado o la documentación extraída del código sigue la estructura del código, con la documentación incrustada en el código; mientras que en la programación literaria, el código está incrustado en la documentación, y el código sigue la estructura de la documentación.

Esta idea errónea ha llevado a afirmar que las herramientas de extracción de comentarios, como la documentación simple de Perl o los sistemas Javadoc de Java , son "herramientas de programación alfabetizada". Sin embargo, debido a que estas herramientas no implementan la "red de conceptos abstractos" que se esconde detrás del sistema de macros de lenguaje natural, ni proporcionan una capacidad para cambiar el orden del código fuente de una secuencia impuesta por la máquina a una conveniente para la mente humana, no pueden llamarse adecuadamente herramientas de programación alfabetizada en el sentido que pretendía Knuth. [12] [13]

Flujo de trabajo

La implementación de una programación alfabetizada consta de dos pasos:

  1. Tejido: Generar un documento integral sobre el programa y su mantenimiento.
  2. Enredado: Generando código ejecutable de máquina

El tejido y el enredo se realizan en la misma fuente para que sean consistentes entre sí.

Ejemplo

Un ejemplo clásico de programación alfabetizada es la implementación alfabetizada del programa estándar de conteo de palabras de Unix wc . Knuth presentó una versión CWEB de este ejemplo en el Capítulo 12 de su libro Literate Programming . El mismo ejemplo fue reescrito posteriormente para la herramienta de programación alfabetizada noweb . [14] Este ejemplo proporciona una buena ilustración de los elementos básicos de la programación alfabetizada.

Creación de macros

El siguiente fragmento del wcprograma alfabetizado [14] muestra cómo se utilizan frases descriptivas arbitrarias en un lenguaje natural en un programa alfabetizado para crear macros, que actúan como nuevos "operadores" en el lenguaje de programación alfabetizado y ocultan fragmentos de código u otros macros. La notación de marcado consta de corchetes angulares dobles ( <<...>>) que indican macros. El @símbolo que, en un archivo noweb, indica el comienzo de un fragmento de documentación. El <<*>>símbolo representa la "raíz", el nodo superior desde el que la herramienta de programación alfabetizada comenzará a expandir la red de macros. En realidad, la escritura del código fuente expandido se puede realizar desde cualquier sección o subsección (es decir, un fragmento de código designado como <<name of the chunk>>=, con el signo igual), por lo que un archivo de programa alfabetizado puede contener varios archivos con código fuente de máquina.

El propósito de wc es contar líneas , palabras y / o caracteres en una lista de archivos . La cantidad de líneas en un archivo es ........ / más explicaciones /                        A continuación , se presenta una descripción general del archivo wc.c que está definido por el programa noweb wc.nw : << * >> = << Archivos de encabezado a incluir >> << Definiciones >> << Variables globales >> << Funciones >> << El programa principal >> @                             Debemos incluir las definiciones de E / S estándar , ya que queremos enviar salida formateada a stdout y stderr . << Archivos de encabezado a incluir >>= #include < stdio.h > @                       

El desentrañar los fragmentos se puede realizar en cualquier lugar del archivo de texto del programa alfabetizado, no necesariamente en el orden en que están secuenciados en el fragmento que los contiene, sino como lo exige la lógica reflejada en el texto explicativo que envuelve todo el programa.

Programa como una web

Las macros no son lo mismo que los "nombres de sección" en la documentación estándar. Las macros de programación literaria ocultan el código real detrás de sí mismas y se pueden usar dentro de cualquier operador de lenguaje de máquina de bajo nivel, a menudo dentro de operadores lógicos como if, whileo case. Esto se puede ver en el siguiente wcprograma literario. [14]

El fragmento actual , que realiza el recuento , fue en realidad uno de los más sencillos de escribir . Observamos cada carácter y cambiamos de estado si comienza o termina una palabra .                            << Escanear archivo >>= while ( 1 ) { << Rellenar el buffer si está vacío ; romper al final del archivo >> c = * ptr ++ ; if ( c > ' ' && c < 0177 ) { /* códigos ASCII visibles * / if ( ! in_word ) { word_count ++ ; in_word = 1 ; } continue ; } if ( c == '\n' ) line_count ++ ; else if ( c != ' ' && c != '\t' ) continue ; in_word = 0 ; /* c es nueva línea, espacio o tabulación */ } @                                                           

Las macros representan cualquier fragmento de código u otras macros, y son más generales que la fragmentación de arriba hacia abajo o de abajo hacia arriba, o que la subdivisión. Donald Knuth dijo que cuando se dio cuenta de esto, comenzó a pensar en un programa como una red de varias partes. [1]

Orden de la lógica humana, no la del compilador

En un programa no alfabetizado en la web, además del orden libre de su exposición, los fragmentos detrás de las macros, una vez introducidos con <<...>>=, se pueden hacer crecer más tarde en cualquier lugar del archivo simplemente escribiéndolos <<name of the chunk>>=y agregándoles más contenido, como lo ilustra el siguiente fragmento ( +lo agrega el formateador del documento para facilitar la lectura, y no está en el código). [14]

Los totales generales deben inicializarse a cero al comienzo del programa.Si hiciéramos que estas variables fueran locales a la principal, tendríamos que hacer esta inicializaciónexplícitamente; sin embargo, las variables globales de C se ponen a cero automáticamente. (O más bien, ``estáticamentepuesto a cero.'⁠' (¿Lo entiendes?) <<Variables globales>>+= long tot_word_count, tot_line_count, recuento_de_caracteres totales; /* total number of words, lines, chars */ @

Registro del hilo del pensamiento

La documentación de un programa literario se produce como parte de la escritura del programa. En lugar de comentarios proporcionados como notas al margen del código fuente, un programa literario contiene la explicación de los conceptos en cada nivel, con los conceptos de nivel inferior postergados a su lugar apropiado, lo que permite una mejor comunicación del pensamiento. Los fragmentos del programa literario wcanteriores muestran cómo se entrelazan una explicación del programa y su código fuente. Tal exposición de ideas crea el flujo de pensamiento que es como una obra literaria. Knuth escribió una "novela" que explica el código del juego de ficción interactiva Colossal Cave Adventure . [15]

Ejemplos notables

Prácticas de programación alfabetizada

El primer entorno de programación alfabetizado publicado fue WEB , introducido por Knuth en 1981 para su sistema de composición tipográfica TeX ; utiliza Pascal como lenguaje de programación subyacente y TeX para la composición tipográfica de la documentación. El código fuente completo de TeX comentado se publicó en TeX: The program de Knuth , volumen B de su libro de 5 volúmenes Computers and Typesetting . Knuth había utilizado de forma privada un sistema de programación alfabetizado llamado DOC ya en 1979. Se inspiró en las ideas de Pierre-Arnoul de Marneffe . [16] El CWEB gratuito , escrito por Knuth y Silvio Levy, está adaptado para WEB para C y C++ , se ejecuta en la mayoría de los sistemas operativos y puede producir documentación TeX y PDF .

Existen otras implementaciones del concepto de programación alfabetizada, como se muestra a continuación. Muchas de las más nuevas no tienen macros y, por lo tanto, no cumplen con el principio de orden lógico humano, lo que las convierte en herramientas "semi alfabetizadas". Sin embargo, estas permiten la ejecución celular de código, lo que las convierte más en herramientas de programación exploratoria .

Otras herramientas útiles incluyen:

Véase también

Referencias

  1. ^ abc v w x y z Knuth, Donald E. (1984). "Literate Programming" (PDF) . The Computer Journal . 27 (2). British Computer Society : 97–111. doi : 10.1093/comjnl/27.2.97 . Consultado el 4 de enero de 2009 .
  2. ^ Schulte, Eric (2012). "Un entorno informático multilingüe para la programación literaria y la investigación reproducible" (PDF) . Journal of Statistical Software . 46 (3). doi : 10.18637/jss.v046.i03 . Archivado (PDF) del original el 9 de noviembre de 2014. Consultado el 30 de mayo de 2020 .
  3. ^ Kery, Mary Beth (abril de 2018). "La historia en el cuaderno: ciencia de datos exploratoria utilizando una herramienta de programación alfabetizada". CHI '18: Actas de la Conferencia CHI 2018 sobre factores humanos en sistemas informáticos . Association for Computing Machinery . págs. 1–11. doi :10.1145/3173574.3173748.
  4. ^

    Tenía la sensación de que el método de arriba hacia abajo y el de abajo hacia arriba eran metodologías opuestas: una más adecuada para la exposición de programas y la otra más adecuada para la creación de programas. Pero después de adquirir experiencia con la WEB, me he dado cuenta de que no hay necesidad de elegir de una vez por todas entre el método de arriba hacia abajo y el de abajo hacia arriba, porque es mejor pensar en un programa como una red en lugar de como un árbol. Existe una estructura jerárquica, pero lo más importante de un programa son sus relaciones estructurales. Un software complejo consta de partes simples y relaciones simples entre esas partes; la tarea del programador es enunciar esas partes y esas relaciones, en el orden que sea mejor para la comprensión humana, no en un orden determinado rígidamente como el de arriba hacia abajo o el de abajo hacia arriba.

    —  Donald E. Knuth , Programación literaria [1]
  5. ^ Si uno recuerda que la primera versión de la herramienta se llamó WEB, la divertida referencia literaria escondida por Knuth en estos nombres se hace obvia: "Oh, qué red enredada tejemos cuando por primera vez practicamos el engaño" —Sir  Walter Scott , en el Canto VI, Estrofa 17 de Marmion (1808), un poema épico sobre la Batalla de Flodden en 1513. – la cita real apareció como epígrafe en un artículo de mayo de 1986 de Jon Bentley y Donald Knuth en una de las clásicas columnas "Perlas de programación" en Communications of the ACM , vol. 29, no. 5, p. 365.
  6. ^ "Literate Programming" (PDF) . Archive.ComputerHistory.org . Consultado el 3 de junio de 2019 .
  7. ^

    Las macros de WEB pueden tener como máximo un parámetro. Nuevamente, hice esto por simplicidad, porque noté que la mayoría de las aplicaciones de múltiples parámetros podrían, de hecho, reducirse al caso de un solo parámetro. Por ejemplo, supongamos que desea definir algo como [ejemplo omitido] ... En otras palabras, el nombre de una macro puede ser útil como parámetro de otra macro.

    —  Donald E. Knuth , Programación literaria [1]
  8. ^ ab Knuth, Donald E. ; Binstock, Andrew (25 de abril de 2008). "Entrevista con Donald Knuth" . Consultado el 4 de enero de 2009 . Sin embargo, para mí, la programación alfabetizada es sin duda lo más importante que surgió del proyecto TeX . No sólo me ha permitido escribir y mantener programas más rápido y de forma más fiable que nunca, y ha sido una de mis mayores fuentes de alegría desde los años 80, sino que en ocasiones ha sido indispensable. Algunos de mis programas más importantes, como el metasimulador MMIX, no podrían haberse escrito con ninguna otra metodología de la que haya oído hablar. La complejidad era simplemente demasiado abrumadora para que mi limitado cerebro la manejara; sin la programación alfabetizada, toda la empresa habría fracasado miserablemente. ... La programación alfabetizada es lo que necesitas para elevarte por encima del nivel ordinario de logros.
  9. ^

    Otra cosa sorprendente que aprendí mientras usaba WEB fue que los lenguajes de programación tradicionales me habían hecho escribir programas de inferior calidad, aunque no me había dado cuenta de lo que estaba haciendo. Mi idea original era que WEB sería simplemente una herramienta para documentación, pero en realidad descubrí que mis programas WEB eran mejores que los programas que había estado escribiendo en otros lenguajes.

    —  Donald E. Knuth , Programación literaria [1]
  10. ^

    Así, el lenguaje WEB permite a una persona expresar programas en un orden de "flujo de conciencia" . TANGLE es capaz de mezclar todo en el orden que exige un compilador PASCAL. Esta característica de WEB es quizás su mayor ventaja; hace que un programa escrito en WEB sea mucho más legible que el mismo programa escrito puramente en PASCAL, incluso si este último programa está bien comentado. Y el hecho de que no haya necesidad de obsesionarse con la cuestión de arriba hacia abajo o de abajo hacia arriba, ya que un programador puede ahora ver un programa grande como una red, para ser explorado en un orden psicológicamente correcto es quizás la lección más importante que he aprendido de mis experiencias recientes.

    —  Donald E. Knuth , Programación literaria [1]
  11. ^ "Historia oral de Donald Knuth: una entrevista con Ed Feigenbaum" (PDF) . Archive.ComputerHistory.org . Consultado el 7 de diciembre de 2018 .
  12. ^ ab Dominus, Mark-Jason (20 de marzo de 2000). "POD no es programación literaria". Perl.com . Archivado desde el original el 2 de enero de 2009.
  13. ^

    Elegí el nombre WEB en parte porque era una de las pocas palabras de tres letras en inglés que no se había aplicado antes a las computadoras. Pero con el tiempo, me sentí sumamente satisfecho con el nombre, porque creo que un programa complejo se considera, de hecho, mejor como una red que se ha construido delicadamente a partir de materiales simples. Entendemos un sistema complicado al comprender sus partes simples y al comprender las relaciones simples entre esas partes y sus vecinos inmediatos. Si expresamos un programa como una red de ideas, podemos enfatizar sus propiedades estructurales de una manera natural y satisfactoria.

    —  Donald E. Knuth , Programación literaria [1]
  14. ^ abcd Ramsey, Norman (13 de mayo de 2008). "Un ejemplo de noweb" . Consultado el 4 de enero de 2009 .
  15. ^ El juego, también conocido como ADVENT , fue escrito originalmente por Crowther en unas 700 líneas de código FORTRAN; Knuth lo reformuló en el lenguaje WEB. Está disponible en literateprogramming.com o en el sitio web de Knuth. Archivado el 20 de agosto de 2008 en Wayback Machine .
  16. ^ de Marneffe, Pierre Arnoul (diciembre de 1973). Programación de holones: una encuesta (informe). Universidad de Lieja , Servicio de Informática. pag. 135 – vía GitHub .
  17. ^ "Babel: Introducción".
  18. ^ "Babel Languages: redirección". OrgMode.org .
  19. ^ "Babel: Introducción".
  20. ^ Ashkenas, Jeremy. "Literate CoffeeScript" . Consultado el 13 de noviembre de 2014 .
  21. ^ Hitos en la ciencia informática y la tecnología de la información por Edwin D. Reilly, pág. 157.
  22. ^ "Cuadernos de Wolfram". Wolfram.com . Consultado el 28 de noviembre de 2018 .
  23. ^ "Referencia de formato de marcado: descripción general del marcado". Developer.Apple.com . Consultado el 15 de noviembre de 2015 .
  24. ^ "Agda alfabetizada". Wikia Agda . Consultado el 26 de marzo de 2017 .
  25. ^ "Eve y la programación literaria". Manual de Eve . Archivado desde el original el 24 de mayo de 2017. Consultado el 25 de mayo de 2017 .
  26. ^ de Yihui Xie; Joseph J. Allaire ; Garrett Grolemund (30 de diciembre de 2023), R Markdown: The Definitive Guide, Chapman & Hall , Wikidata  Q76441281
  27. ^ Leisch, Friedrich (2002). "Sweave, Parte I: Mezcla de R y LaTeX: Una breve introducción al formato de archivo Sweave y las funciones R correspondientes" (PDF) . R News . 2 (3): 28–31 . Consultado el 22 de enero de 2012 .
  28. ^ Pineda-Krch, Mario (17 de enero de 2011). "The Joy of Sweave – A Beginner's Guide to Reproducible Research with Sweave" (PDF) . Consultado el 22 de enero de 2012 .
  29. ^ Xie, Yihui (2015). Documentos dinámicos con R y knitr, 2.ª edición. Chapman & Hall/CRC. ISBN 9781498716963.
  30. ^ Xie, Yihui. "knitr: una herramienta de propósito general para la generación de informes dinámicos en R" (PDF) – vía GitHub .
  31. ^ Nelson, Graham A. (17 de junio de 2022). "ganelson/inweb: Un sistema moderno para la programación alfabetizada" – vía GitHub .
  32. ^ Ream, Edward K. (2 de septiembre de 2008). «Leo's Home Page» (Página de inicio de Leo) . Consultado el 3 de abril de 2015 .
  33. ^ Consulte el manual de listados para obtener una descripción general.
  34. ^ Mountbatten, Sian. «Web 68: Programación literaria con Algol 68». Archivado desde el original el 20 de enero de 2013. Consultado el 1 de enero de 2013 .
  35. ^ "Directrices TEI". TEI-C.org . Consorcio TEI. Archivado desde el original el 22 de agosto de 2018 . Consultado el 23 de agosto de 2018 .

Lectura adicional

Enlaces externos