Programación alfabetizada
programación alfabetizada es un paradigma de programación introducido en 1984 por Donald Knuth en el que se proporciona un programa informático como explicación de su lógica 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. El enfoque se utiliza en computación científica y en ciencia de datos de manera rutinaria para fines de investigación reproducible y acceso abierto. Hoy en día, millones de programadores utilizan herramientas de programación alfabetizadas.
El paradigma de la programación alfabetizada, tal como lo concibió Donald Knuth, representa un alejamiento de la escritura de programas de computadora en la manera y el orden impuestos por la computadora, y en su lugar brinda a los programadores macros para desarrollar programas en el orden exigido por la lógica y el flujo de sus pensamientos. 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 como el texto de un ensayo.
Las herramientas de programación literaria (LP) se utilizan para obtener dos representaciones de un archivo fuente: una comprensible para un compilador o intérprete, la "enredada" código y otro para ver como documentación formateada, que se dice que está "tejida" de la fuente alfabetizada. Si bien la primera generación de herramientas de programación alfabetizadas era específica del lenguaje informático, las últimas son independientes del lenguaje y existen más allá de los lenguajes de programación individuales.
Historia y filosofía
La programación literaria fue introducida por primera vez en 1984 por Donald Knuth, quien pretendía crear programas que fueran literatura adecuada para los seres humanos. Lo implementó en la Universidad de Stanford como parte de su investigación sobre algoritmos y tipografía digital. La implementación se denominó "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. Sin embargo, se asemeja a la naturaleza complicada del software ensamblado delicadamente a partir de materiales simples. La práctica de la programación alfabetizada experimentó un resurgimiento importante en la década de 2010 con el uso de cuadernos computacionales, especialmente en ciencia de datos.
Concepto
La programación alfabetizada 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 alfabetizado 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.
Se utiliza un preprocesador para sustituir jerarquías arbitrarias, o más bien "interconectados 'webs' de macros", para producir el código fuente compilable con un comando ("tangle"), y la documentación con otro ("weave"). El preprocesador también brinda la capacidad de escribir el contenido de las macros y 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 para interrumpir el flujo del pensamiento.
Ventajas
Según Knuth, La programación alfabetizada proporciona programas de mayor calidad, ya que obliga a los programadores a exponer explícitamente los pensamientos detrás del programa, lo que hace 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 primer nivel, que no es un complemento, sino que crece naturalmente en el proceso de exposición de los pensamientos de uno durante la creación de un programa. La documentación resultante le 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 a un programador se le presenta 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, brindando una mayor "vista de pájaro". 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 grado comercial, se demuestra mediante una edición del código TeX como un programa alfabetizado.
Knuth también afirma que la programación alfabetizada puede facilitar la migración de software a múltiples entornos, e incluso cita la implementación de TeX como ejemplo.
Contraste con la generación de documentación
Muy a menudo se malinterpreta la programación alfabetizada para referirse ú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 comentarios voluminosos incluidos con el código. Esto es lo contrario de la programación alfabetizada: el código bien documentado o la documentación extraída del código sigue la estructura del código, con documentación incrustada en el código; mientras que en la programación alfabetizada, el código está incrustado en la documentación, y el código sigue la estructura de la documentación.
Este concepto erróneo ha llevado a afirmar que las herramientas de extracción de comentarios, como los sistemas Perl Plain Old Documentation o Java Javadoc, son "herramientas de programación alfabetizadas". Sin embargo, debido a que estas herramientas no implementan la "red de conceptos abstractos" escondiéndose detrás del sistema de macros de lenguaje natural, o brindan la capacidad de cambiar el orden del código fuente de una secuencia impuesta por una máquina a una conveniente para la mente humana, no pueden llamarse adecuadamente herramientas de programación alfabetizadas en el sentido pretendido por Knuth..
Crítica
En 1986, Jon Bentley le pidió a Knuth que demostrara el concepto de programación alfabetizada para su columna Programming Pearls en Communications of the ACM, escribiendo un programa en WEB. Knuth le envió un programa para un problema discutido previamente en la columna (el de muestrear M números aleatorios en el rango 1..N), y también pidió un 34;tarea". Bentley le dio el problema de encontrar las K palabras más comunes de un archivo de texto, para lo cual Knuth escribió un programa WEB que se publicó junto con una reseña de Douglas McIlroy de Bell Labs. McIlroy elogió la complejidad de la solución de Knuth, su elección de una estructura de datos (una variante del hash trie de Frank M. Liang) y la presentación. Criticó algunas cuestiones de estilo, como el hecho de que la idea central se describe tarde en el artículo, el uso de constantes mágicas y la ausencia de un diagrama para acompañar la explicación de la estructura de datos. McIlroy, también usó la revisión para criticar la tarea de programación en sí misma, señalando que en Unix (desarrollado en Bell Labs), las utilidades para el procesamiento de texto (tr, sort, uniq y sed) se habían escrito previamente y eran "grapas" 34; y se podía obtener una solución fácil de implementar, depurar y reutilizar combinando estas utilidades en un script de shell de seis líneas. En respuesta, Bentley escribió que:
[McIlroy] admira la ejecución de la solución, pero falla el problema por motivos de ingeniería. (Esa es, por supuesto, mi responsabilidad como cedente de problemas; Knuth resolvió el problema que se le dio por motivos que son importantes para la mayoría de los ingenieros, los cheques de pago proporcionados por sus cedentes de problemas.)
McIlroy luego admitió que su crítica fue injusta, ya que criticó el programa de Knuth por motivos de ingeniería, mientras que el propósito de Knuth era solo demostrar la técnica de programación alfabetizada. En 1987, Communications of the ACM publicó un artículo de seguimiento que ilustraba la programación alfabetizada con un programa en C que combinaba el enfoque artístico de Knuth con el enfoque de ingeniería de McIlroy, con una crítica de John Gilbert.
Flujo de trabajo
La implementación de la programación alfabetizada consta de dos pasos:
- Tejer: Generar un documento completo sobre el programa y su mantenimiento.
- Tangling: Generar código ejecutable de máquina
El tejido y el enredo se realizan en la misma fuente para que sean coherentes entre sí.
Ejemplo
Un ejemplo clásico de programación alfabetizada es la implementación alfabetizada del programa de conteo de palabras wc
estándar de Unix. Knuth presentó una versión CWEB de este ejemplo en el capítulo 12 de su libro Programación literaria. El mismo ejemplo se reescribió más tarde para la herramienta de programación alfabetizada noweb. 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 programa alfabetizado wc
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 ocultar fragmentos de código u otras macros. La notación de marcado consta de corchetes angulares dobles ("<<...>>
") que indican macros, el " @" símbolo que indica el final de la sección de código en un archivo noweb. El "
<<*>>
" 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, se puede escribir el código fuente ampliado 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 a Cuenta líneas, palabras, y/o personajes dentro a lista de archivos. ElNúmero de líneas dentro a archivo es .../más explicaciones/Aquí., entonces, es an sinopsis de el archivo wc.c que es definida por el ahora mismo programa wc.#: > > ..Header archivos a incluir> ..Definiciones> ..Global variables> ..Funciones> ..El principal programa> @Nosotros Debe incluir el estándar I/O definiciones, desde entonces nosotros # a Enviar formateado Productoa stdout y stderr. ..Header archivos a incluir> #include Identificado.h @
El desentrañamiento de 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 adjunto, sino como exige la lógica reflejada en el texto explicativo que envuelve el conjunto. programa.
Programa como web
Las macros no son lo mismo que los "nombres de sección" en la documentación estándar. Las macros de programación alfabetizadas ocultan el código real detrás de sí mismas y se utilizan dentro de cualquier operador de lenguaje de máquina de bajo nivel, a menudo dentro de operadores lógicos como "if
", "< código>mientras" o "caso
". Esto se puede ver en el siguiente programa alfabetizado wc
.
El presentes gorro, que ¿Sí? el Contando, era en realidad uno deel simple a escribir. Nosotros Mira. a cada uno carácter y cambio estado si es Comienza o finesa palabra. ..Scan archivo> mientras ()1) {} ..Relleno buffer si es es vacío; descanso a final de archivo> c = *ptr++; si ()c ■ ' " c . 0177) {} /* códigos visibles ASCII */ si ()!in_word) {} word_count++; in_word = 1; } continuar; } si ()c == 'n ') line_count++; más si ()c ! ' " c ! ' ') continuar; in_word = 0; /* c es nueva línea, espacio o pestaña */ } @
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 subsección. Donald Knuth dijo que cuando se dio cuenta de esto, comenzó a pensar en un programa como una red de varias partes.
Orden de la lógica humana, no la del compilador
En un programa alfabetizado en noweb, además del orden libre de su exposición, los fragmentos detrás de las macros, una vez introducidos con "<<...>>=
", puede crecer más tarde en cualquier lugar del archivo simplemente escribiendo "<<name of the chunk>>=
" y agregarle más contenido, como se ilustra en el siguiente fragmento (el formateador del documento agrega "más" para facilitar la lectura, y no está en el código).
Los grandes totales deben ser inicializados a cero al comienzo del programa.
Si hacemos estas variables local a principal, tendríamos que hacer esta inicialización
explícitamente; sin embargo, C globals se cero automáticamente. (O más bien, ``estáticamente
"Cero". (¿Lo entiendes?)
> >
long tot_word_count, tot_line_count,
tot_char_count;
/* número total de palabras, líneas, chars */
@
Registro del tren del pensamiento
La documentación para un programa alfabetizado se produce como parte de la redacción del programa. En lugar de comentarios proporcionados como notas al margen del código fuente, un programa alfabetizado contiene la explicación de los conceptos en cada nivel, con los conceptos de nivel inferior trasladados a su lugar apropiado, lo que permite una mejor comunicación del pensamiento. Los fragmentos del wc
letrado anterior 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 interactivo Colossal Cave Adventure.
Ejemplos notables
- Axiom, que se desarrolla a partir del arañazo, un sistema de álgebra de computadora desarrollado por IBM. Ahora está siendo desarrollado por Tim Daly, uno de los desarrolladores de arañazo, Axiom está totalmente escrito como un programa de alfabeto.
Prácticas de programación alfabetizadas
El primer entorno de programación alfabetizado publicado fue WEB, presentado 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 TeX completo comentado se publicó en TeX: The program de Knuth, volumen B de sus 5 volúmenes Computers and Typesetting. Knuth había utilizado en privado un sistema de programación alfabetizado llamado DOC ya en 1979. Se inspiró en las ideas de Pierre-Arnoul de Marneffe. El CWEB gratuito, escrito por Knuth y Silvio Levy, está adaptado a la WEB para C y C++, se ejecuta en la mayoría de los sistemas operativos y puede producir documentación TeX y PDF.
Hay varias otras implementaciones del concepto de programación alfabetizada (muchas de estas no tienen macros y, por lo tanto, violan el orden del principio de la lógica humana, lo que las convierte en herramientas semianalfabetas):
Nombre | Idiomas compatibles | Escrito en | Lenguaje de marcado | Comentarios |
---|---|---|---|---|
WEB | Pascal | Pascal | TeX | El primer ambiente de programación literaria publicado. |
CWEB | C++ y C | C | TeX | Está adaptado WEB para C y C++. |
NoWEB | Cualquier | C, AWK e Icon | LaTeX, TeX, HTML y troff | Es bien conocido por su simplicidad y permite el formato de texto en HTML en lugar de pasar por el sistema TeX. |
Literate | Cualquier | D | Markdown | Soporta ecuaciones TeX. Compatible con Vim (literate.vim) |
FunnelWeb | Cualquier | C | HTML y TeX | Tiene una marca más complicada, pero tiene muchas opciones más flexibles |
NuWEB | Cualquier | C++ | LaTeX | Puede traducir una única fuente de LP en cualquier número de archivos de código. Lo hace en una sola invocación; no tiene comandos separados de tejido y enredo. No tiene la extensibilidad de Noweb |
pyWeb | Cualquier | Python | ReStructu Texto | Respeta la indentación que hace usable para los idiomas como Python, aunque se puede utilizar para cualquier lenguaje de programación. |
Molly | Cualquier | Perl | HTML | Objetivos para modernizar y escalar con "completar HTML" y "visitas virtuales" en código. Utiliza el marcado "noweb" para los archivos fuente del alfabeto. |
Codnar | Ruby | Es una herramienta de programación de literato inverso disponible como Ruby Gem. En lugar de extraer el código fuente legible por máquina de las fuentes de documentación del alfabeto, la documentación del alfabeto se extrae de los archivos de código fuente legibles por máquina normales. | ||
Emacs org-mode | Cualquier | Emacs Lisp | Texto del texto | Requiere a Babel, que permite incorporar bloques de código fuente de múltiples lenguajes de programación dentro de un solo documento de texto. Los bloques de código pueden compartir datos entre sí, mostrar imágenes en línea o ser analizados en código fuente puro usando la sintaxis de referencia ahoraeb. |
CoffeeScript | CoffeeScript | CoffeeScript, JavaScript | Markdown | CoffeeScript admite un modo "liteados", que permite compilar programas de un documento fuente escrito en Markdown con bloques de códigos identificados. |
Hojas de cálculo | Maple (software) | XML | Las hojas de trabajo de Maple son un entorno de programación de linfas agnósticas que combina texto y gráficos con código vivo para la computación simbólica."Maple Worksheets". www.maplesoft.com. Retrieved 2020-05-30. | |
Wolfram Notebooks | Wolfram Language | Wolfram Language | Los cuadernos Wolfram son un método de programación de literatos agnósticos que combina texto y gráficos con código en vivo. | |
Playgrounds | Swift (lengua de programación) | Proporciona un entorno de programación interactivo que evalúa cada declaración y muestra resultados en vivo a medida que se edita el código. Los campos de juego también permiten al usuario añadir el lenguaje Markup junto con el código que proporciona encabezados, formato en línea e imágenes. | ||
Jupyter Notebook, anteriormente IPython Notebook | Python y cualquiera con un Kernel Jupyter | Especificación del formato JSON para ipynb | Funciona en el formato de cuadernos, que combinan títulos, texto (incluyendo LaTeX), tramas, etc. con el código escrito. | |
nbdev | Python y Jupyter Notebook | nbdev es una biblioteca que le permite desarrollar una biblioteca de pitón en Jupyter Notebooks, poniendo todo su código, pruebas y documentación en un solo lugar.
| ||
Julia (lengua de programación) | Apoya el modo de desarrollo iJulia inspirado en iPython. | |||
Agda (lengua de programación) | Soporta una forma limitada de programación de literato fuera de la caja. | |||
Lenguaje de programación de Eva | Los programas son principalmente prosa. Eve combina variantes de Datalog y Markdown con un entorno de desarrollo gráfico en vivo | |||
R Markdown Notebooks (o R Notebooks) | R, Python, Julia y SQL | PDF, Microsoft Word, LibreOffice y formatos de presentación o presentación de diapositivas más formatos interactivos como widgets HTML | ||
Quarto | R, Python, Julia y Observable | PDF, Microsoft Word, LibreOffice y formatos de presentación o presentación de diapositivas más formatos interactivos como widgets HTML | ||
Sweave | R | |||
Knitr | R | LaTeX, PDF, LyX, HTML, Markdown, AsciiDoc, y re-Structured Texto | ||
Codebraid | Pandoc, Rust, Julia, Python, R, Bash | Python | Markdown | |
Pweave | Python | |||
MATLAB Live Editor | MATLAB | Markdown | ||
Inweb | C, C++, Información 6, Información 7 | C, CWEB | TeX, HTML | Se utiliza para escribir el lenguaje de programación de información desde 2004. |
Mercurio | Python | Python, TipoScript | especificación de formato JSON para ipynb | Mercurio convierte Jupyter Notebook en documentos computacionales interactivos. Pueden publicarse como aplicación web, paneles, informes, REST API o diapositivas. El documento ejecutado se puede exportar como archivo HTML o PDF independiente. Los documentos pueden programarse para la ejecución automática. La presencia de documentos y los widgets se controlan con cabecera de YAML en la primera celda del cuaderno. |
Observable | JavaScript | JavaScript, TipoScript | TeX(KaTeX), HTML | Almacenado en la nube con interfaz web. Los contenidos son publicables como sitios web. Control de versiones; la plataforma define sus propias operaciones de control de versiones. Pueden organizarse celdas de código fuera de orden; Los cuadernos observables construirán automáticamente el gráfico de ejecución (a DAG). Una rica biblioteca estándar implementada con características modernas de JavaScript. Las células de diferentes cuadernos observables pueden referirse entre sí. Las bibliotecas Npm se pueden importar a la mosca. |
Ganesha | JavaScript, TipoScript | JavaScript | Markdown | Permite Node.js cargar módulos de literato, representados por archivos Markdown que contienen JavaScript o código TipoScript intercalado con una prosa ricamente formateada. Soporta módulos de literato abundantes para los navegadores cuando se utilizan los módulos Rollup o Vite frontend. |
Otras herramientas útiles incluyen:
- El editor de texto Leo es un destacando editor que soporta el marcador opcional Noweb y CWEB. El autor de Leo mezcla dos enfoques diferentes: primero, Leo es un editor destacado, que ayuda con la gestión de textos grandes; segundo, Leo incorpora algunas de las ideas de programación alfabetizada, que en su forma pura (es decir, la forma en que se utiliza por Knuth Web herramienta o herramientas como "noweb") es posible sólo con algún grado de inventiva y el uso del editor de una manera no imaginada exactamente por su autor @ no root Sin embargo, esta y otras extensiones (nodos de archivo) hacen que la programación y la gestión de textos sean exitosas y fáciles y de alguna manera similares a la programación del alfabeto.
- El lenguaje de programación Haskell tiene soporte nativo para la programación semi-liteada. El compilador/interpretaciónr admite dos extensiones de nombre de archivo:
.hs
y.lhs
; este último representa el alfabeto Haskell.
- Los scripts literados pueden ser texto completo LaTeX fuente, al mismo tiempo se puede compilar, sin cambios, porque el intérprete sólo compila el texto en un entorno de código, por ejemplo:
% aquí texto que describe la función:begin{}código}hecho 0 = 1hecho ()n+1) = ()n+1) * hecho nend{}código}aquí más texto
- El código también se puede marcar en el estilo Richard Bird, comenzando cada línea con un símbolo mayor y un espacio, precediendo y terminando la pieza de código con líneas en blanco.
- LaTeX
listings
paquete proporciona unlstlisting
ambiente que se puede utilizar para embellecer el código fuente. Se puede utilizar para definir uncode
entorno a utilizar dentro de Haskell para imprimir los símbolos de la siguiente manera: newenvironment{}código} {}lstlistings[Idioma=Haskell]} {}endlstlistings}begin{}código}comp :: ()beta - gamma) - ()alfa - beta) - ()alfa - gamma)()g `comp` f) x = g()f x)end{}código}
- que se puede configurar para producir:
- Aunque el paquete no proporciona medios para organizar fragmentos de código, se puede dividir el código fuente LaTeX en diferentes archivos. Vea el manual de listados para una visión general.
- El sistema de programación de Literates Web 68 utiliza el Algol 68 como lenguaje de programación subyacente, aunque no había nada en el preprocesador 'tang' para forzar el uso de ese lenguaje.
- El mecanismo de personalización de la Iniciativa de codificación de textos que permite la limitación, modificación o extensión del esquema TEI permite a los usuarios mezclar la documentación de prose con fragmentos de especificación de esquemas en su formato One Document Does-it-all. De esta documentación de prosa, esquemas y tuberías modelo de procesamiento se pueden generar y el paradigma de programación de Literate de Knuth se cita como la inspiración para esta manera de trabajar.
Contenido relacionado
Clave (criptografía)
Explorador de Internet
Troll (jerga)