Un programa informático es un conjunto de instrucciones [1] que pueden ser ejecutadas por un ordenador para realizar una tarea específica.
Un programa informático generalmente lo escribe un programador informático en un lenguaje de programación . A partir del programa en su forma de código fuente legible por humanos , un compilador o ensamblador puede derivar código de máquina, una forma que consta de instrucciones que la computadora puede ejecutar directamente. Alternativamente, se puede ejecutar un programa informático con la ayuda de un intérprete .
Una colección de programas de computadora, bibliotecas y datos relacionados se conoce como software . Los programas de computadora pueden clasificarse según líneas funcionales, como software de aplicación y software de sistema . El método subyacente utilizado para algunos cálculos o manipulación se conoce como algoritmo .
Historia
Los algoritmos para descifrar códigos han existido durante siglos. En el siglo IX, el matemático árabe Al-Kindi describió un algoritmo criptográfico para descifrar código cifrado, en A Manuscript On Deciphering Cryptographic Messages . Dio la primera descripción del criptoanálisis por análisis de frecuencia , el primer algoritmo de descifrado de códigos. [2]
Máquinas programables tempranas
Las primeras máquinas programables precedieron a la invención de la computadora digital . Ya en el siglo IX, los hermanos persas Banu Musa inventaron un secuenciador de música programable , quienes describieron un flautista mecánico automático en el Libro de los dispositivos ingeniosos . [3] [4] En 1206, el ingeniero árabe Al-Jazari inventó una caja de ritmos programable donde se podían hacer autómatas mecánicos musicales para tocar diferentes ritmos y patrones de batería. [5] En 1801, Joseph-Marie Jacquard ideó un telar que tejía un patrón siguiendo una serie de tarjetas perforadas. Los patrones se pueden tejer y repetir colocando las tarjetas. [6]
Motor analítico
En 1837, Charles Babbage se inspiró en el telar de Jacquard para intentar construir el motor analítico . [6] Los nombres de los componentes del dispositivo de cálculo se tomaron prestados de la industria textil. En la industria textil, el hilo se traía de la tienda para ser molido. El dispositivo habría tenido una "memoria": memoria para almacenar 1000 números de 40 dígitos decimales cada uno. Los números de la "tienda" se habrían transferido entonces al "molino" (análogo a la CPU de una máquina moderna), para su procesamiento. Un "hilo" es la ejecución de instrucciones programadas por el dispositivo. Se programó mediante dos juegos de tarjetas perforadas, una para dirigir la operación y la otra para las variables de entrada. [6] [7] Sin embargo, después de más de 17.000 libras esterlinas del dinero del gobierno británico, los miles de engranajes y ruedas dentadas nunca funcionaron completamente juntos. [8]
Durante un período de nueve meses en 1842-1843, Ada Lovelace tradujo las memorias del matemático italiano Luigi Menabrea . Las memorias cubrieron el motor analítico. La traducción contenía la Nota G que detalla completamente un método para calcular los números de Bernoulli usando el motor analítico. Algunos historiadores reconocen esta nota como el primer programa informático escrito del mundo. [9]
Máquina de Turing universal
En 1936, Alan Turing introdujo la máquina universal de Turing, un dispositivo teórico que puede modelar todos los cálculos que se pueden realizar en una máquina de computación completa de Turing . [10] Es una máquina de estados finitos que tiene una cinta de lectura / escritura infinitamente larga. La máquina puede mover la cinta hacia adelante y hacia atrás, cambiando su contenido a medida que realiza un algoritmo . La máquina arranca en el estado inicial, pasa por una secuencia de pasos y se detiene cuando encuentra el estado de parada. [11] Esta máquina es considerada por algunos como el origen de la computadora de programa almacenado, usada por John von Neumann (1946) para el "Instrumento de Computación Electrónica" que ahora lleva el nombre de arquitectura de von Neumann . [12]
Computadoras programables tempranas
La computadora Z3 , inventada por Konrad Zuse (1941) en Alemania , era una computadora digital y programable. [13] Una computadora digital usa electricidad como componente de cálculo. El Z3 contenía 2.400 relés para crear los circuitos . Los circuitos proporcionaron una computadora binaria , de coma flotante y de nueve instrucciones. La programación del Z3 se realizó mediante un teclado especialmente diseñado y una cinta perforada .
El integrador numérico electrónico y computadora (otoño de 1945) era una computadora Turing completa de uso general que usaba 17.468 tubos de vacío para crear los circuitos . En esencia, era una serie de Pascalines conectados entre sí. [14] Sus 40 unidades pesaban 30 toneladas, ocupaban 1.800 pies cuadrados (167 m 2 ) y consumían $ 650 por hora ( en moneda de la década de 1940 ) en electricidad cuando estaban inactivos. [14] Tenía 20 acumuladores de base 10 . La programación de ENIAC tomó hasta dos meses. [14] Tres mesas de funciones estaban sobre ruedas y debían enrollarse en paneles de funciones fijas. Las mesas de funciones se conectaron a los paneles de funciones mediante cables negros pesados. Cada mesa de funciones tenía 728 botones giratorios. La programación del ENIAC también implicó configurar algunos de los 3.000 interruptores. La depuración de un programa llevó una semana. [14] Las programadoras de ENIAC eran mujeres conocidas colectivamente como las "chicas ENIAC" [15] e incluían a Jean Jennings Bartik , Betty Holberton , Marlyn Wescoff , Kathleen McNulty , Ruth Teitelbaum y Frances Spence . [dieciséis]
El ENIAC contó con operaciones paralelas . Diferentes conjuntos de acumuladores podrían trabajar simultáneamente en diferentes algoritmos. Utilizaba máquinas de tarjetas perforadas para entrada y salida, y se controlaba con una señal de reloj . Funcionó durante ocho años, calculando parámetros de bombas de hidrógeno, prediciendo patrones climáticos y produciendo tablas de disparo para apuntar cañones de artillería.
El Manchester Baby (junio de 1948) era una computadora con programa almacenado . [17] La programación se alejó de mover cables y configurar diales; en cambio, un programa de computadora se almacenaba en la memoria como números. Solo había tres bits de memoria disponibles para almacenar cada instrucción, por lo que se limitó a ocho instrucciones. 32 interruptores estaban disponibles para programación.
Computadoras posteriores
Las computadoras fabricadas hasta la década de 1970 tenían interruptores en el panel frontal para la programación. El programa de computadora fue escrito en papel como referencia. Una instrucción estaba representada por una configuración de ajustes de encendido / apagado. Después de establecer la configuración, se presionó un botón de ejecución. Luego se repitió este proceso. Los programas de computadora también se ingresaron manualmente mediante cinta de papel o tarjetas perforadas . Después de que se cargó el medio, la dirección de inicio se estableció mediante interruptores y se presionó el botón de ejecución. [18]
En 1961, el Burroughs B5000 fue construido específicamente para ser programado en el lenguaje ALGOL 60 . El hardware presentaba circuitos para facilitar la fase de compilación . [19]
En 1964, IBM System / 360 era una línea de seis computadoras, cada una con la misma arquitectura de conjunto de instrucciones . El Modelo 30 era el más pequeño y el menos caro. Los clientes pueden actualizar y conservar el mismo software de aplicación . [20] Cada modelo de System / 360 incluía multiprogramación . Con el soporte del sistema operativo, varios programas podrían estar en la memoria a la vez. Cuando uno estaba esperando entrada / salida , otro podía calcular. Cada modelo también podría emular a otras computadoras. Los clientes pueden actualizar al System / 360 y conservar su software de aplicación IBM 7094 o IBM 1401 . [20]
Programación de computadoras
La programación de computadoras es el proceso de escribir o editar código fuente . La edición del código fuente implica probar, analizar, perfeccionar y, a veces, coordinar con otros programadores en un programa desarrollado conjuntamente. Una persona que practica esta habilidad se conoce como programador de computadoras , desarrollador de software y, a veces, codificador.
El proceso, a veces prolongado, de la programación de computadoras se suele denominar desarrollo de software . El término ingeniería de software se está volviendo popular ya que el proceso se considera una disciplina de ingeniería .
Lenguajes de programación
Los programas informáticos pueden clasificarse según el paradigma del lenguaje de programación utilizado para producirlos. Dos de los principales paradigmas son imperativos y declarativos .
Idiomas imperativos
Los lenguajes de programación imperativos especifican un algoritmo secuencial mediante declaraciones, expresiones y declaraciones: [21]
- Una declaración asocia un nombre de variable a un tipo de datos , por ejemplo:
var x: integer;
- Una expresión produce un valor, por ejemplo:
2 + 2
produce 4 - Una declaración puede asignar una expresión a una variable o usar el valor de una variable para alterar el flujo de control del programa, por ejemplo:
x := 2 + 2; if x = 4 then do_something();
Una crítica de los lenguajes imperativos es el efecto secundario de una declaración de asignación sobre una clase de variables llamadas variables no locales. [22]
Lenguajes declarativos
Los lenguajes de programación declarativos describen qué cálculo se debe realizar y no cómo calcularlo. Los programas declarativos omiten el flujo de control y se consideran conjuntos de instrucciones. Dos amplias categorías de lenguajes declarativos son los lenguajes funcionales y los lenguajes lógicos . El principio detrás de los lenguajes funcionales (como Haskell ) es no permitir efectos secundarios , lo que hace que sea más fácil razonar sobre programas como funciones matemáticas. [22] El principio detrás de los lenguajes lógicos (como Prolog ) es definir el problema a resolver - el objetivo - y dejar la solución detallada al propio sistema Prolog. [23] El objetivo se define proporcionando una lista de subobjetivos. Luego, cada subobjetivo se define proporcionando además una lista de sus subobjetivos, etc. Si un camino de subobjetivos no logra encontrar una solución, entonces ese subobjetivo se retrocede y se intenta sistemáticamente otro camino.
Recopilación e interpretación
Un programa informático en forma de lenguaje de programación informático legible por humanos se denomina código fuente . El código fuente puede ser convertido en una imagen ejecutable por un compilador o ensamblador , o ejecutado inmediatamente con la ayuda de un intérprete .
Los compiladores se utilizan para traducir el código fuente de un lenguaje de programación a código objeto o código máquina . [24] El código de objeto necesita más procesamiento para convertirse en código de máquina, y el código de máquina consiste en las instrucciones nativas de la unidad central de procesamiento , listas para su ejecución. Los programas de computadora compilados se denominan comúnmente ejecutables, imágenes binarias o simplemente binarios , una referencia al formato de archivo binario utilizado para almacenar el código ejecutable.
Algunos programas de objetos compilados y ensamblados deben combinarse como módulos con una utilidad de enlace para producir un programa ejecutable.
Los intérpretes se utilizan para ejecutar el código fuente de un lenguaje de programación línea por línea. El intérprete decodifica cada declaración y realiza su comportamiento. Una ventaja de los intérpretes es que pueden ampliarse fácilmente a una sesión interactiva . Al programador se le presenta un mensaje, y las líneas individuales de código se escriben y ejecutan inmediatamente.
La principal desventaja de los intérpretes es que los programas de computadora se ejecutan más lentamente que cuando se compilan. La interpretación del código es más lenta porque el intérprete debe decodificar cada declaración y luego ejecutarla. Sin embargo, el desarrollo de software puede ser más rápido con un intérprete porque la prueba es inmediata cuando se omite el paso de compilación. Otra desventaja de los intérpretes es que un intérprete debe estar presente en la computadora de ejecución. Por el contrario, los programas de computadora compilados no necesitan un compilador presente durante la ejecución.
Los compiladores Just in Time precompilan programas informáticos justo antes de su ejecución. Por ejemplo, el Hotspot de la máquina virtual Java contiene un compilador Just In Time que compila selectivamente el código de bytes de Java en código de máquina, pero es probable que solo se use muchas veces el código que predice Hotspot.
Los programas compilados o interpretados pueden ejecutarse en un proceso por lotes sin interacción humana.
Los lenguajes de secuencias de comandos se utilizan a menudo para crear procesos por lotes. Un lenguaje de programación común es el shell de Unix , y su entorno de ejecución se denomina interfaz de línea de comandos .
Ninguna propiedad de un lenguaje de programación requiere que sea compilado o interpretado exclusivamente. La categorización generalmente refleja el método más popular de ejecución del lenguaje. Por ejemplo, Java se considera un lenguaje interpretado y C un lenguaje compilado, a pesar de la existencia de compiladores de Java e intérpretes de C.
Almacenamiento y ejecución
Típicamente, los programas de ordenador se almacenan en la memoria no volátil hasta que se solicite, ya sea directa o indirectamente a ser ejecutado por el usuario de la computadora. Ante tal solicitud, el programa se carga en la memoria de acceso aleatorio , mediante un programa de computadora llamado sistema operativo , donde el procesador central puede acceder a él directamente. El procesador central luego ejecuta ("ejecuta") el programa, instrucción por instrucción, hasta la terminación. Un programa en ejecución se llama proceso . [25] La rescisión se produce por autoterminación normal, por intervención del usuario o por error: error de software o hardware.
Ejecución simultanea
Muchos sistemas operativos admiten la multitarea, lo que permite que muchos programas de computadora parezcan ejecutarse simultáneamente en una computadora. Los sistemas operativos pueden ejecutar múltiples programas a través de la programación de procesos , un mecanismo de software para cambiar la CPU entre procesos a menudo para que los usuarios puedan interactuar con cada programa mientras se ejecuta. [26] Dentro del hardware, las computadoras con multiprocesador de hoy en día o las computadoras con procesadores multinúcleo pueden ejecutar múltiples programas. [27]
Programas auto modificables
Un programa de computadora en ejecución normalmente se trata como si fuera diferente de los datos con los que opera el programa. Sin embargo, en algunos casos, esta distinción se desdibuja cuando un programa de computadora se modifica a sí mismo. El programa de computadora modificado se ejecuta posteriormente como parte del mismo programa. El código de modificación automática es posible para programas escritos en código máquina , lenguaje ensamblador , Lisp , C , COBOL , PL / 1 y Prolog .
Categorías funcionales
Los programas de computadora pueden clasificarse según líneas funcionales. Las principales categorías funcionales son el software de aplicación y el software del sistema . El software del sistema incluye el sistema operativo que combina el hardware de la computadora con el software de la aplicación. [28] El propósito del sistema operativo es proporcionar un entorno en el que el software de aplicación se ejecute de manera conveniente y eficiente. [28] Además del sistema operativo, el software del sistema incluye programas integrados , programas de arranque y microprogramas . El software de aplicación diseñado para usuarios finales tiene una interfaz de usuario . El software de aplicación no diseñado para el usuario final incluye middleware , que combina una aplicación con otra. El software de aplicación también incluye programas de utilidad . La distinción entre software de sistema y software de aplicación está en debate.
Software de la aplicacion
Hay muchos tipos de software de aplicación:
- La palabra aplicación nació en el siglo XXI. Es un recorte de la palabra "aplicación". Se han diseñado para muchas plataformas, pero la palabra se utilizó por primera vez para aplicaciones móviles más pequeñas. Las aplicaciones de escritorio son programas informáticos tradicionales que se ejecutan en computadoras de escritorio . Las aplicaciones móviles se ejecutan en dispositivos móviles . Las aplicaciones web se ejecutan dentro de un navegador web . Tanto las aplicaciones móviles como las de escritorio pueden descargarse del sitio web de los desarrolladores o comprarse en tiendas de aplicaciones como Microsoft Store , Apple App Store , Mac App Store , Google Play o Intel AppUp .
- Un conjunto de aplicaciones consta de varias aplicaciones agrupadas. Los ejemplos incluyen Microsoft Office , LibreOffice e iWork . Incluyen un procesador de texto, una hoja de cálculo y otras aplicaciones.
- Las aplicaciones empresariales agrupan aplicaciones de contabilidad, personal, clientes y proveedores. Los ejemplos incluyen la planificación de recursos empresariales , la gestión de relaciones con los clientes y el software de gestión de la cadena de suministro .
- El software de infraestructura empresarial es compatible con los sistemas de software de la empresa . Los ejemplos incluyen bases de datos, servidores de correo electrónico y servidores de red.
- El software para trabajadores de la información está diseñado para trabajadores a nivel departamental. Los ejemplos incluyen gestión del tiempo , gestión de recursos , herramientas analíticas, colaborativas y de documentación. Los procesadores de texto, las hojas de cálculo, los clientes de blogs y correo electrónico, el sistema de información personal y los editores de medios individuales pueden ayudar en múltiples tareas de los trabajadores de la información.
- El software de desarrollo de medios genera medios impresos y electrónicos para que otros los consuman, con mayor frecuencia en un entorno comercial o educativo. Estos producen gráficos, publicaciones, animaciones y videos.
- El software de ingeniería de productos se utiliza para ayudar a desarrollar máquinas grandes y otro software de aplicación. Los ejemplos incluyen diseño asistido por computadora (CAD), ingeniería asistida por computadora (CAE) y entornos de desarrollo integrados .
- Software de entretenimiento puede referirse a videojuegos, grabadoras y reproductores de películas y grabadoras y reproductores de música.
Programas de utilidad
Los programas de utilidad son programas de aplicación diseñados para ayudar a los administradores de sistemas y programadores de computadoras .
Sistema operativo
Un sistema operativo es el software de bajo nivel que admite las funciones básicas de una computadora, como programar tareas y controlar periféricos. [28]
En la década de 1950, el programador, que también era el operador, escribía un programa y lo ejecutaba. Una vez que el programa terminó de ejecutarse, es posible que la salida se haya impreso o que se haya perforado en cinta de papel o tarjetas para su posterior procesamiento. [18] La mayoría de las veces el programa no funcionó. El programador luego miró las luces de la consola y jugueteó con los interruptores de la consola. Si era menos afortunado, se hizo una copia impresa de la memoria para su posterior estudio. En la década de 1960, los programadores redujeron la cantidad de tiempo perdido al automatizar el trabajo del operador. Un programa llamado sistema operativo se mantuvo en la computadora en todo momento. [29]
Originalmente, los sistemas operativos se programaban en ensamblador ; Sin embargo, los sistemas operativos modernos son típicamente escritos en C .
Programa de arranque
Una computadora con programa almacenado requiere un programa de computadora inicial almacenado en su memoria de solo lectura para arrancar . El proceso de arranque consiste en identificar e inicializar todos los aspectos del sistema, desde los registros del procesador hasta los controladores de dispositivos y el contenido de la memoria . [30] Después del proceso de inicialización, este programa de computadora inicial carga el sistema operativo y configura el contador del programa para comenzar las operaciones normales.
Programas integrados
Independientemente de la computadora host, un dispositivo de hardware puede tener un firmware integrado para controlar su funcionamiento. El firmware se usa cuando el programa de computadora rara vez o nunca se espera que cambie, o cuando el programa no debe perderse cuando la energía está apagada. [29]
Programas de microcódigo
Los programas de microcódigo controlan algunas unidades centrales de procesamiento y algún otro hardware. Este código mueve datos entre los registros , buses , unidades lógicas aritméticas y otras unidades funcionales en la CPU. A diferencia de los programas convencionales, el microcódigo no suele estar escrito por los usuarios finales de los sistemas, ni siquiera es visible para ellos, y normalmente lo proporciona el fabricante y se considera interno al dispositivo.
Ver también
- Inteligencia artificial
- Programacion automatica
- Virus de computadora
- Firmware
- Aplicación asesina
- Software
- Error de programación
- Fase del ciclo de vida del programa
Referencias
- ^ Rochkind, Marc J. (2004). Programación avanzada de Unix, segunda edición . Addison-Wesley. pag. 1.1.2.
- ^ Dooley, John F. (2013). Una breve historia de la criptología y los algoritmos criptográficos . Springer Science & Business Media. págs. 12–3. ISBN 9783319016283.
- ^ Koetsier, Teun (2001), "Sobre la prehistoria de las máquinas programables: autómatas musicales, telares, calculadoras", Mecanismo y teoría de máquinas , Elsevier, 36 (5): 589–603, doi : 10.1016 / S0094-114X (01) 00005 -2 .
- ^ Kapur, Ajay; Carnegie, Dale; Murphy, Jim; Long, Jason (2017). "Altavoces opcionales: una historia de la música electroacústica no basada en altavoces" . Sonido organizado . Prensa de la Universidad de Cambridge . 22 (2): 195-205. doi : 10.1017 / S1355771817000103 . ISSN 1355-7718 .
- ^ Noel Sharkey (2007), Un robot programable del siglo XIII , Universidad de Sheffield
- ^ a b c McCartney, Scott (1999). ENIAC - Los triunfos y tragedias de la primera computadora del mundo . Walker and Company. pag. 16 . ISBN 978-0-8027-1348-3.
- ^ Bromley, Allan G. (1998). "Motor analítico de Charles Babbage, 1838" (PDF) . IEEE Annals of the History of Computing . 20 (4).
- ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición . Prentice Hall. pag. 15 . ISBN 978-0-13-854662-5.
- ^ J. Fuegi; J. Francis (octubre-diciembre de 2003), "Lovelace & Babbage y la creación de las 'notas ' de 1843 ", Annals of the History of Computing , 25 (4): 16, 19, 25, doi : 10.1109 / MAHC.2003.1253887
- ^ Rosen, Kenneth H. (1991). Matemáticas discretas y sus aplicaciones . McGraw-Hill, Inc. pág. 654 . ISBN 978-0-07-053744-6.
- ^ Linz, Peter (1990). Introducción a los lenguajes formales y los autómatas . DC Heath and Company. pag. 234. ISBN 978-0-669-17342-0.
- ^ Davis, Martin (2000), Engines of Logic: Mathematicians and the origin of the Computer (1a ed.), Nueva York NY: WW Norton & Company, ISBN 978-0-393-32229-3, (pb.)
- ^ "Historia de la Computación" .
- ^ a b c d McCartney, Scott (1999). ENIAC - Los triunfos y tragedias de la primera computadora del mundo . Walker and Company. pag. 102 . ISBN 978-0-8027-1348-3.
- ^ Frink, Brenda D. (1 de junio de 2011). "El investigador revela cómo" Computer Geeks "reemplazó a" Computer Girls " " . Noticias de género . Universidad Stanford. Archivado desde el original el 12 de marzo de 2015 . Consultado el 22 de octubre de 2018 .
- ^ Bartik, Jean Jennings (2013). Rickman, Jon; Todd, Kim D. (eds.). Programador pionero: Jean Jennings Bartik y la computadora que cambió el mundo . Prensa de la Universidad Estatal de Truman.
- ^ Enticknap, Nicholas (verano de 1998), "Computing's Golden Jubilee" , Resurrection (20), ISSN 0958-7403 , archivado desde el original el 9 de enero de 2012 , consultado el 19 de abril de 2008
- ^ a b Silberschatz, Abraham (1994). Conceptos del sistema operativo, cuarta edición . Addison-Wesley. pag. 6. ISBN 978-0-201-50480-4.
- ^ Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición . Prentice Hall. pag. 20 . ISBN 978-0-13-854662-5.
- ^ a b Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición . Prentice Hall. pag. 21 . ISBN 978-0-13-854662-5.
- ^ Wilson, Leslie B. (1993). Lenguajes de programación comparados, segunda edición . Addison-Wesley. pag. 75. ISBN 978-0-201-56885-1.
- ^ a b Wilson, Leslie B. (1993). Lenguajes de programación comparados, segunda edición . Addison-Wesley. pag. 213. ISBN 978-0-201-56885-1.
- ^ Wilson, Leslie B. (1993). Lenguajes de programación comparados, segunda edición . Addison-Wesley. pag. 244. ISBN 978-0-201-56885-1.
- ^ "¿Qué es un compilador?" . Consultado el 10 de enero de 2012 .
- ^ Silberschatz, Abraham (1994). Conceptos del sistema operativo, cuarta edición . Addison-Wesley. pag. 97. ISBN 978-0-201-50480-4.
- ^ Silberschatz, Abraham (1994). Conceptos del sistema operativo, cuarta edición . Addison-Wesley. pag. 100. ISBN 978-0-201-50480-4.
- ^ Akhter, Shameem (2006). Programación multinúcleo . Richard Bowles (Intel Press). págs. 11-13. ISBN 978-0-9764832-4-3.
- ^ a b c Silberschatz, Abraham (1994). Conceptos del sistema operativo, cuarta edición . Addison-Wesley. pag. 1. ISBN 978-0-201-50480-4.
- ^ a b Tanenbaum, Andrew S. (1990). Organización informática estructurada, tercera edición . Prentice Hall. pag. 11 . ISBN 978-0-13-854662-5.
- ^ Silberschatz, Abraham (1994). Conceptos del sistema operativo, cuarta edición . Addison-Wesley. pag. 30. ISBN 978-0-201-50480-4.
Otras lecturas
- Knuth, Donald E. (1997). El arte de la programación informática, volumen 1, tercera edición . Boston: Addison-Wesley. ISBN 978-0-201-89683-1.
- Knuth, Donald E. (1997). El arte de la programación informática, volumen 2, tercera edición . Boston: Addison-Wesley. ISBN 978-0-201-89684-8.
- Knuth, Donald E. (1997). El arte de la programación informática, volumen 3, tercera edición . Boston: Addison-Wesley. ISBN 978-0-201-89685-5.