class: title-slide, right, top background-image: url(img/arquitectura-vonneumann.jpg) background-position: center background-size: 350px .right-column[ # Arquitectura de computadoras y lenguajes de programación Manuel Vargas<br> UCR ] .palegrey[.left[.footnote[<small>Diagrama de la [arquitectura de von Neumann](https://es.wikipedia.org/wiki/Arquitectura_de_Von_Neumann). Fuente: [David Strigoi](https://commons.wikimedia.org/wiki/File:Arquitecturaneumann.jpg).</small>]]] --- # Contenidos - ### Características generales de las computadoras. - ### Historia de la computadora - #### Primeras computadoras. - #### La máquina de Turing. - #### Computadoras eletrónicas. - ### La arquitectura de von Neumann. - ### Lenguaje máquina. - ### Lenguajes de programación. --- # Computadoras .pull-left[ - Una computadora es una **máquina** que ejecuta automáticamente **secuencias de cálculos y operaciones lógicas**, llamadas **comandos** o **instrucciones**. Estas secuencias son denominadas **programas**. - Los programas reciben un conjunto de datos de **entrada**, que **procesan** mediante los comandos, para enviar los resultados a los dispositivos de **salida**. - En las computadoras modernas, es posible cambiar los programas que ejecutan sin necesidad de alterar sus componentes físicos. ] .pull-right[ <figure> <img src="img/lorenzo-herrera-p0j-mE6mGo4-unsplash.jpg" /> <figcaption> <small> Imagen de <a href="https://unsplash.com/@lorenzoherrera?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lorenzo Herrera</a> en <a href="https://unsplash.com/s/photos/computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>. </small> </figcaption> </figure> <figure> <img src="img/luca-bravo-XJXWbfSo2f0-unsplash.jpg" /> <figcaption> <small> Imagen de <a href="https://unsplash.com/@lucabravo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Luca Bravo</a> en <a href="https://unsplash.com/s/photos/computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>. </small> </figcaption> </figure> ] --- # Computadoras digitales binarias .pull-left[ - Las computadoras modernas están construídas con base en [circuitos integrados (CI)](https://es.wikipedia.org/wiki/Circuito_integrado), también llamados *chips* o *microchips*. - Los CI procesan [información digital](https://es.wikipedia.org/wiki/Se%C3%B1al_digital) (que usa valores discretos), la cual generalmente es binaria (i.e. de dos valores). - Los CI de una computadora procesan dos estados correspondientes a **dos niveles de tensión eléctrica: alto y bajo**. Estos estados se representan con **0 y 1**. Esto facilita la aplicación de la [lógica binaria](https://es.wikipedia.org/wiki/L%C3%B3gica_binaria) y de la [aritmética binaria](https://es.wikipedia.org/wiki/Sistema_binario). ] .pull-right[ <figure> <img src="img/chip-intel.jpg" /> <figcaption> <small> Imagen de <a href="https://unsplash.com/@slavudin?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Slejven Djurakovic</a> disponible en <a href="https://unsplash.com/s/photos/chip?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>. </small> </figcaption> </figure> <figure> <img src="img/reloj-digital.jpg" /> <figcaption> <small> Imagen de <a href="https://unsplash.com/@yasin?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Yasin Hasan</a> disponible en <a href="https://unsplash.com/s/photos/alarm-clock-digital?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>. </small> </figcaption> </figure> ] --- # Historia de la computadora -- - ### Durante el siglo XVII, varios matemáticos construyeron calculadoras mecánicas experimentales capaces de sumar, restar, multiplicar y dividir. -- - ### En la primera mitad del siglo XIX, **Charles Babbage** diseñó la [máquina analítica](https://es.wikipedia.org/wiki/M%C3%A1quina_anal%C3%ADtica), considerada la primera computadora programable. Era una máquina de vapor que contaba con una unidad central de procesamiento, memoria y una impresora. Para la entrada de datos y programas estaba previsto el uso de [tarjetas perforadas](https://es.wikipedia.org/wiki/Tarjeta_perforada). --- # Historia de la computadora -- - ### Por esa misma época, **Ada Lovelace** elaboró sobre el trabajo de Babbage e introdujo varios conceptos utilizados actualmente en programación. Entre otros aportes, describió en detalle como la máquina analítica podía generar una secuencia de números de Bernoulli. Este desarrollo se considera el [primer algoritmo diseñado para ser ejecutado por una computadora](https://es.wikipedia.org/wiki/Ada_Lovelace#El_primer_programa_de_ordenador) y por este motivo, muchos la consideran la **primera programadora de computadoras**. --- # Historia de la computadora -- - ### A mediados del siglo XIX, **George Boole** introdujo el [álgebra booleana](https://es.wikipedia.org/wiki/%C3%81lgebra_de_Boole), la cual trata sobre las operaciones (ej. AND, OR, NOT) en valores lógicos (Verdadero o Falso). Esto constituye el fundamento teórico en el que se basan los circuitos digitales, además de tener múltiples aplicaciones en matemáticas como, por ejemplo, en teoría de conjuntos. -- - ### En la primera mitad del XX, **Claude Shannon** demostró como el álgebra booleana podía ser aplicada al diseño de circuitos. Es considerado el padre de la [teoría de información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n), la cual estudia la cuantificación, el almacenamiento y la comunicación de información. También sentó las bases matemáticas de la criptografía. --- # La máquina de Touring -- - ### Durante el período entre las guerras mundiales, **Allan Turing** desarrolló la [máquina de Turing](https://es.wikipedia.org/wiki/M%C3%A1quina_de_Turing), un dispositivo teórico que manipula símbolos de una cinta de acuerdo con una tabla de reglas. -- - ### La máquina de Turing simula el funcionamiento de un algoritmo y los conceptos de **entrada, procesamiento y salida**. -- - ### La mayoría de las computadoras modernas están basadas en el concepto de la máquina de Turing. --- # Representación artística de la máquina de Turing -- <figure> <img src="img/turing-machine.png" /> <figcaption> <small> Representación artística de una máquina de Turing. Imagen de <a href="https://commons.wikimedia.org/wiki/File:Turing_Machine.png">Porao en Wikimedia</a>. </small> </figcaption> </figure> --- # Primeras computadoras electrónicas -- - ### Con base en las ideas de Turing, las computadoras [Colossus](https://es.wikipedia.org/wiki/Colossus) fueron construídas durante la Segunda Guerra Mundial en el Reino Unido para descifrar mensajes codificados. -- - ### A pesar de que se consideran de las primeras computadoras digitales electrónicas programables, su programación se realizaba a través de componentes de *hardware*, como interruptores y enchufes, y no con un [programa almacenado](https://es.wikipedia.org/wiki/Computador_de_programa_almacenado). --- # Primeras computadoras electrónicas -- - ### [ENIAC (Electronic Numerical Integrator and Computer)](https://es.wikipedia.org/wiki/ENIAC) es considerada la primera computadora programable digital de propósito general. Era capaz de seguir el modelo de la máquina de Turing, por lo que era [Turing-completa](https://es.wikipedia.org/wiki/Turing_completo). Podía resolver 5000 sumas o 300 multiplicaciones en 1 segundo. -- - ### Fue inicialmente diseñada para calcular tablas de tiro de artillería para el ejército de Estados Unidos. Su construcción se completó en 1946. --- # Primeras computadoras electrónicas .pull-left[ <figure> <img src="img/colossus.jpg" /> <figcaption> <small> Computador Colossus operado por integrantes del <em>Women's Royal Naval Service (WRNS)</em>. Imagen de <a href="https://commons.wikimedia.org/wiki/File:Colossus.jpg">autor desconocido en Wikimedia</a>. </small> </figcaption> </figure> ] .pull-righ[ <figure> <img src="img/eniac01.jpg" /> <figcaption> <small> ENIAC programado por Glen Beck y Betty Snyder. Imagen del <a href="https://commons.wikimedia.org/wiki/File:Eniac.jpg">Ejército de Estados Unidos en Wikimedia</a>. </small> </figcaption> </figure> ] --- # Primeras computadoras electrónicas .pull-left[ <figure> <img src="img/eniac02.jpg" /> <figcaption> <small> ENIAC programado por Jean Jennings, Marlyn Wescoff y Ruth Lichterman. Imagen del Ejército de Estados Unidos. </small> </figcaption> </figure> ] .pull-righ[ <figure> <img src="img/eniac03.jpg" /> <figcaption> <small> Programadoras de ENIAC mostrando algunos de sus componentes. Imagen del <a href="https://commons.wikimedia.org/wiki/File:Women_holding_parts_of_the_first_four_Army_computers.jpg">Ejército de Estados Unidos en Wikimedia</a>. </small> </figcaption> </figure> ] --- # La arquitectura de von Neumann -- - ### En 1945, **John von Neumann** propuso un concepto conocido como **programa almacenado**, en el cual los datos y los programas se almacenan en una estructura llamada **memoria**, separada del hardware que ejecuta las instrucciones. -- - ### Este modelo permite que las computadoras sean más fáciles de reprogramar y es conocido actualmente como [arquitectura de von Neumann](https://es.wikipedia.org/wiki/Arquitectura_de_Von_Neumann). --- # Diagrama de la arquitectura de von Neumann -- <figure> <img src="img/arquitectura-vonneumann.jpg" /> <figcaption> <small> Diagrama de la arquitectura de von Neumann. Imagen de <a href="https://commons.wikimedia.org/wiki/File:Arquitecturaneumann.jpg">David Strigoi en Wikimedia</a>. </small> </figcaption> </figure> --- # Componentes de la arquitectura de von Neumann ## Memoria principal -- - ### Almacena las instrucciones de los programas y los datos que utilizan estos programas. -- - ### Es común denominarla como RAM (*Random Access Memory*, Memoria de Acceso Aleatorio), lo que significa que toma el mismo tiempo acceder a cualquier posición de la memoria. -- - ### Cada posición de memoria tiene una dirección a la que se hace referencia cuando se desea leer o escribir. --- # Componentes de la arquitectura de von Neumann ## Unidad central de procesamiento -- - ### La Unidad Central de Procesamiento o CPU (*Central Processing Unit*) se encarga de ejecutar las instrucciones de los programas. -- - ### Está compuesta por dos partes: - #### La Unidad de Control: determina cuál es la siguiente instrucción a ejecutar. Contiene memorias temporales de alta velocidad y poca capacidad llamadas registros, para almacenar los operandos y el resultado de las instrucciones. - #### La Unidad de Aritmética y Lógica o ALU (*Arithmetic and Logic Unit*): ejecuta las operaciones aritméticas y lógicas. --- # Componentes de la arquitectura de von Neumann ## Sistemas de entrada y salida -- - ### Permiten que la computadora interactúe con el usuario y, en general, con el mundo exterior. -- - ### Algunos ejemplos son el teclado y el ratón, como sistemas de entrada, y la pantalla y la impresora, como sistemas de salida. --- # Código binario -- - ### Los CI de las computadoras usan voltajes bajos y altos para representar dos posibles valores de información: 0 y 1. Este es un sistema binario y cada dígito binario (0 o 1) se denomina *bit* (*binary digit*). -- - ### Los bits se agrupan (por ejemplo, en [bytes = 8 bits](https://es.wikipedia.org/wiki/Byte)) para representar elementos de información más complejos, como números más grandes o carácteres de texto. Por ejemplo: - El número decimal ```14``` se representa en binario como ```1110```: ```1110``` = ```2^3*1 + 2^2*1 + 2^1*1 + 2^0*0``` = ```8 + 4 + 2 + 0``` = ```14``` - La palabra ```bit``` se representa en [código ASCII](https://es.wikipedia.org/wiki/ASCII) como: ```01100010 01101001 01110100``` = ```bit``` --- # Lenguaje máquina -- - ### El [lenguaje máquina](https://es.wikipedia.org/wiki/Lenguaje_de_m%C3%A1quina) es un conjunto de instrucciones binarias interpretables por un CPU. Las instrucciones representan acciones a ser ejecutadas por la computadora. Cada CPU tiene su propio lenguaje máquina. -- - ### Un programa consiste de una secuencia de instrucciones en lenguaje máquina. -- - ### Por ejemplo, la siguiente instrucción suma los contenidos de los registros 1 y 2 y almacena el resultado en el registro 6 de un CPU: <figure> <img src="img/suma-binaria.png" /> <figcaption> <small> Instrucción de suma en lenguaje máquina. Fuente <a href="https://en.wikipedia.org/wiki/Machine_code">Machine code - Wikipedia</a>. </small> </figcaption> </figure> --- # Lenguajes de programación -- - ### Debido a que programar una computadora en lenguaje máquina es excesivamente lento y complicado, en la década de 1950 comenzaron a crearse lenguajes de programación que, en lugar de unos y ceros, consisten de instrucciones formadas por palabras, usualmente en idioma inglés. Por ejemplo, el siguiente programa en lenguaje [C](https://www.iso.org/standard/74528.html) imprime la hilera de texto ["hello, world\n"](http://helloworldcollection.de/): <figure> <img src="img/hello-world.png" /> </figure> -- - ### Existe una gran [variedad de lenguajes de programación](https://en.wikipedia.org/wiki/List_of_programming_languages) que han sido creados con diversos fines: científicos, comerciales, educacionales, etc.