# Algoritmia y programación básica/Aspectos introductorios

La Computación es una ciencia, en particular una rama de la Matemática que centra su interés en el estudio y definición formal de los cómputos.
Se le llama cómputo a la obtención de una solución o resultado (generalmente en el sentido matemático/aritmético del término), a partir de ciertos datos o entradas utilizando para ello un proceso o algoritmo.

# Reseña Histórica de la Computación

Desde épocas antiguas, los cómputos han existido y se han efectuado de manera mental o asistida por rudimentos como cuentas, lápiz y papel, o tablas.
Los antecedentes de la computación mecánica, pueden trazarse hasta épocas antiguas, con el desarrollo de artefactos para asistir el proceso de los cálculos matemáticos mentales, por ejemplo el ábaco, la regla de cálculo o el quipu.
Aunque quizás sea más propicia como ejemplo precursor, la célebre calculadora griega de Antikythera, utilizada según los expertos para asistir en cálculos astronómicos, y considerada por muchos como la primera computadora. Otro ejemplo precursor son las máquinas sumadoras de Blaise Pascal. Aparatos que demuestran una notable pericia de sus creadores en el conocimiento sobre la forma de elaborar los cálculos deseados, al grado de poder representarlos en la forma de mecanismos más o menos elaborados.
Sin embargo, la teoría de la computación como ciencia comienza propiamente a principios del siglo XX, poco antes que las computadoras electrónicas fuesen inventadas.
En esa época varios matemáticos se preguntaban qué clase de problemas de la matemática, podían resolverse por "métodos simples" y cuales no. Y para ello debían en principio desarrollar una definición de "método para resolver problemas", es decir, necesitaban el desarrollo de una noción formal (matemática) de lo que es un cálculo/algoritmo.y la aritmética lógica.
Durante el siglo XIX y XX diversas corrientes filosóficas allanaron el camino de la computación a partir de las definiciones de sistemas formales. Destacando Kurt Gödel y Bertrand Russell entre otros.
Varias definiciones y modelos formales de lo que es un cálculo fueron propuestos por precursores del dominio como Alan Turing y Alonzo Church; entre esos modelos están la máquina de Turing, las funciones recursivas, y el cálculo Lambda. Todos los cuales se ha demostrado posteriormente que son equivalentes en expresividad computacional, es decir, todos pueden representar la misma clase de cómputos o algoritmos, aunque lo hagan de maneras diferentes.
Se asume normalmente que las computadoras electrónicas son también equivalentes en capacidad de cómputo a cualquiera de esos tres modelos mencionados anteriormente (si se asume que una computadora puede tener memoria infinita), pero no existe una prueba formal de ello (igualmente que no existen contraejemplos), por tal razón a tal presunción razonable se le conoce como la conjetura de Church-Turing.
De allí la relevancia del estudio de las máquinas de Turing, pues gracias a tal conjetura ampliamente aceptada como verdadera, todo problema de cómputo que sea resoluble en una máquina de Turing, se considera que también lo será en una computadora, y viceversa.
Es meritorio el hecho que gracias a la equivalencia de máquinas de Turing y computadoras, se haya determinado que existen cálculos que no pueden ser resueltos en un tiempo razonable en ninguna computadora imaginable, o incluso, que no pueden resolverse en lo absoluto, por ejemplo el problema de correspondencia de Post o el problema de predecir si una máquina de Turing cualquiera va a llegar a un estado final (conocido como el problema del halting en inglés, o problema de la parada).
Otros temas de interés de la teoría de la computación, son la cantidad de tiempo o la cantidad de memoria necesaria para realizar un cálculo dado. Se ha determinado que existen cómputos resolubles, pero que necesitan cantidades irrealistas de tiempo o memoria para poder efectuarse. Es sumamente importante para los especialistas del dominio conocer la complejidad computacional de un algoritmo, pues ésta determinará la aplicabilidad del mismo.
Otro interés de esta ciencia, son los modelos reducidos de cómputo, que son en realidad casos particulares de una máquina de Turing. Como lo son las máquinas de estado finito esbozadas primero por Warren McCulloch y Walter Pitts en 1943, y los autómatas con pila.

# Perfil de algunas Profesiones en Computación

* Ingeniero de Sistemas, se ocupa del diseño, programación, implementación y mantenimiento de sistemas.
* Ingeniero en Computación, se ocupa de la naturaleza y características de la información, su estructura y clasificación, su almacenamiento y recuperación y los diversos procesos a los que puede someterse en forma automatizada.
* Ingeniero en Informática, se ocupa de analizar, diseñar e instrumentar sistemas de información.
* Analista y Diseñador de Sistemas, planifica, elabora y coordina los procesos automáticos y manuales asociados a los sistemas.
* Ingeniero en Mecatronica.

# Computador

Un computador (del latín computare -calcular-), también denominado como ordenador o computadora, tiene como meta principal, la de recibir y procesar datos para convertirlos en información útil. Un computador es una colección de circuitos integrados y otros componentes relacionados que puede ejecutar con exactitud, sorprendente rapidez, y de acuerdo a lo indicado por un usuario o automáticamente por otro programa, una múltiple variedad de secuencias o rutinas de instrucciones que son ordenadas, organizadas y sistematizadas en función a una amplia gama de aplicaciones prácticas y precisamente determinadas, proceso al cual se le ha denominado con el nombre de programación y al que lo realiza se le llama programador. La computadora u ordenador, además de la rutina o programa informático, necesita de datos específicos (a estos datos, en conjunto, se les conoce como "Input" en inglés) que deben ser suministrados, y que son requeridos al momento de la ejecución, para proporcionar el producto final del procesamiento de datos, que recibe el nombre de "output". La información puede ser entonces utilizada, reinterpretada, copiada, transferida, o retransmitida a otra(s) persona(s), computadora(s) o componente(s) electrónico(s) local o remotamente usando diferentes sistemas de telecomunicación, pudiendo ser grabada, salvada o almacenada en algún tipo de dispositivo o unidad de almacenamiento
La característica principal que la distingue de otros dispositivos similares, como una calculadora no programable, es que puede realizar tareas muy diversas cargando distintos programas en la memoria para que el microprocesador los ejecute.

# Organización Básica de un Computador

Aunque las tecnologías empleadas en las computadoras digitales han cambiado mucho desde que aparecieron los primeros modelos en los años 40, la mayoría todavía utiliza la arquitectura Eckert-Mauchly, publicada a principios de los años 1940 por John von Neumann pero que fue creada por John Presper Eckert y John William Mauchly.
La arquitectura Eckert-Mauchly describe una computadora con 4 secciones principales: la unidad lógica y aritmética (ALU por sus siglas del inglés: Arithmetic Logic Unit), la unidad de control, la memoria, y los dispositivos de entrada y salida (E/S). Estas partes están interconectadas por un conjunto de cables denominados buses:
* La memoria es una secuencia de celdas de almacenamiento numeradas, donde cada una es un bit o unidad de información. La instrucción es la información necesaria para realizar lo que se desea con el computador. Las «celdas» contienen datos que se necesitan para llevar a cabo las instrucciones, con el ordenador. El número de celdas varían mucho de computador a computador, y las tecnologías empleadas para la memoria han cambiado bastante; van desde los relés electromecánicos, tubos llenos de mercurio en los que se formaban los pulsos acústicos, matrices de imanes permanentes, transistores individuales a circuitos integrados con millones de celdas en un solo chip. En general, la memoria puede ser reescrita varios millones de veces (memoria RAM); se parece más a una pizarra que a una lápida (memoria ROM) que sólo puede ser escrita una vez.
* El procesador (también llamado Unidad central de procesamiento o CPU) consta de:
   * La unidad lógica y aritmética o ALU es el dispositivo diseñado y construido para llevar a cabo las operaciones elementales como las operaciones aritméticas (suma, resta), operaciones lógicas (Y, O, NO), y operaciones de comparación o relacionales. En esta unidad es en donde se hace todo el trabajo computacional.
   * La unidad de control sigue la dirección de las posiciones en memoria que contienen la instrucción que el computador va a realizar en ese momento; recupera la información poniéndola en la ALU para la operación que debe desarrollar. Transfiere luego el resultado a ubicaciones apropiadas en la memoria. Una vez que ocurre lo anterior, la unidad de control va a la siguiente instrucción (normalmente situada en la siguiente posición, a menos que la instrucción sea una instrucción de salto, informando a la computadora de que la próxima instrucción estará ubicada en otra posición de la memoria).
* Los dispositivos E/S sirven a la computadora para obtener información del mundo exterior y/o comunicar los resultados generados por el computador al exterior. Hay una gama muy extensa de dispositivos E/S como teclados, monitores, y unidades de disco flexible o cámara web.

# Sistemas de Cómputo

Un sistema de cómputo es un conjunto de elementos electrónicos que interactúan entre sí, para procesar y almacenar información de acuerdo a una serie de instrucciones.

## Hardware

Hardware es un neologismo proveniente del inglés definido por la RAE como el conjunto de elementos materiales que conforman una computadora, sin embargo, es usual que sea utilizado en una forma más amplia, generalmente para describir componentes físicos de una tecnología, así el hardware puede ser de un equipo militar importante, un equipo electrónico, un equipo informático o un robot. En informática también se aplica a los periféricos de una computadora tales como el disco duro, CD-ROM, disquetera (floppy), etc... En dicho conjunto se incluyen los dispositivos electrónicos y electromecánicos, circuitos, cables, armarios o cajas, periféricos de todo tipo y cualquier otro elemento físico involucrado.
El hardware se refiere a todos los componentes físicos (que se pueden tocar), en el caso de una computadora personal serían los discos, unidades de disco, monitor, teclado, la placa base, el microprocesador, étc. En cambio, el software es intangible, existe como información, ideas, conceptos, símbolos, pero no ocupa un espacio físico, se podría decir que no tiene sustancia. Una buena metáfora sería un libro: las páginas y la tinta son el hardware, mientras que las palabras, oraciones, párrafos y el significado del texto (información) son el software. Una computadora sin software sería tan inútil como un libro con páginas en blanco.

## Software

Se denomina software (palabra de origen anglosajón, pronunciada "sóft-uer"), programa, equipamiento lógico o soporte lógico a todos los componentes intangibles de una computadora, es decir, al conjunto de programas y procedimientos necesarios para hacer posible la realización de una tarea específica, en contraposición a los componentes físicos del sistema (hardware). Esto incluye aplicaciones informáticas tales como un procesador de textos, que permite al usuario realizar una tarea, y software de sistema como un sistema operativo, que permite al resto de programas funcionar adecuadamente, facilitando la interacción con los componentes físicos y el resto de aplicaciones.
Probablemente la definición más formal de software es la atribuida a la IEEE en su estándar 729: «la suma total de los programas de cómputo, procedimientos, reglas documentación y datos asociados que forman parte de las operaciones de un sistema de cómputo». Bajo esta definición, el concepto de software va más allá de los programas de cómputo en sus distintas formas: código fuente, binario o ejecutable, además de su documentación: es decir, todo lo intangible.
El término «software» fue usado por primera vez en este sentido por John W. Tukey en 1957. En las ciencias de la computación y la ingeniería de software, el software es toda la información procesada por los sistemas informáticos: programas y datos. El concepto de leer diferentes secuencias de instrucciones de la memoria de un dispositivo para controlar cálculos fue inventado por Charles Babbage como parte de su máquina diferencial. La teoría que forma la base de la mayor parte del software moderno fue propuesta por vez primera por Alan Turing en su ensayo de 1936, Los números computables, con una aplicación al problema de decisión.

## Firmware

Firmware o Programación en Firme, es un bloque de instrucciones de programa para propósitos específicos, grabado en una memoria tipo ROM, que establece la lógica de más bajo nivel que controla los circuitos electrónicos de un dispositivo de cualquier tipo. Al estar integrado en la electrónica del dispositivo es en parte hardware, pero también es software, ya que proporciona lógica y se dispone en algún tipo de lenguaje de programación. Funcionalmente, el firmware es el intermediario (interfaz) entre las órdenes externas que recibe el dispositivo y su electrónica, ya que es el encargado de controlar a ésta última para ejecutar correctamente dichas órdenes externas(...)
Encontramos Firmware en memorias ROM de los sistemas de diversos dispositivos periféricos, como en monitores de video, unidades de disco, impresoras, etc., pero también en los propios microprocesadores, chips de memoria principal y en general en cualquier circuito integrado.
Muchos de los Firmwares almacenados en ROM están protegidos por Derechos de Autor.
El programa BIOS de un ordenador es un firmware cuyo propósito es activar una máquina desde su encendido y preparar el entorno para la instalación de un Sistema Operativo complejo, así como responder a otros eventos externos (botones de pulsación humana) y al intercambio de órdenes entre distintos componentes del ordenador.
En un microprocesador el firmware es el que recibe las instrucciones de los programas y las ejecuta en la compleja circuitería del mismo, emitiendo órdenes a otros dispositivos del sistema.

## Wetware

El término wetware es usado para describir la integración de conceptos de la construcción física conocida como "sistema nervioso central" y la construcción mental conocida como la "mente humana". Wetware es una abstracción de dos partes de un humano vistas desde los conceptos informáticos del hardware y el software.
En las computadoras se puede separar perfectamente el hardware del software, en cambio el sistema cerebro-mente (hardware-software) es un sistema auto-organizado que se modifica de manera dinámica y continua (proceso de aprendizaje).
El hardware vendría a ser el cerebro, la estructura, las neuronas, en tanto el sofwate sería la mente y los procesos mentales.
El "hardware" sólo incumbe propiedades bioeléctricas y bioquímicas del sistema nervioso central, específicamente el cerebro. Si los impulsos que viajan por varias neuronas fuese el software, entonces las neuronas físicas podrían ser el hardware.
La interacción fusionada del hardware y el software se manifiesta a través de continuos cambios de conexiones físicas e influencias físicas y químicas, propagándose a través de de amplios espectros de áreas supuestamente sin relación. Esta interacción requiere un nuevo término que excede la definición de esos términos individuales.
El "software" es relegado a un nivel conceptual superior, en este caso la analogía sería entre la mente humana y el software.
La intrincada interacción entre el ámbito físico y el ámbito mental es observable en muchos ejemplos. La combinación de esos conceptos son expresados en el término wetware.

# Evolución Histórica del Computador

La computadora o computador no es invento de alguien en especial, sino el resultado de ideas y realizaciones de muchas personas relacionadas con la electrónica, la mecánica, los materiales semiconductores, la lógica, el álgebra y la programación.

## Línea Cronológica

Los primeros artilugios de cálculo, se remontan a 3000 adC. Los babilonios que habitaron en la antigua Mesopotamia empleaban unas pequeñas bolas hechas de semillas o pequeñas piedras, a manera de "cuentas" agrupadas en carriles de caña.
Posteriormente, en el año 1800 adC, un matemático babilónico inventó los algoritmos que permitieron resolver problemas de cálculo numérico. Algoritmo es un conjunto ordenado de operaciones propias de un cálculo.
Los chinos desarrollaron el ábaco, con éste realizaban cálculos rápidos y complejos. Éste instrumento tenía un marco de madera cables horizontales con bolas agujereadas que corrían de izquierda a derecha.
En el siglo XVII, John Napier, matemático escocés famoso por su invención de los logaritmos (unas funciones matemáticas que permiten convertir las multiplicaciones en sumas y las divisiones en restas) inventó un dispositivo de palillos con números impresos que, merced a un ingenioso y complicado mecanismo, le permitía realizar operaciones de multiplicación y división.
En 1642 el físico y matemático francés Blaise Pascal inventó el primer calculador mecánico, la pascalina. A los 18 años de edad, deseando reducir el trabajo de cálculo de su padre, funcionario de impuestos, fabricó un dispositivo de 8 ruedas dentadas en el que cada una hacía avanzar un paso a la siguiente cuando completaba una vuelta. Estaban marcadas con números del 0 al 9 y había dos para los decimales, con lo que podía manejar números entre 000000,01 y 999999,99. Giraban mediante una manivela, con lo que para sumar o restar había que darle el número de vueltas correspondiente en un sentido o en otro. Treinta años después el filósofo y matemático alemán Leibnitz inventó una máquina de calcular que podía multiplicar, dividir y obtener raíces cuadradas en sistema binario. A los 26 años aprendió matemáticas de manera autodidáctica y procedió a inventar el cálculo infinitesimal, honor que comparte con Newton.
En 1801 el francés Joseph Marie Jacquard, utilizó un mecanismo de tarjetas perforadas para controlar el dibujo formado por los hilos de las telas confeccionadas por una máquina de tejer. Estas plantillas o moldes metálicos perforados permitían programar las puntadas del tejido, logrando obtener una diversidad de tramas y figuras.
Charles Babbage (1793-1871) creó un motor analítico que permitía sumar, sustraer, multiplicar y dividir a una velocidad de 60 sumas por minuto. En 1842 Lady Ada Augusta Lovelace, interesada por sus investigaciones, contribuyó a desarrollar esta maquinaria a partir de la idea de que las tarjetas perforadas se adaptaran de manera que causaran que el motor de Babbage repitiera ciertas operaciones. La culminación de esta investigación llegó en 1843, cuando Lady Ada escribió un artículo firmado tan solo con las iniciales AAL (como tantas otras mujeres de su época), que se convertiría en su gran legado intelectual, pues en él la matemática especula, imagina, aclara y desarrolla las ideas de la máquina analítica. Debido a este logro algunos consideran a Lady Lovelace la primera programadora de la historia, y en su conmemoración se declaró el 15 de octubre como el día de Ada Lovelace, dedicado a reconocer el trabajo de las mujeres en la ciencia, las matemáticas y la tecnología.
En 1879, a los 19 años de edad, Herman Hollerith fue contratado como asistente en las oficinas del censo estadounidense y desarrolló un sistema de cómputo mediante tarjetas perforadas en las que los agujeros representaban el sexo, la edad, raza, entre otros. Gracias a la máquina tabuladora de Hollerith el censo de 1890 se realizó en dos años y medio, cinco menos que el censo de 1880.
Hollerith dejó las oficinas del censo en 1896 para fundar su propia Compañía: la Tabulating Machine Company. En 1900 había desarrollado una máquina que podía clasificar 300 tarjetas por minuto (en vez de las 80 cuando el censo), una perforadora de tarjetas y una máquina de cómputo semiautomática. En 1924 Hollerith fusionó su compañía con otras dos para formar la International Business Machines hoy mundialmente conocida como IBM.

### Calculador digital

A comienzos de los años 30, John Vincent Atanasoff, un estadounidense doctorado en física teórica, hijo de un ingeniero eléctrico emigrado de Bulgaria y de una maestra de escuela, se encontró con que los problemas que tenía que resolver requerían una excesiva cantidad de cálculo. Aficionado a la electrónica y conocedor de la máquina de Pascal y las teorías de Babbage, empezó a considerar la posibilidad de construir un calculador digital. Decidió que la máquina habría de operar en sistema binario, y hacer los cálculos de modo distinto a como los realizaban las calculadoras mecánicas.
Con 650 dólares donados por el Consejo de Investigación del Estado de Iowa, contrató la cooperación de Clifford Berry, estudiante de ingeniería, y los materiales para un modelo experimental. Posteriormente recibió otras donaciones que sumaron 6460 dólares. Este primer aparato fue conocido como ABC Atanasoff- Berry-Computer
Prácticamente al mismo tiempo que Atanasoff, el ingeniero John Mauchly, se había encontrado con los mismos problemas en cuanto a velocidad de cálculo, y estaba convencido de que habría una forma de acelerar el proceso por medios electrónicos. Al carecer de medios económicos, construyó un pequeño calculador digital y se presentó al congreso de la Asociación Americana para el Avance de la Ciencia para presentar un informe sobre el mismo. Allí, en diciembre de 1940, se encontró con Atanasoff, y el intercambio de ideas que tuvieron originó una disputa sobré la paternidad del computador digital.

## Segunda Guerra Mundial

En 1940 Mauchly se matriculó en unos cursos en la Escuela Moore de Ingeniería Eléctrica de la Universidad de Pensilvania, donde conoció a John Presper Eckert, un instructor de laboratorio. La escuela Moore trabajaba entonces en un proyecto conjunto con el ejército para realizar unas tablas de tiro para armas balísticas. La cantidad de cálculos necesarios era inmensa, tanto que se demoraba unos treinta días en completar una tabla mediante el empleo de una máquina de cálculo analógica. Aun así, esto era unas 50 veces más rápido de lo que tardaba un hombre con una sumadora de sobremesa.

### ENIAC

Mauchly publicó un artículo con sus ideas y las de Atanasoff, lo cual despertó el interés de Herman Goldstine, un oficial de la reserva que hacía de intermediario entre la universidad y el ejército, el cual consiguió interesar al Departamento de Ordenación en la financiación de un computador electrónico digital. El 9 de abril de 1943 se autorizó a Mauchly y Eckert iniciar el desarrollo del proyecto. Se le llamó Electronic Numerical integrator and Computer (ENIAC) y comenzó a funcionar en las instalaciones militares norteamericanas del campo Aberdeen Proving Ground en Agosto de 1947. La construcción tardó 4 años y costó $486.804,22 dólares (el equivalente actual a unos tres millones de dólares por menos poder de cómputo del que actualmente se consigue en las calculadoras de mano).
El ENIAC tenía 19.000 tubos de vacío, 1500 relés, 7500 interruptores, cientos de miles de resistencias, condensadores e inductores y 800 kilómetros de alambres, funcionando todo a una frecuencia de reloj de 100.000 ciclos por segundo. Tenía 20 acumuladores de 10 dígitos, era capaz de sumar, restar, multiplicar y dividir, y tenía tres tablas de funciones. La entrada y la salida de datos se realizaba mediante tarjetas perforadas. Podía realizar unas 5000 sumas por segundo. Pesaba unas 30 toneladas y tenía un tamaño equivalente al de un salón de clases. Consumía 200 kilovatios de potencia eléctrica y necesitaba un equipo de aire acondicionado para disipar el gran calor que producía. En promedio, cada tres horas de uso fallaba una de las válvulas.
Lo que caracterizaba al ENIAC como a un computador moderno no era simplemente su velocidad de cálculo, sino el que permitía realizar tareas que antes eran imposibles.

### Mark 1

Entre 1939 y 1944, Howard Aiken de la Universidad de Harvard, en colaboración con IBM, desarrolló el Mark 1, conocido como Calculadora Automática de Secuencia Controlada. Fue un computador electromecánico de 16 metros de largo y unos 2 de alto. Tenía 700.000 elementos móviles y varios centenares de kilómetros de cables. Podía realizar las cuatro operaciones básicas y trabajar con información almacenada en forma de tablas. Operaba con números de hasta 23 dígitos y podía multiplicar tres números de 8 dígitos en 1 segundo.
El Mark 1, y las versiones que posteriormente se realizaron del mismo, tenían el mérito de asemejarse al tipo de máquina ideado por Babbage, aunque trabajaban en código decimal y no en binario.
El avance que dieron estas máquinas electromecánicas a la informática fue rápidamente ensombrecido por el ENIAC con sus circuitos electrónicos.
Alan Turing, matemático inglés, descifra los códigos secretos Enigma usados por la Alemania nazi para sus comunicaciones. Turing fue un pionero en el desarrollo de la lógica de los computadores modernos, y uno de los primeros en tratar el tema de la inteligencia artificial con máquinas.
Norbert Wiener, trabajó con la defensa antiaérea estadounidense y estudió la base matemática de la comunicación de la información y del control de un sistema para derribar aviones. En 1948 publicó sus resultados en un libro que tituló CYBERNETICS (Cibernética), palabra que provenía del griego "piloto", y que se usó ampliamente para indicar automatización de procesos.

### Computador Z3

El computador Z3, fue la primera máquina programable y completamente automática, características usadas para definir a un computador. Estaba construido con 2200 relés, tenía una frecuencia de reloj de ~5 Hz, y una longitud de palabra de 22 bits. Los cálculos eran realizados con aritmética en coma flotante puramente binaria. La máquina fue completada en 1941 (el 12 de mayo de ese mismo año fue presentada a una audiencia de científicos en Berlín). El Z3 original fue destruido en 1944 durante un bombardeo aliado de Berlín. Una réplica completamente funcional fue construida durante los años 60 por la compañía del creador Zuse KG y está en exposición permanente en el Deutsches Museum. En 1998 se demostró que el Z3 es Turing completo.

## Posguerra
### Cronología

1944
Se construyó el primer ordenador al cual se le llamó Eniac. Era un ordenador electrónico con el cual el proceso de datos, almacenamiento y control de operaciones se realizaba con dispositivos electrónicos,tubos de vacío, que hacen posible el salto del cálculo eléctrico al electrónico.
1946
John von Neumann propuso una versión modificada del ENIAC; el EDVAC, que se construyó en 1952. Esta máquina presentaba dos importantes diferencias respecto al ENIAC: En primer lugar empleaba aritmética binaria, lo que simplificaba enormemente los circuitos electrónicos de cálculo. En segundo lugar, permitía trabajar con un programa almacenado. El ENIAC se programaba enchufando centenares de clavijas y activando un pequeño número de interruptores. Cuando había que resolver un problema distinto, era necesario cambiar todas las conexiones, proceso que llevaba muchas horas.
Von Neumann propuso cablear una serie de instrucciones y hacer que éstas se ejecutasen bajo un control central. Además propuso que los códigos de operación que habían de controlar las operaciones se almacenasen de modo similar a los datos en forma binaria. De este modo el EDVAC no necesitaba una modificación del cableado para cada nuevo programa, pudiendo procesar instrucciones tan deprisa como los datos. Además, el programa podía modificarse a sí mismo, ya que las instrucciones almacenadas, como datos, podían ser manipuladas aritméticamente.
1951
Eckert y Mauchly entregan a la Oficina del Censo su primer computador: el UNIVAC I. Posteriormente aparecería el UNIVAC-II con memoria de núcleos magnéticos, lo que le haría superior a su antecesor, pero, por diversos problemas, esta máquina no vio la luz hasta 1957, fecha en la que había perdido su liderazgo en el mercado frente al 705 de IBM.
1952
Shannon desarrolla el primer ratón eléctrico capaz de salir de un laberinto, primera red neural.
1953
IBM fabricó su primer computadora gran escala, el IBM 650.
1956
Darthmouth da una conferencia en donde nace la inteligencia artificial.
1958
Comienza la segunda generación de computadoras, caracterizadas por usar circuitos transistorizados en vez de válvulas al vacío. Un transistor y una válvula cumplen funciones equivalentes, con lo que cada válvula puede ser reemplazada por un transistor. Un transistor puede tener el tamaño de una lenteja mientras que un tubo de vacío tiene un tamaño mayor que el de un cartucho de escopeta de caza. Mientras que las tensiones de alimentación de los tubos estaban alrededor de los 300 voltios, las de los transistores vienen a ser de 10 voltios, con lo que los demás elementos de circuito también pueden ser de menor tamaño, al tener que disipar y soportar tensiones mucho menores. El transistor es un elemento constituido fundamentalmente por silicio o germanio. Su vida media es prácticamente ilimitada y en cualquier caso muy superior a la del tubo de vacío.
1962
El mundo estuvo al borde de una guerra nuclear entre la Unión Soviética y los Estados Unidos, en lo que se denominó “la Crisis de los misiles de Cuba”. A causa de esto, una de las preocupaciones de las ejército de los Estados Unidos era conseguir una manera de que las comunicaciones fuesen más seguras en caso de un eventual ataque militar con armas nucleares. Como solución entró en consideración solamente el proceso de datos en forma electrónica. Los mismos datos se deberían disponer en diferentes computadores alejados unos de otros. Todos los computadores entrelazados deberían poder enviarse en un lapso corto de tiempo el estado actual de los datos nuevos o modificados, y cada uno debería poder comunicarse de varias maneras con cada otro. Dicha red también debería funcionar si un computador individual o cierta línea fuera destruida por un ataque del enemigo.
Joseph Carl Robnett Licklider escribió un ensayo sobre el concepto de Red Intergaláctica, donde todo el mundo estaba interconectado para acceder a programas y datos desde cualquier lugar del planeta. En Octubre de ese año, Lickider es el primer director de ARPA (Advanced Research Projects Agency), o Agencia de Proyectos de Investigación Avanzada, una organización científica creada en 1958 como contestación a la puesta en orbita por parte de los rusos del primer satélite conocido como Sputnik.
1963
Un comité Industria-Gobierno desarrolla el código de caracteres ASCII, (se pronuncia asqui), el primer estándar universal para intercambio de información (American Standard Code for Information Interchange), lo cual permitió que máquinas de todo tipo y marca pudiesen intercambiar datos.
1964
La aparición del IBM 360 marca el comienzo de la tercera generación. Las placas de circuito impreso con múltiples componentes pasan a ser reemplazadas por los circuitos integrados. Estos elementos son unas plaquitas de silicio llamadas chips, sobre cuya superficie se depositan por medios especiales unas impurezas que hacen las funciones de diversos componentes electrónicos. Esto representa un gran avance en cuanto a velocidad y, en especial, en cuanto a reducción de tamaño. En un chip de silicio no mayor que un centímetro cuadrado caben 64.000 bits de información. En núcleos de ferrita esa capacidad de memoria puede requerir cerca de un litro en volumen.
Investigadores del Instituto Tecnológico de Massachusetts (MIT) y del Laboratorio Nacional de Física de la Gran Bretaña, presentaron simultáneamente soluciones a lo propuesto por las Fuerzas Armadas norteamericanas. Y ese mismo año la Fuerza Aérea le asignó un contrato a la Corporación RAND para la llamada "red descentralizada". Ese proyecto fracasó después de muchos intentos y nunca fue realizado, pero la idea de una red que no dependiese de un sólo punto central y con la transferencia de datos por paquete se quedó anclada en la cabeza de muchas personas.
Paul Baran, quien por ese entonces trabajaba con Rand Corporation, fue uno de los primeros en publicar en Data Communications Networks sus conclusiones en forma casi simultánea con la publicación de la tesis de Kleinrock sobre teoría de líneas de espera. Diseñó una red de comunicaciones que utilizaba computadores y no tenía núcleo ni gobierno central. Además, asumía que todas las uniones que conectaban las redes eran altamente desconfiables.
El sistema de Baran trabajaba con un esquema que partía los mensajes en pequeños pedazos y los metía en sobres electrónicos, llamados "paquetes", cada uno con la dirección del remitente y del destinatario. Los paquetes se lanzaban al seno de una red de computadores interconectados, donde rebotaban de uno a otro hasta llegar a su punto de destino, en el cual se juntaban nuevamente para recomponer el mensaje total. Si alguno de los paquetes se perdía o se alteraba (y se suponía que algunos se habrían de dislocar), no era problema, pues se volvían a enviar.
1966
La organización científica ARPA se decidió a conectar sus propios computadores a la red propuesta por Baran, tomando nuevamente la idea de la red descentralizada. A finales de 1969 ya estaban conectados a la red ARPA los primeros cuatro computadores, y tres años más tarde ya eran 40. En aquellos tiempos era, sin embargo, la red propia de ARPA. En los años siguientes la red fue llamada ARPANET (red ARPA), y su uso era netamente militar.
Un grupo de investigadores de los Laboratorios Bell (hoy AT&T) desarrolló un sistema operativo experimental llamado Multics (Información multiplexada y Sistema de Computación) para usar con un computador General Electric. Los laboratorios Bell abandonaron el proyecto, pero en 1969, Ken Thompson, uno de los investigadores del Multics, diseñó un juego para dicho computador, que simulaba el sistema solar y una nave espacial. Con la ayuda de Dennis Ritchie, Thompson volvió a escribirlo, ahora para un computador DEC (Digital Equipment Corporation), aprovechando que, junto con Ritchie había creado también un sistema operativo multitarea, con sistema de archivos, intérprete de órdenes y algunas utilidades para el computador DEC. Se le llamó UNICS (Información Uniplexada y Sistema de Computación) y podía soportar dos usuarios simultáneamente. En 1970 se renombró Unix. Su licencia de uso era muy costosa, lo cual lo ponía fuera del alcance de muchas personas. Esto motivaría luego la creación del Proyecto GNU para el desarrollo de software libre.
1968
Robert Noyce y Gordon Moore fundan la corporación intel(intel corporation).
1969
La organización ARPA junto con la compañía Rand Corporation desarrolló una red sin nodos centrales basada en conmutación de paquetes tal y como había propuesto Paul Baran. La información se dividía en paquetes y cada paquete contenía la dirección de origen, la de destino, el número de secuencia y una cierta información. Los paquetes al llegar al destino se ordenaban según el número de secuencia y se juntaban para dar lugar a la información. Al viajar paquetes por la red, era más difícil perder datos ya que, si un paquete concreto no llegaba al destino o llegaba defectuoso, el computador que debía recibir la información sólo tenía que solicitar al computador emisor el paquete que le faltaba. El protocolo de comunicaciones se llamó NCP. Esta red también incluyó un gran nivel de redundancia (repetición) para hacerla más confiable.
ARPANET conectó los ordenadores centrales vía ordenadores de pasarela pequeños, o "routers", conocidos como Interface Message Processors (IMPs). El 1 de septiembre de 1969 el primer IMP llegó a UCLA. Un mes después el segundo fue instalado en Stanford. Después en UC Santa Barbara y después en la Universidad de Utah.
1971
Se creó el primer programa para enviar correo electrónico. Fue Ray Tomlinson, del BBN, y combinaba un programa interno de correo electrónico y un programa de transferencia de ficheros. También en este año un grupo de investigadores del MIT presentaron la propuesta del primer “Protocolo para la transmisión de archivos en Internet”. Era un protocolo muy sencillo basado en el sistema de correo electrónico pero sentó las bases para el futuro protocolo de transmisión de ficheros (FTP).
Las instituciones académicas se interesaron por estas posibilidades de conexión. La NSF dio acceso a sus seis centros de supercomputación a otras universidades a través de la ARPANET. A partir de aquí se fueron conectando otras redes, evitando la existencia de centros, para preservar la flexibilidad y la escalabilidad.
1972
Aparecen los disquetes de 5.25 pulgadas.
1973
ARPA cambia su nombre por DARPA, inicia un programa para investigar técnicas y tecnologías para interconectar redes de tipos diferentes y se lanzan dos nuevas redes: ALOHAnet, conectando siete computadores en cuatro islas, y SATNET, una red conectada vía satélite, enlazando dos naciones: Noruega e Inglaterra.
Lawrence Roberts se propone interconectar a DARPA con otras redes, PRNET y SATNET, con diferentes interfaces, tamaños de paquetes, rotulados, convenciones y velocidades de transmisión.
1974
Vinton Cerf, conocido como el padre de Internet, junto con Bob Kahn, publican “Protocolo para Intercomunicación de Redes por paquetes”, donde especifican en detalle el diseño de un nuevo protocolo, el Protocolo de control de transmisión (TCP, Transmission Control Protocol), que se convirtió en el estándar aceptado. La implementación de TCP permitió a las diversas redes conectarse en una verdadera red de redes alrededor del mundo.
Se crea el sistema Ethernet para enlazar a través de un cable único a las computadoras de una red local (LAN).
1975
En enero la revista Popular Electronics hace el lanzamiento del Altair 8800, el primer computador personal reconocible como tal. Tenía una CPU Intel de 8 bits y 256 bytes de memoria RAM. El código de máquina se introducía por medio de interruptores montados en el frente del equipo, y unos diodos luminosos servían para leer la salida de datos en forma binaria. Costaba 400 dólares, y el monitor y el teclado había que comprarlos por separado. Se funda Microsoft al hacer un interpretador BASIC para esta máquina.
1976
Se funda Apple. Steve Wozniak desarrolla el Apple I para uso personal, a Steve Jobs se le ocurre comercializarlo.
1977
Se hace popular el ordenador Apple II, desarrollado por Steve Jobs y Steve Wozniak en un garaje, y al año siguiente se ofrece la primera versión del procesador de texto WordStar.
1979
Dan Bricklin crea la primera hoja de cálculo, más tarde denominada VisiCalc, la cual dio origen a Multiplan de Microsoft, Lotus 1-2-3 (en 1982), Quattro Pro, y Excel.
ARPA crea la primera comisión de control de la configuración de Internet y en 1981 se termina de definir el protocolo TCP/IP (Transfer Control Protocol / Internet Protocol) y ARPANET lo adopta como estándar en 1982, sustituyendo a NCP. Son las primeras referencias a Internet, como “una serie de redes conectadas entre sí, específicamente aquellas que utilizan el protocolo TCP/IP”. Internet es la abreviatura de Interconnected Networks, es decir, Redes interconectadas, o red de redes.
1980
En octubre, la IBM comenzó a buscar un sistema operativo para su nueva computadora personal que iba a lanzar al mercado, cosa de la cual se enteraron Bill Gates y su amigo Paul Allen, autores del lenguaje de programación Microsoft BASIC, basado en el ya existente lenguaje BASIC. Ellos compraron los derechos de QDOS (Quick and Dirty Operating System), un sistema operativo desarrollado por Tim Paterson y basado en CP/M, un sistema escrito por Gary Kildall, y lo negociaron con IBM como Microsoft DOS.
1981
El 12 de Agosto, IBM presenta el primer computador personal, el IBM PC reconocido popularmente como tal, con sistema operativo PC DOS y procesador Intel 8088. IBM y Microsoft son coautores del sistema operativo PC-DOS/MS-DOS, ya que IBM ayudó a Microsoft a pulir los muchos errores que el MS DOS tenía originalmente.
Sony crea disquetes de 3.5 pulgadas.
1983
IBM presenta un PC con un procesador 8088 de 4,77 Mhz de velocidad y un disco duro de 10 MB, Microsoft ofrece la versión 1.0 del procesador de palabras Word para DOS y ARPANET se separa de la red militar que la originó, de modo que ya sin fines militares se puede considerar esta fecha como el nacimiento de Internet. Es el momento en que el primer nodo militar se desliga, dejando abierto el paso para todas las empresas, universidades y demás instituciones que ya por esa época poblaban la red.
Richard Stallman, quien por ese entonces trabajaba en el Instituto Tecnológico de Massachusetts (MIT), decidió dedicarse al proyecto de software libre que denominó GNU.
1984
IBM presenta un PC con procesador Intel 286, bus de expansión de 16 bits y 6 Mhz de velocidad. Tenía 512 KB de memoria RAM, un disco duro de 20 Mb y un monitor monocromático.
Apple Computer presenta su Macintosh 128K con el sistema operativo Mac OS, el cual introduce la interfaz gráfica ideada por Xerox.
Las compañías Philips y Sony crean los CD-Rom para los ordenadores.
1985
Microsoft presenta el sistema operativo Windows 1.0, demostrando que los computadores compatibles IBM podían manejar también el entorno gráfico, usual en los computadores Mac de Apple.
1986
Compaq lanza el primer computador basado en el procesador Intel 80386, adelantándose a IBM.
1989
Creative Labs presenta la tarjeta de sonido Sound Blaster
1990
Tim Berners-Lee ideó el hipertexto para crear el World Wide Web (www) una nueva manera de interactuar con Internet. Su sistema hizo mucho más fácil compartir y encontrar datos en Internet. Berners-Lee también creó las bases del protocolo de transmisión HTTP, el lenguaje de documentos HTML y el concepto de los URL.
1991
Linus Torvalds, un estudiante de Ciencias de la Computación de la Universidad de Helsinki (Finlandia), al ver que no era posible extender las funciones del Minix, decidió escribir su propio sistema operativo compatible con Unix, y lo llamó Linux.
Miles de personas que querían correr Unix en sus PCs vieron en Linux su única alternativa, debido a que a Minix le faltaban demasiadas cosas. El proyecto GNU que Stallman había iniciado hacía ya casi diez años había producido para este entonces un sistema casi completo, a excepción del kernel, que es el programa que controla el hardware de la máquina, el cual desarrolló Torvalds y agregó al GNU para formar Linux.
A mediados de los años noventa Linux se había convertido ya en el Unix más popular entre la gente que buscaba alternativas al sistema Windows de Microsoft.
1992
Es indroducida Arquitectura Alpha diseñada por DEC e bajo el nombre AXP, como reemplazo a la serie VAX que comúnmente utilizaba el sistema operativo VMS y que luego originaría el openVMS. Cuenta con un set de instrucciones RISC de 64 bits especialmente orientada a cálculo de punto flotante. No se ha hecho muy popular pero si es reconocida su tecnología en el entorno corporativo.
1993
Un grupo de investigadores descubrieron que un rasgo de la mecánica cuántica, llamado entrelazamiento, podía utilizarse para superar las limitaciones de la teoría del cuanto (quantum) aplicada a la construcción de computadoras cuánticas y a la teleportación (teleportation).
1995
Lanzamiento de Windows 95. Desde entonces Microsoft ha sacado al mercado varias versiones tales como Windows 98, 2000 (Server y Professional), NT Workstation, NT SMB (Small Business Server), ME, XP (Professional y Home Edition) y Vista.
1996
Se creó Internet2, más veloz que la Internet original, lo cual permite el manejo de archivos muy grandes y aplicaciones en videoconferencia, telemedicina y muchas otras cosas imprácticas por Internet 1.
2000
Es presentado el prototipo de computador cuántico construido por el equipo de investigadores de IBM que constaba de 5 átomos, se programaba mediante pulsos de radiofrecuencia y su estado podía ser leído mediante instrumentos de resonancia magnética, similares a los empleados en hospitales y laboratorios de química. En este computador, cada uno de los átomos de flúor que lo componen actúa como un qubit; un qubit es similar a un bit en un computador electrónico tradicional, pero con las diferencias que comporta su naturaleza explícitamente cuántica (superposición de estados, entrelazamiento de los estados de dos qubits...).
2005
Los usuarios de Internet con conexión de banda ancha superan a los usuarios de Internet con conexión vía módem en la mayoría de países desarrollados. Sin duda alguna, la computación ha venido a revolucionar el mundo a nivel global.

# Sistemas Operativos

Un sistema operativo es un programa o conjunto de programas de computadora destinado a permitir una gestión eficaz de sus recursos. Comienza a trabajar cuando se enciende el computador, y gestiona el hardware de la máquina desde los niveles más básicos, permitiendo también la interacción con el usuario.
Un sistema operativo se puede encontrar normalmente en la mayoría de los aparatos electrónicos que utilicen microprocesadores para funcionar, ya que gracias a éstos podemos entender la máquina y que ésta cumpla con sus funciones (teléfonos móviles, reproductores de DVD, autoradios... y computadoras)

## Funciones básicas

Los sistemas operativos, en su condición de capa software que posibilitan y simplifica el manejo de la computadora, desempeñan una serie de funciones básicas esenciales para la gestión del equipo. Entre las más destacables, cada una ejercida por un componente interno (módulo en núcleos monolíticos y servidor en microkernels), podemos reseñar las siguientes:
* Proporcionar comodidad en el uso de un computador.
* Gestionar de manera eficiente los recursos del equipo, ejecutando servicios para los procesos (programas).
* Brindar una interfaz al usuario, ejecutando instrucciones (comandos).
* Permitir que los cambios debidos al desarrollo del propio SO se puedan realizar sin interferir con los servicios que ya se prestaban (evolutividad).
* Un sistema operativo desempeña 5 funciones básicas en la operación de un sistema informático: suministro de interfaz al usuario, administración de recursos, administración de archivos, administración de tareas y servicio de soporte y utilerías.

### Interfaces del usuario

Es la parte del sistema operativo que permite comunicarse con él de tal manera que se puedan cargar programas, acceder archivos y realizar otras tareas. Existen tres tipos básicos de interfaces: las que se basan en comandos, las que utilizan menús y las interfaces gráficas de usuario.

### Administración de recursos

Sirven para administrar los recursos de hardware y de redes de un sistema informativo, como el CPU, memoria, dispositivos de almacenamiento secundario y periféricos de entrada y de salida.

### Administración de archivos

Un sistema de información contiene programas de administración de archivos que controlan la creación, borrado y acceso de archivos de datos y de programas. También implica mantener el registro de la ubicación física de los archivos en los discos magnéticos y en otros dispositivos de almacenamiento secundarios.

### Administración de tareas

Los programas de administración de tareas de un sistema operativo administran la realización de las tareas informáticas de los usuarios finales. Los programas controlan que áreas tiene acceso al CPU y por cuánto tiempo. Las funciones de administración de tareas pueden distribuir una parte específica del tiempo del CPU para una tarea en particular, e interrumpir al CPU en cualquier momento para sustituirla con una tarea de mayor prioridad.

### Servicio de soporte

Los servicios de soporte de cada sistema operativo dependerán de la implementación particular de éste con la que estemos trabajando. Entre las más conocidas se pueden destacar las implementaciones de Unix, desarrolladas por diferentes empresas de software, los sistemas operativos de Apple Inc., como Mac OS X para las computadoras de Apple, los sistemas operativos de Microsoft, y las implementaciones de software libre, como Linux o BSD producidas por empresas, universidades, administraciones públicas, organizaciones sin fines de lucro y/o comunidades de desarrollo.
Estos servicios de soporte suelen consistir en:
* Actualización de versiones.
* Mejoras de seguridad.
* Inclusión de alguna nueva utilidad (un nuevo entorno gráfico, un asistente para administrar alguna determinada función, ...).
* Controladores para manejar nuevos periféricos (este servicio debe coordinarse a veces con el fabricante del hardware).
* Corrección de errores de software.
* Otros.
No todas las utilidades de administración o servicios forman parte del sistema operativo, además de éste, hay otros tipos importantes de software de administración de sistemas, como los sistemas de administración de base de datos o los programas de administración de redes. El soporte de estos productos deberá proporcionarlo el fabricante correspondiente (que no tiene porque ser el mismo que el del sistema operativo).

# Datos

El dato es una representación simbólica (numérica, alfabética, etc.), atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones.
Es considerado como la expresión general que describe las características de las entidades sobre las cuales opera un algoritmo.

# Algoritmo

En matemáticas, ciencias de la computación, y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa al-Jwarizmi) es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema. Dado un estado inicial y una entrada, a través de pasos sucesivos y bien definidos se llega a un estado final, obteniendo una solución. Los algoritmos son objeto de estudio de la algoritmia, y su definición queda formalizada por el modelo computacional de la Máquina de Turing.
Su importancia radica en mostrar la manera de llevar a cabo procesos y resolver mecánicamente problemas matemáticos o de otro tipo. Al igual que las funciones matemáticas, los algoritmos reciben una entrada y la transforman en una salida, comportándose como una caja negra. Sin embargo, para que un algoritmo pueda ser considerado como tal, debe ser determinista, eficiente, tener un número finito de instrucciones y debe acabar. Por determinista se entiende que, si se sigue el mismo proceso más de una vez, se llega siempre al mismo resultado; por eficiente, que el consumo de tiempo y memoria debe estar cercano o ser el menor posible.
El concepto de algoritmo, aunque similar y obviamente relacionado, no debe confundirse con el concepto de programa. Mientras el primero es la especificación de un conjunto de pasos (operaciones, instrucciones, órdenes,...) orientados a la resolución de un problema, el segundo es ese conjunto de operaciones especificadas en un determinado lenguaje de programación y para un computador concreto, susceptible de ser ejecutado (o compilado o interpretado). Un algoritmo, estrictamente hablando, no puede ejecutarse hasta que se implementa, ya sea en un lenguaje de programación, en un circuito eléctrico, en un aparato mecánico, usando papel y lápiz, o en algún otro modelo de computación.
En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos problemas. Algunos ejemplos se encuentran en los instructivos (manuales de usuario), los cuales muestran algoritmos para usar el aparato en cuestión o inclusive en las instrucciones que recibe un trabajador por parte de su patrón. También existen ejemplos de índole matemática, como el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para calcular el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un Sistema lineal de ecuaciones.

# Características de un Algoritmo

El científico de computación Donald ofreció una lista de cinco propiedades, que son ampliamente aceptadas como requisitos para un algoritmo:

## Carácter finito.

"Un algoritmo siempre debe terminar después de un número finito de pasos". Precisión. "Cada paso de un algoritmo debe estar precisamente definido; las operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso".

## Entrada

"Un algoritmo tiene cero o más entradas: cantidades que le son dadas antes de que el algoritmo comience, o dinámicamente mientras el algoritmo corre. Estas entradas son tomadas de conjuntos específicos de objetos".

## Salida

"Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas".

## Eficacia

"También se espera que un algoritmo sea eficaz, en el sentido de que todas las operaciones a realizar en un algoritmo deben ser suficientemente básicas como para que en principio puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando lápiz y papel".
Knuth admite que, aunque su descripción pueda ser intuitivamente clara, carece de rigor formal, puesto que no está exactamente claro qué significa "precisamente definido", "de manera rigurosa y no ambigua", o "suficientemente básicas", y así sucesivamente.
A partir del carácter finito y de la salida se deduce que ante una misma situación inicial (o valores de entrada) un algoritmo debe proporcionar siempre el mismo resultado (o salida), con excepción de los algoritmos probabilistas.

# Programa

Conjunto de ordenes que transforman los datos de entrada en una salida de resultados comprensibles.
¿Cómo lo consigue?. Usando que detallan los pasos a seguir para alcanzar esos resultados.
En la práctica los datos tienen una estructura más o menos compleja, dando lugar a estructuras de datos.
Algoritmos + estructuras de datos = Programas.

# Lenguaje de Programación

Un lenguaje de programación es un lenguaje que puede ser utilizado para controlar el comportamiento de una máquina, particularmente una computadora. Consiste en un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones.
Aunque muchas veces se usa lenguaje de programación y lenguaje informático como si fuesen sinónimos, no tiene por qué ser así, ya que los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como, por ejemplo, el HTML (lenguaje para el marcado de páginas web).
Un lenguaje de programación permite a uno o más programadores especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Lexico. Una característica relevante de los lenguajes de programación es precisamente que más de un programador puedan tener un conjunto común de instrucciones que puedan ser comprendidas entre ellos para realizar la construcción del programa de forma colaborativa.
Los procesadores usados en las computadoras son capaces de entender y actuar según lo indican programas escritos en un lenguaje fijo llamado lenguaje de máquina. Todo programa escrito en otro lenguaje puede ser ejecutado de dos maneras:
* Mediante un programa que va adaptando las instrucciones conforme son encontradas. A este proceso se lo llama interpretar y a los programas que lo hacen se los conoce como intérpretes.
* Traduciendo este programa al programa equivalente escrito en lenguaje de máquina. A ese proceso se lo llama compilar y al traductor se lo conoce como compilador.

# Compilador

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es código máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación.
Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a como piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.

# Intérprete

Es un programa capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripción en un lenguaje de programación al código máquina del sistema destino, los primeros (los interpretes) sólo realizan la traducción a medida que sea necesario, típicamente, instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción.
Los programas interpretados suelen ser más lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son más flexibles como entornos de programación y depuración (lo que se traduce, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o añadir módulos completamente nuevos), y permiten ofrecer al programa interpretado un entorno no dependiente de la máquina donde se ejecuta el intérprete, sino del propio intérprete (lo que se conoce comúnmente como máquina virtual).
Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.
En la actualidad, uno de los entornos más comunes de uso de los intérpretes informáticos es Internet, debido a la posibilidad que estos tienen de ejecutarse independientemente de la plataforma.
Algunos ejemplos de lenguajes que son normalmente interpretados en vez de compilados son:
* Perl
* PHP
* Javascript
* Logo
* ASP (hasta la versión 3)
* Python

# Ensamblador

El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible por la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador.

# Proceso

Un proceso es un concepto manejado por el sistema operativo que consiste en el conjunto formado por:
* Las instrucciones de un programa destinadas a ser ejecutadas por el microprocesador.
* Su estado de ejecución en un momento dado, esto es, los valores de los registros de la CPU para dicho programa.
* Su memoria de trabajo, es decir, la memoria que ha reservado y sus contenidos.
* Otra información que permite al sistema operativo su planificación.
Esta definición varía ligeramente en el caso de sistemas operativos multihilo, donde un proceso consta de uno o más hilos, la memoria de trabajo (compartida por todos los hilos) y la información de planificación. Cada hilo consta de instrucciones y estado de ejecución. Los procesos son creados y destruidos por el sistema operativo, así como también este se debe hacer cargo de la comunicación entre procesos, pero lo hace a petición de otros procesos. El mecanismo por el cual un proceso crea otro proceso se denomina bifurcación (fork). Los nuevos procesos pueden ser independientes y no compartir el espacio de memoria con el proceso que los ha creado o ser creados en el mismo espacio de memoria. En los sistemas operativos multihilo es posible crear tanto hilos como procesos. La diferencia estriba en que un proceso solamente puede crear hilos para sí mismo y en que dichos hilos comparten toda la memoria reservada para el proceso.

# Multiprogramación

Se denomina multiprogramación a la técnica que permite que dos o más procesos ocupen la misma unidad de memoria principal y que sean ejecutados al "mismo tiempo" (seudo-paralelismo, en una única CPU sólo puede haber un proceso a la vez) en la unidad central de proceso o CPU.
Aporta las siguientes ventajas:
* La ya mencionada, varios procesos en ejecución.
* Permite el servicio interactivo simultáneo a varios usuarios de manera eficiente.
* Aprovecha los tiempos que los procesos pasan esperando a que se completen sus operaciones de E/S Aumenta el uso de la CPU.
* Las direcciones de los procesos son relativas, el programador no se preocupa por saber en dónde estará el proceso dado que el sistema operativo es el que se encarga de convertir la dirección lógica en física.
Un proceso entra a ejecutarse y llega al momento en que tiene que hacer espera por un dispositivo de entrada y/o salida por ejemplo, el CPU estará ocioso mientras espera que el proceso puede usar el dispositivo para así finalmente ejecutarse. Los sistemas de multiprogramación evitan eso ya que durante ese tiempo de esperar pasan a ejecutar otro proceso teniendo así al computador ocupado.

# Grado de Multiprogramación

Para permitir la multiprogramación y la concurrencia se requiere de un modelo de procesos que ofrezca el soporte necesario para proveerla. Cuando se habla de concurrencia entre procesos se refiere al hecho de poder tener varios procesos usuarios parcialmente ejecutados en un momento determinado, con la sensación de que todos los procesos estuvieran corriendo simultáneamente (por el tiempo compartido) aunque realmente sólo un proceso a la vez se ejecuta en el CPU. Las operaciones de E/S son acciones que se ejecutan en paralelo con las acciones del CPU. Esto es paralelismo real. Muchas veces, a la concurrencia también se le llama paralelismo virtual. Este modelo de procesos es seguido por la mayoría de los sitemas de operación de hoy en día y considera los siguientes aspectos:

## PCB (Process Control Block)

Es una estructura usada por el sistema de operación para mantener la información necesaria de cada proceso. El contenido varía de acuerdo al sistema de operación pero la información general que debe contener se puede resumir en:

### Identificadores númericos

* Identificador del procesos en si
* Identificador del proceso padre (quién lo creó)
* Identificador del usuario.

### Información del manejo de memoria

* Registros base y límite
* Tabla de páginas o de segmentos

### Información del estado del procesador

* Registros visibles al usuario
* Registros de estado y control: pc, modo de ejecución, flags, etc.
* Apuntadores del stack

### Información de control de proceso

* Información de estado y planificación: estado del proceso, prioridad, evento por el cual espera, etc.
* Estructuración de datos: formación de anillos con otros procesos, apuntador de secuencia de listas, apuntadores a los archivos, archivos abietos.
* Comunicación entre procesos
* Privilegios del proceso
* Administración de memoria
* Utilización de recursos.
En el PCB se guarda la información sobre todo el edo. del proceso cuando éste es suspendido o cuando es interrumpido. Esto asegura que cuando el proceso vuelva a ejecución tendrá exactamente el mismo estado anterior a la interrupción. El PCB es la estructura más importante dentro del sistema de operación.

## Tabla de Procesos

Es la estructura donde se mantienen los PCBs de los procesos usuarios. Aquí se encuentran registrados los procesos que ya fueron reconocidos por el sistema de operación, independientemente del estado en que se encuentren. Se actualiza a medida que se van creando procesos, eliminando procesos o se producen transiciones entre los estados.

## Estados y Transiciones de los Procesos

Caracterizan el comportamiento de los procesos.
* New: El proceso está siendo creado pero aún no ha sido admitido al pool de procesos ejecutables por el sistema de operación.
* Running: El proceso está ejecutando instrucciones. En un sistema con un solo procesador, sólo habrá un proceso en estado running
* Waiting o Blocked: El proceso espera por algún evento
* Ready: El proceso está listo para ser ejecutado y espera por que se le asigne tiempo de CPU.
* Terminated o Exit: Ha finalizado su ejecución ya sea de forma normal o anormal. En este estado los procesos permanecen mientras el sistema de operación desasigna sus recursos y extrae información necesaria para tareas de contabilidad.
Normalmente estos estados son implementados con estructuras como colas y listas, y lo que realmente mantienen son los PCBs de los procesos. Las posibles transiciones entre los estados son:
* New a Ready: el sistema de operación moverá un proceso del estado New al estado Ready cuando esté preparado para tomar un proceso adicional.
* Ready a Running: cuando es tiempo de seleccionar un nuevo proceso para correr, el sistema de operación selecciona uno de los procesos en el estado Ready (despachar).
* Running a Terminated: el proceso que estaba corriendo actualmente es terminado por el sistema de operación en forma normal o anormal.
* Running a Ready: Cuando se le agota el tiempo de CPU al proceso que está corriendo y ocurre la interrupción del timer, este proceso pasa a estado Ready a esperar una próxima oportunidad.
* Running a Waiting: un proceso se pone en estado de espera si requiere algo por lo cual debe esperar. Normalmente este requerimiento es realizado a través de llamadas al sistema (por operaciones de E/S, por ejemplo).
* Waiting a Ready: un proceso realiza esta transición cuando ocurre el evento por el cual estaba bloqueado.
* Ready a Exit: un proceso padre puede terminar un proceso hijo en cualquier momento, o si el padre termina, todos los procesos hijos asociados con el padre pueden terminar.
* Waiting a Exit: bajo las mismas condiciones de la transición anterior.
Todas las transiciones son iniciadas por el sistema de operación, la única que además, puede ser iniciada por el mismo proceso usuario es la de running a waiting. Los tres principales estados descritos hasta aquí (Running, Ready y Waiting) proveen una forma sistemática de modelar el comportamiento de procesos y guiar la implementación del sistema de operación. Muchos sistemas de operación están construidos usando sólo estos tres estados. Sin embargo, hay buenas razones y justificaciones para agregar otros estados al modelo. Tales como los estados:
* Waiting Suspend: el proceso está en memoria secundaria suspendido y esperando por un evento.
* Ready Suspend: el proceso está en memoria secundaria suspendido temporalmente, pero listo para ejecución, una vez que se reanude.
Cuando un proceso está en un estado suspendido tiene las siguientes características:
* No está inmediatamente disponible para ejecución.
* Puede o no estar esperando por un evento. Si está esperando por un evento, la condición de bloqueado es independiente de la condición suspendido, y la ocurrencia del evento no habilita al proceso para ser ejecutado.
* Fue colocado en estado suspendido por un agente: por él mismo, el proceso padre o el sistema de operación.
* No puede ser removido de este estado hasta que un agente explícitamente ordene la reanudación y pase de nuevo a la cola Ready o Waiting.

## Nuevas transiciones

* Waiting a Waiting Suspend: si no hay procesos en la cola Ready, entonces al menos un proceso de la cola Waiting es swapped out para dar espacio a otro proceso que no esté bloqueado. Esta transición puede ser hecha aún si hay procesos en Ready disponibles, si el sistema de operación determina que el proceso que está es estado Running o los que están es estado Ready requieren más memoria principal para mantener un desempeño adecuado.
* Waiting Suspend a Ready Suspend: esta transición la realiza un proceso cuando el evento por el cual estaba esperando ocurre. Esto requiere que la información de estado concerniente a los procesos suspendidos debe estar al alcance del sistema de operación.
* Ready Suspend a Ready: cuando no hay procesos Ready en memoria principal, el sistema de operación requerirá traer uno para que continue su ejecución. En adición, podría ser el caso que un proceso en la cola Ready Suspend tenga mayor prioridad que los que están en cola Ready.
* Ready a Ready Suspend: Normalmente el sistema de operación podría podría preferir suspender un proceso bloqueado en lugar de uno que esté listo para ejecución. Sin embargo podría ser necesario suspender un proceso listo, si es la única forma de liberar suficiente espacio de memoria.
* Waiting Suspend a Waiting: se reanuda un proceso previamente suspendido y aun no ha ocurrido el evento por el cual esperaba. Normalmente cuando se requiere traer un proceso de nuevo a memoria principal, el sistema de operación seleccionará uno que esté listo para correr (ya sea de Ready Suspend o de New. Así, que esta transición no debería ser de las más comunes.
* Running a Ready Suspend: esta transición sucede si el proceso que está actualmente corriendo se suspende voluntariamente.

## Razones para suspender un proceso

* Necesidades de swapping: El sistema de operación necesita liberar suficiente memoria principal para traer otro proceso que está listo para ejecución. Si a un proceso se le hace swap out se baja de memoria principal a memoria secundaria, donde permanece parcialmente ejecutado. En algún momento posterior, el sistema de operación lo volverá a cargar a memoria principal (swap in) para que continue su ejecución.
Supongamos que en un sistema hay muchos procesos con E/S, en este caso la mayoría del tiempo estos procesos estarán en las colas Waiting y el CPU probablemente estará ocioso. Este es el caso en que las colas de espera estarán congestionadas y la cola Ready vacía. Ante esta baja utilización de CPU, el sistema de operación puede decidir hacer swap out a uno o más procesos bloqueados, colocarlos en la cola Waiting Suspend y darle paso a otros procesos que están en la cola New listos para correr. Otra razón para requerir swapping es para graduar el grado de multiprogramación. El grado de multiprogramación está dado por el número de procesos que actualmente están cargados en memoria principal (en cualquier estado) y eventualmente pueden correr. El sistema de operación podría decidir bajar el grado de multiprogramación para mejorar el desempeño de ciertos procesos.
* El sistema de operación puede suspender un proceso background, un proceso utilitario o un proceso del cual se sospeche esté causando problemas.
* Un usuario puede desear suspender la ejecución de un proceso para própositos de depuración o por el uso de un recurso no disponible.
* Un proceso puede ejecutarse periódicamente (por ejemplo, un proceso que monitorea el sistema) y suspenderse mientras espera por el próximo intervalo de tiempo de ejecución.
* Un proceso padre puede requerir la suspención de la ejecución de un descendiente para examinar o modificar el proceso suspendido o coordinar la actividad de varios descendientes.
Note que no todos los casos requieren hacer el swap out del proceso suspendido. Los estados suspendidos pueden ser usados para evitar la ejecución de ciertos procesos sin tener que bajarlos de memoria principal. Ejemplo: Diagrama de estado y transiciones de los procesos en Unix.

## Procesos huérfanos

Cuando un proceso padre muere antes que el proceso hijo, este proceso queda huérfano y es adoptado por el proceso init

## Procesos zombies

Un proceso que termina no puede abandonar el sistema hasta que su padre acepte su código de retorno. Si el proceso padre ya está muerto, es adoptado por el proceso init el cual siempre acepta los códigos de retorno de sus hijos. Sin embargo, si el proceso padre está vivo pero nunca ejecuta un wait, el código de retorno del proceso nunca será aceptado y tal proceso se convierte en zombie. Un proceso zombie no tiene ni código, ni stack, ni datos, pero continua habitando en la tabla de procesos (que es de tamaño fijo)

## Vector de Interrupciones

Contiene la dirección del procedimiento del servicio de interrupción. Este representa todas las direcciones de los procesos del sistema de operación. Normalmente se encuentra alojado en la parte más baja de la memoria.

# Paradigmas de Programación

Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro.
Algunos ejemplos de paradigmas de programación:
* El paradigma imperativo o por procedimientos es considerado el más común y está representado, por ejemplo, por el C o por BASIC.
* El paradigma funcional está representado por la familia de lenguajes LISP (en particular Scheme), ML o Haskell.
* El paradigma lógico, un ejemplo es PROLOG.
* El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.
Nota: La representación orientada a objetos mejora la estructura de los datos y por lo tanto se ha aplicado a diferentes paradigmas como Redes de Petri, Imperativo Secuencial, Lógica de Predicados, Funcional, etc. No obstante, la manipulación no queda fundamentalmente afectada y por lo tanto el paradigma inicial tampoco a pesar de ser re-orientado a objetos.
Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.
Actualmente el paradigma de programación más usado debido a múltiples ventajas respecto a sus anteriores, es la programación orientada a objetos.

## Ver también

* Algoritmia y programación básica
* Departamento de informática
* Facultad de Ingeniería