transparencias fundamentos de informÁticafinf/t1.pdf · use una computadora, involucra 2 fases:...

59
Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid T1 INTRODUCCIÓN

Upload: others

Post on 30-Apr-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

Fundamentos de Informática

Departamento de Ingeniería de Sistemas y Automática. EII.

Universidad de Valladolid

T1 INTRODUCCIÓN

Índice Presentación de la Asignatura

1. Conceptos básicos

2. Proceso de resolución de problemas

3. Antecedentes de la computación digital

4. El computador digital

5. Introducción a los lenguajes de programación

6. Lenguaje Máquina

7. Lenguaje Ensamblador

8. Lenguajes de Alto Nivel

9. Introducción al C++

10. Compiladores

11. Intérpretes y Máquinas Virtuales

12. Compiladores frente a Intérpretes

2

Conceptos básicos

El término informática fue utilizado por primera vez en Alemania

por Karl Steinbuch en 1957 en su trabajo:

“Informatik: Automatische Informationsverarbeitung"

("Informática: procesamiento automático de información”)

y en 1962 fue usado por el ingeniero francés Philippe Dreyfus

como informatique.

La palabra es un acrónimo de information y automatique.

Informática (definición de la R.A.E.)

Conjunto de conocimientos científicos y técnicas que hacen posible

el tratamiento automático de la información por medio de

computadoras.

La informática combina aspectos teóricos y prácticos de múltiples

disciplinas, como la automática, la electrónica, la teoría de la

información, las matemáticas, …

3

Conceptos básicos

4

Conceptos básicos

5

Conceptos básicos

6

Conceptos básicos

7

Conceptos básicos

8

Conceptos básicos

9

Informática

10

Conceptos básicos

Computadora electrónica (definición de la R.A.E)

Máquina electrónica que, mediante determinados programas,

permite almacenar y tratar información, y resolver problemas

de diversa índole.

Hardware

Conjunto de elementos físicos que componen el

dispositivo, como el ratón, pantalla, disco duro, CPU, etc.

Software

Son los programas informáticos, que realizan tareas

específicas dentro del ordenador: sistemas operativos,

navegadores, IDE’s, compiladores, procesadores de texto,

etc.

11

Conceptos básicos

Computadora

La característica de ser programable hace de la computadora

una maquina de propósito general.

Dependiendo del software que ejecutemos, los

ordenadores son visualizables como máquinas diferentes:

un procesador de textos si ejecutamos Microsoft Word, un

reproductor de video si ejecutamos VLC, un ajedrez

electrónico, …

En un contexto industrial, un robot o un autómata

programable puede ser programado de múltiples formas

en función de la tarea encomendada.

En el caso de los ordenadores, su capacidad de realizar

múltiples tareas simultáneamente, a gran velocidad y con

precisión, han hecho de ellos un elemento ubicuo. 12

Conceptos básicos

Programa (definición de la R.A.E)

Conjunto unitario de instrucciones que permite a una

computadora realizar funciones diversas, como el tratamiento

de textos, el diseño de gráficos, la resolución de problemas

matemáticos, el manejo de bancos de datos, etc.

El concepto de programar para resolver problemas o ejecutar

tareas es un aspecto inherente a la naturaleza humana y la

civilización, y va más allá de su relación con la informática:

Desde hace centurias, los matemáticos han desarrollado

algoritmos para resolver problemas numéricos. Científicos e

ingenieros han utilizado esos algoritmos para obtener soluciones

a problemas específicos.

Cocinar una receta o hacer la cama también son programas.

13

Proceso de resolución de problemas

Encontrar la solución a un problema, con independencia de que se

use una computadora, involucra 2 fases:

• Desarrollo del algoritmo

• Ejecución del algoritmo

Algoritmo

Conjunto de instrucciones o reglas bien definidas, ordenadas y

finitas que permite realizar una actividad mediante pasos

sucesivos. Dados un estado inicial y una entrada, siguiendo los

pasos sucesivos se llega a un estado final y se obtiene una

solución.

Algoritmo frente a Programa Informático

Un programa informático es una traducción de un algoritmo

utilizando un lenguaje de programación para que sea

comprensible por un ordenador. 14

Proceso de resolución de problemas

15

Desarrollo del algoritmo

Ejecución del algoritmo

Problema

Algoritmo Datos

Resultados

Proceso de resolución de problemas

16

Desarrollo del algoritmo

Tras una etapa de análisis, para comprender y definir el problema, debe lograrse un procedimiento que paso a paso describa cómo solucionar un problema.

El grado de detalle de un algoritmo dependerá de la persona o máquina encargada de ejecutarlo posteriormente.

Ejecución del algoritmo

Consiste en aplicar una serie de valores de entrada al algoritmo para obtener unos resultados o solución.

Una vez que un algoritmo está desarrollado, puede utilizarse para diferentes conjuntos de datos de entrada sin ninguna modificación.

La ejecución involucra:

• Secuenciamiento de los pasos del algoritmo para seleccionar la siguiente instrucción a ejecutar

• Ejecución de la instrucción seleccionada

Proceso de resolución de problemas

17

Secuenciamiento

de las instrucciones

Algoritmo

Instrucción

Datos

Resultados

Ejecución de la instrucción

Ejecución del algoritmo

Antecedentes de la computación digital

18

Durante siglos, las personas abordaron ambas fases de la resolución de problemas mediante el único concurso de la mente.

Un primer ejemplo para ayudar a la mente humana a ejecutar los pasos individuales de los algoritmos es el ábaco chino.

Antecedentes de la computación digital

19

El ábaco de J. Napier (1617) transforma los productos a operaciones de suma y los cocientes a restas; al igual que con las tablas de logaritmos, inventadas por él mismo, se transforman las potencias en productos y las raíces en divisiones.

Antecedentes de la computación digital

20

William Oughtred, clérigo ingles, es el precursor del uso de las reglas de cálculo (~1625).

En las primeras décadas del siglo XX su uso era muy generalizado entre los ingenieros.

En los 70 fue desapareciendo gradualmente su uso.

Antecedentes de la computación digital

21

La pascalina (Blaise Pascal 1642) es posiblemente el primer calculador mecánico (sumas y restas) y consistía en un conjunto de ruedas, cada una de las cuales registraba un dígito decimal, y al girarse en diez pasos producía un paso de rotación en la rueda siguiente.

Pascalina.mp4

Antecedentes de la computación digital

22

La máquina aritmética (Gottfried Wilhelm von Leibniz ~1670) se inspiró en la pascalina para obtener una calculadora que realizaba las 4 operaciones fundamentales y, con algún paso adicional, raíces cuadradas.

El principio de funcionamiento eran unos cilindros con estrías de longitud variable.

Stepped Drum.mp4

Antecedentes de la computación digital

23

Estas calculadoras mecánicas tuvieron relativamente poca repercusión hasta la Revolución Industrial, debido a que la construcción de estos dispositivos no se podía hacer a gran escala con los medios técnicos de la época.

Debe notarse que éstos y otros inventos similares permitieron un avance significativo en el tiempo de ejecución de las instrucciones (sumas, restas, etc.) pero el secuenciamiento de las instrucciones y la introducción de los datos, partes fundamentales de un algoritmo, seguían siendo manuales.

La eliminación de estos inconvenientes es la idea que subyace en un ordenador:

• el secuenciamiento de las instrucciones se hace de forma automática

• los datos y programas están almacenados en la propia máquina.

Antecedentes de la computación digital

24

En el telar mecánico (Joseph Marie Jacquard 1801) se utilizaron tarjetas perforadas para producir el movimiento independiente de los hilos de urdimbre para conseguir el patrón solicitado.

El sistema de tarjetas perforadas es el antecedente más importante de un programa almacenado y del uso del lenguaje binario.

Jacquard weaving.mp4

Antecedentes de la computación digital

25

La máquina diferencial (Charles Babbage 1822) era una idea basada en el método de las diferencias para simplificar el cálculo de logaritmos utilizando aproximaciones polinómicas.

Es un primer ejemplo en el cual un algoritmo, cuyos pasos son la realización de sumas y restas, se automatiza mecánicamente.

La idea se materializó para museos en el 2002.

Máquina Diferencial de Babbage

Antecedentes de la computación digital

26

La máquina analítica (Charles Babbage 1834) supuso una innovación radical. Aparecen ya los elementos básicos de los modernos ordenadores: dispositivos de entrada y de salida, unidad de control, unidad lógico-aritmética y memoria. La programación se debía realizar mediante fichas perforadas.

El proyecto no pudo realizarse por razones económicas e industriales, puesto que la tecnología de la época no bastaba para hacer realidad el proyecto: requería miles de engranajes y mecanismos de gran precisión que cubrirían el área de un campo de futbol y necesitarían accionarse por una máquina de vapor.

Babbage trabajó hasta su muerte en su Máquina Analítica de la que sólo pudo construir alguna parte.

Antecedentes de la computación digital

27

¿El primer programa para computadora?

Aunque existe cierta controversia sobre su verdadera contribución, Ada Lovelace colaboró con Babbage en su máquina analítica.

En una traducción de 1843 al francés de un artículo del ingeniero italiano Luigi Menabrea sobre la máquina analítica, Ada añade numerosas notas de su propia cosecha. Estas notas incluyen la descripción de la secuencia de operaciones para calcular los números de Bernouilli utilizando la máquina analítica de Babbage. Por ello, Ada Lovelace es considerada la primera programadora de la historia. Más allá de la originalidad o no de sus aportaciones, fue visionaria al establecer que la máquina analítica podría realizar tareas más alla de las meramente matemáticas, como elaborar piezas musicales.

Antecedentes de la computación digital

28

En 1851, el aritmómetro de Thomas de Colmar, se convierte en la primera calculadora comercial de la historia.

Frank Baldwin (1872) y Willgodt Odhner (1874) inventan calculadoras con ruedas dentadas, basada en los principios de la máquina de Thomas de Colmar.

El comptómetro (Dorr Felt 1887) fue la primera calculadora mecánica de tecla pulsada de éxito comercial.

Comptometer.mp4

Antecedentes de la computación digital

29

La máquina de censos (Herman Hollerith 1890) también utiliza la idea de las tarjetas perforadas. En este caso, Hollerith se inspiró en el sistema que utilizaban algunas compañías ferroviarias, que expedían billetes con perforaciones que codificaban descripciones físicas del pasajero en un intento de evitar falsificaciones.

Como muchas de las preguntas del censo eran respuestas Sí o No, Hollerith diseñó unas tarjetas que contestaban a estas preguntas mediante perforaciones en lugares determinados.

Las tarjetas se introducían en un dispositivo que activaba los circuitos coincidentes con las perforaciones, incrementando en una unidad los contadores correspondientes, permitiendo una rápida tabulación.

Hollerith fundó con esta idea la Tabulating Machine Company que tras diversas vicisitudes se fusionó con otras empresas para originar la International Bussines Machines, IBM.

Antecedentes de la computación digital

30

Los computadores analógicos Procesar y encontrar la solución a un algoritmo requiere manipular información, que debe poder representarse internamente en el computador de alguna forma. Así, algunos de los primeros computadores eran analógicos, como el analizador diferencial de V. Bush, 1931.

En un computador analógico, la información se representa mediante magnitudes físicas continuas, como posiciones de giro de ejes o voltajes:

una suma podría hacerse mediante un circuito cuyo voltaje de salida fuese la suma de 2 voltajes de entrada.

Usando propiedades físicas, un computador analógico evitaba costosas operaciones lógico aritméticas.

Sin embargo, su talón de Aquiles era que no se podía medir con precisión las magnitudes y éstas sufrían desviaciones debidos a cambios en humedad, temperatura, etc.

Analizador Diferencial de UCLA.mp4

El computador digital

31

El tratamiento analógico dio paso al digital: una información digital es aquella que sólo puede tomar un valor finito de valores distintos.

Los 2 estados de un interruptor o 2 niveles de voltaje se codifican de manera natural con un sistema digital binario: esta información (abierto, cerrado), (alto, bajo) se representa usando típicamente 2 símbolos discretos llamados bits: 0 y 1.

El uso del formato digital, al representar las magnitudes y datos mediante secuencias fijas de bits, tiene el problema de que muchos de los valores se representarán con una precisión limitada.

Por el contrario, la adición a la secuencia de bits de bits de control hace que esta representación sea muy robusta al ruido (codificación redundante a errores).

Las diferentes secuencias o patrones de bits sirven para representar todo tipo de información: caracteres, enteros, números reales e instrucciones.

Hoy en día, el significado de computador es el de un computador electrónico digital de propósito general.

El computador digital

32

Los primeros computadores digitales tuvieron un fuerte impulso debido a las necesidades que durante la 2ª guerra mundial se produjeron respecto al cálculo de trayectorias balísticas y del desciframiento de códigos secretos criptográficos.

Los primeros diseños digitales (Z1 de K. Zuse 1936, ABC de Atanasoff-Berry Computer 1939 o el MARK I de H. Aiken 1944 entre otros) utilizan relés electromecánicos, pero rápidamente dan paso a mediados de los 40 a los diseños electrónicos de tubos de vacío, con conmutaciones mucho más rápidas.

The Atanasoff-Berry Computer Replica.mp4 Harvard Mark I.mp4

La naturaleza de los componentes electrónicos (tubos de vacío, transistores y circuitos integrados) que sustituyen a los elementos analógicos y/o electromecánicos marcan las 3 primeras generaciones de computadores digitales, desde 1945 hasta 1980 aproximadamente.

El computador digital

33

El computador ENIAC, Electronic Numerical Integrator And Computer (J. Mauchly y J. Eckert, 1946) uno de los primeros computadores totalmente electrónicos de la historia. Tenía no sólo una capacidad de memoria reducida sino que su programación era extremadamente compleja.

Disponía de 18000 tubos de vacío y 1500 relés. Pesaba 30 Toneladas, medía 2,4 metros de ancho por 30 de largo y consumía 140KW.

No usaba el sistema binario sino el decimal, no por desconocerlo, sino que, por la compleja forma de programación, era más simple el decimal.

Cada programa era una función de la posición de 6000 conmutadores y de un prolijo cableado entre los diferentes elementos de la máquina. Un proceso cuyas pioneras programadoras tardaban en llevar a cabo varios días.

ENIAC.mp4

El computador británico Colossus (T. Flowers 1943), en cuyo diseño intervino A. Turing, se utilizó para descifrar los mensajes cifrados que generaba el dispositivo ENIGMA del ejército alemán. Su clasificación durante 30 años como alto secreto impidió su conocimiento y reconocimiento. colossus.mp4

El computador digital

34

El concepto de programa almacenado Sea recableando o introduciendo las instrucciones mediante tarjetas perforadas, cargar un nuevo programa era un proceso lento, tedioso y poco flexible.

En 1945 aparece First Draft of a Report on the EDVAC, el borrador de un informe del matemático John von Neumann. En él se describe cómo las instrucciones de un programa pueden almacenarse en las computadoras de la misma forma que los datos, codificándolas con diferentes patrones de bits: había nacido el concepto de programa almacenado.

La idea de programa almacenado seguramente ya estaba presente en los diseñadores Mauchly y Eckert del ENIAC, en el que J. V. Neumann trabajó como consultor, pero su puesta en práctica se pospuso a su sucesora, la EDVAC.

La importancia del borrador radica en que, aparte de la brillantez de las ideas expuestas, su publicación permitió su rápida divulgación evitando la monopolización y protección vía patentes por parte del equipo del EDVAC.

No sólo la siguiente hornada de computadoras, sino los ordenadores tal y como hoy los conocemos estarán ya influenciados por sus ideas.

También existe una publicación anterior del brillante matemático A. Turing, precursor de la Inteligencia Artificial, On Computable Numbers, with an Application to the Entscheidungsproblem. En él describía una máquina hipotética, conocida ahora como Máquina de Turing universal. La máquina hipotética tenía un almacenamiento infinito (memoria en la terminología actual) que contenía tanto las instrucciones como los datos. De nuevo, el secretismo británico impidió su divulgación en contraste con el pragmatismo comercial americano.

El computador digital

35

La arquitectura Von Neumann El diseño básico de la computadora descrita en el informe pasará a conocerse como arquitectura Von Neumann, base de la mayoría de los sistemas de computación actuales.

La memoria tenía 4096 palabras de 40 bits. Cada palabra consistía en:

• 2 instrucciones codificadas con 20 bits o

• un entero (incluido el signo) de 40 bits (no hacía operaciones en coma flotante).

Cada instrucción tenía:

• 8 bits para describirla

• los restantes 12 bits para indicar una de las 4096 (2𝟏𝟐 = 𝟒𝟎𝟗𝟔) posiciones de memoria.

La Unidad de Control junto con la Unidad Aritmético Lógica conforman la CPU (Unidad Central de Proceso) en los ordenadores modernos.

Dentro de la ALU, existe un registro especial de 40 bits, el acumulador. Una instrucción típicamente carga una palabra desde memoria al acumulador o almacena el resultado de una operación en memoria desde el acumulador.

El computador digital

36

La arquitectura Von Neumann

Introducción a los lenguajes de programación

Los programadores escriben programas utilizando lenguajes

de programación para que el ordenador ejecute una serie de

instrucciones. Estos programas se denominan código

fuente.

Por otro lado, el ordenador trabaja usando código binario,

ininteligible a primera vista. El código binario de un programa

se denomina código objeto o código máquina.

Por tanto, es necesario utilizar programas traductores que

conviertan el código fuente, fácilmente utilizable por las

personas, a código máquina.

37

Un Lenguaje de Programación es un conjunto de

símbolos y reglas con los que expresar órdenes a

un ordenador.

Los símbolos que acepta un lenguaje de

programación representan su léxico.

Las reglas son sintácticas y semánticas:

Sintaxis: establece qué construcciones son aceptables

como instrucciones válidas.

Semántica: establece el significado de dichas

Instrucciones válidas.

38

Introducción a los lenguajes de programación

Lenguaje Natural

(Humano)

Lenguaje de

Programación

Léxico Palabras y signos de

puntuación

Símbolos del lenguaje.

Sintaxis Oraciones correctas. Instrucciones bien

formadas y válidas.

Semántica Información que

trasmite quien habla o

escribe.

Qué acciones debe

ejecutar el ordenador

para hacer lo que ordena

el programa.

39

Introducción a los lenguajes de programación

Básicamente se pueden establecer tres niveles en

los lenguajes de programación:

Lenguaje máquina

Lenguaje ensamblador

Alto nivel

40

Introducción a los lenguajes de programación

Lenguaje máquina

Lenguaje directamente comprensible por el procesador.

El lenguaje máquina es un conjunto predefinido de

instrucciones y de un sistema de codificación de instrucciones

y datos. Instrucciones y datos están formados por secuencias

de 1's y 0's.

Depende totalmente del hardware. Es definido por el conjunto

de instrucciones que soporta un procesador.

Un programa escrito en lenguaje de máquina para una CPU ARM

Cortex de un smartphone es completamente incomprensible por la

CPU Intel Core i7 de un ordenador portátil.

41

Lenguaje ensamblador Emplea palabras nemotécnicas para hacer referencia a las instrucciones del

lenguaje de máquina.

Ejemplo

Una instrucción de la familia de CPU’s x86/IA-32 se compone de 3 partes:

• Los 5 primeros bits son el código de operación. Así, la secuencia 10110 ordena

mover un dato a un registro, que es una posición de memoria dentro de la CPU.

• Los 3 siguientes bits determinan el registro. En el ejemplo 000 corresponde a un

registro interno de esa familia de CPU’s denominado registro AL.

• Los 8 bits finales, 01100001, son el valor del dato, 97 en decimal, 61 en hexadecimal.

El lenguaje ensamblador de la familia de CPU’s 8086 de Intel permite escribir esa

instrucción de una forma relativamente más inteligible mediante MOV AL, 61h

El programa escrito en lenguaje ensamblador debe ser traducido a lenguaje de

máquina, ya que el procesador sólo entiende 0’s y 1’s.

Generalmente, como en el ejemplo, la traducción es directa.

¡Cada familia de CPU’s tiene su propio lenguaje ensamblador!

Lenguaje de máquina Ensamblador

10110000 01100001 MOV AL, 61h

Programa Fuente en Ensamblador

Programa

Ensamblador

Programa Objeto

1’s y 0’s en

Lenguaje Máquina 42

Lenguajes de alto nivel

Lenguaje Máquina y Ensamblador

Son esencialmente iguales. Hay una correspondencia simple entre ambos y

son considerados lenguajes de Bajo Nivel.

Ambos están directamente ligados a la arquitectura del procesador y del

ordenador que se utilice y requieren una alta especialización del programador.

Lenguajes de Alto Nivel

Definen su sintaxis y sus estructuras al margen del procesador que se utilicen.

Son independientes del procesador. Son portables (a priori).

Una sola sentencia de alto nivel corresponde en general a muchas

instrucciones de bajo nivel. La correspondencia entre las estructuras de alto

nivel y el código de máquina es compleja.

Las sentencias se escriben en un programa fuente utilizando un editor de

texto (son legibles), y en el que pueden aparecer comentarios.

Las instrucciones son más abstractas y potentes.

Necesitan ser traducidos al lenguaje del procesador (compiladores e

intérpretes).

43

Lenguajes de alto nivel

Paradigmas de programación

Un paradigma de programación describe una forma de realizar los

cálculos y la manera en que se deben estructurar y organizar las tareas

que debe llevar a cabo un programa.

Los lenguajes de programación suelen implementar, a menudo de forma

parcial, varios paradigmas.

Entre las diferentes tipos de paradigmas, una división básica es dividirlos

en imperativos (cómo se realizan los cálculos) y declarativos (qué

cálculos deben realizarse).

Otros paradigmas se centran en la estructura y organización de los

programas: programación estructurada, modular, orientada a objetos,

genérica, orientada a eventos, concurrente, …

La mejor forma de entender un paradigma es aprender un lenguaje de

programación que implemente ese paradigma, por lo que no entraremos

por el momento en más detalles.

44

Lenguajes de alto nivel

45

C++ Lenguajes de alto nivel

46

Lenguajes de alto nivel

47 2014 2015

Introducción a C++

Es un ejemplo de lenguaje de programación multiparadigma,

principalmente de tipo imperativo, orientado a objetos(1) incluyendo

también programación genérica(1) y funcional(1).

Un programa escrito en un lenguaje imperativo es un conjunto de

instrucciones que indican al computador cómo realizar una tarea.

En un lenguaje imperativo podemos:

• conocer en cada paso del programa su estado a través del valor que

toman las variables utilizadas.

• alterar el estado del programa a través de sentencias.

La implementación hardware de la mayoría de computadores está

diseñada para ejecutar código máquina escrito en forma imperativa:

• las variables son posiciones de memoria.

• las sentencias son instrucciones.

En este curso nos centraremos principalmente en la parte imperativa

del lenguaje C++.

(1) Desarrollaremos estos conceptos en el curso más adelante.

48

Introducción a C++

C++ es un lenguaje compilado desarrollado en 1980 Bjarne Stroustroup

en los laboratorios At&T como una extensión orientada a objetos del C.

Por ello, código fuente escrito en C puede compilarse como C++.

Esto fue una virtud en los primeros años, pero a la larga también ha sido una

debilidad pues, para garantizar la compatibilidad, ha mantenido algunos de los

graves inconvenientes del lenguaje C.

El lenguaje C fue creado por Dennis Ritchie entre el año 1970-73.

Durante el curso usaremos C++ 11, que es la cuarta revisión del Lenguaje

de Programación C++ aprobada por la Organización Internacional para la

Estandarización (ISO) en 2011.

Ejemplos de programas escritos en C++ son los sistemas operativos

Windows y Linux, el navegador/buscador Google Chrome, Adobe Acrobat,

la página de Amazon, Autodesk, Facebook, Microsoft Office, la suite de

programas Mozilla, FIFA EA Sports, etc.

49

Compiladores

50

Compiladores, Ensambladores y Enlazadores El concepto de programa almacenado permite que un programa pueda manipular a su vez otro programa: puede cargarlo a memoria, copiar parte de él, volverlo a almacenar y, por supuesto, alterarlo.

La capacidad de los compiladores, ensambladores y enlazadores para manipular como datos de entrada programas y traducirlos y recomponerlos para generar otros programas ha permitido facilitar el proceso de resolución de problemas al introducir una serie de pasos intermedios.

Así, el programador no necesita crear programas introduciendo patrones de bits.

El algoritmo se expresa como un programa de texto, el programa fuente, escrito en un lenguaje de programación, siguiendo una serie de reglas sintácticas y semánticas.

El programa fuente se traduce a un programa ejecutable usando compiladores, ensambladores y enlazadores.

Además, el compilador detecta la presencia de errores sintácticos.

Tras la ejecución pueden ponerse de manifiesto errores semánticos.

Compiladores

51

Una vez que un programador ha escrito el código fuente de un programa, el compilador entra en acción para traducir el código fuente a código máquina.

El compilador genera para cada programa un archivo llamado ejecutable (extensión .exe en S.O. Windows).

Si el programa esta compuesto de múltiples ficheros fuente, el programador puede compilar de forma independiente cada archivo fuente. En este caso, el compilador genera para cada fichero fuente un archivo llamado archivo objeto (extensión .o en S.O. Windows).

Cuando un usuario ejecuta un archivo .exe, la CPU comienza a procesar las instrucciones en código máquina que contiene.

Dado que cada familia de CPU’s tienen un conjunto de instrucciones diferente entre sí, es necesario escoger un compilador adaptado a esa arquitectura.

Muchas firmas, como Intel, garantizan retrocompatibilidad: código escrito para sus CPU’s más antiguas, como la 8086 de Intel, puede ejecutarse en sus chips más modernos. Obviamente, un ejecutable generado para un chip moderno con arquitectura de 64 bits no funcionará en uno de 16 bits.

Compiladores

En la etapa de análisis, el

compilador verifica que los

símbolos son correctos (léxico),

que las sentencias están bien

construidas (sintaxis) y que las

instrucciones tengan un

significado coherente

(semántica).

En la etapa de síntesis se

genera código de máquina para

el procesador específico y, si es

posible, se optimiza el código

atendiendo, por ejemplo, a

criterios como:

•Tamaño del programa

•Velocidad de ejecución. 52

El compilador realiza la traducción típicamente en 2 etapas:

Intérpretes y máquinas virtuales En contraposición a un compilador, un intérprete es un programa que sólo realiza la traducción del programa fuente a medida que sea necesario y, normalmente, no guardan el resultado de dicha traducción.

Los programas interpretados respecto a los compilados:

• suelen ser más lentos debido a la necesidad de traducir el programa mientras se ejecuta

• son más flexibles como entornos de programación y depuración.

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

• un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito

•. "

53

Intérpretes y máquinas virtuales Actualmente muchos lenguajes de programación interpretados como Java o Python utilizan un esquema intermedio entre un intérprete puro y un compilador: realizan una traducción previa del programa fuente generando una codificación intermedia llamada código intermedio o bytecode.

Estos códigos portables son posteriormente interpretados por programas que reciben el nombre de máquinas virtuales.

El esquema de trabajo de un intérprete basado en máquina virtual tiene la ventaja de que el bytecode es único, no depende de la arquitectura del procesador o del sistema operativo. Por el contrario, en el caso de un compilador, el programa debe ser recompilado para cada arquitectura y/o sistema operativo.

La máquina virtual, que sí es diferente para cada arquitectura, se encarga de realizar de forma interpretada el último paso de la traducción o incluso realiza una compilación en tiempo de ejecución, es decir, justo en el momento que se ejecuta por primera vez el programa (Just In Time compiler).

La máquina virtual permite, por ejemplo, que enviemos un archivo multimedia desde nuestro PC con Windows (CPU Intel o AMD) a un móvil Android (CPU ARM) y podamos reproducir el archivo sin problemas.

54

Intérpretes y máquinas virtuales Ventajas del intérprete de la máquina virtual respecto al intérprete puro

• Portabilidad y rapidez

El código intermedio está libre de errores sintácticos y es un código muy

sencillo (al estilo del código máquina). El intérprete es más simple y su

ejecución más rápida, ya que no ha de comprobar la sintaxis.

• Estabilidad

El código intermedio es ejecutado por una CPU virtual, por el intérprete de la

máquina virtual, que es un programa y no un chip real. Esto permite un mayor

control sobre este código, facilitando la labor de impedir que un código

descontrolado afecte a la estabilidad de la plataforma real.

Ejemplos de máquinas virtuales

Adobe Flash Player contiene una máquina virtual que permite la reproducción de archivos multimedia escritos en un lenguaje llamado ActionScript. Un navegador de Internet con Flash Player reproduce el archivo multimedia interpretando su bytecode asociado con independencia de la arquitectura y/o sistema operativo.

El lenguaje JAVA usa la máquina virtual JVM para interpretar bytecodes compilados para las plataformas Windows, Mac, Solaris y Linux. Para Android, el compilador a bytecode es distinto (tema de licencias) y la máquina virtual se llama ART (Android Run Time)

55

Compiladores frente a Intérpretes

56

Código Fuente

Linux Windows Mac

Compilador

Linux

Compilador

Windows

Compilador

Mac

Ejecutable para Linux Ejecutable para Win Ejecutable para Mac

Compiladores

Compiladores frente a Intérpretes

57

Intérpretes con Máquina Virtual

Código Fuente

Compilador

Bytecode

Máquina Virtual Linux Máquina Virtual Win Máquina Virtual Mac

Bibliografía

58

• M. Franklin. Computer Architecture and Organization. From Software to Hardware. Pearson 2007.

• A. Tanenbaum, T. Austin. Structured Computer Organization. Pearson 2012.

• H. San Juan. Historia de los Computadores. F. Informática. U. Complutense de Madrid.

• Xavier Molero. Del ENIAC, hasta los andares. ReVisión, Vol 7, No 1 (2014)

• http://history-computer.com/

• http://www.computerhistory.org/babbage/

• http://www.cs.virginia.edu/~robins/Ada_and_the_First_Computer.pdf

• http://www.arithmometre.org/

• http://www.vintagecalculators.com/html/operating_a_pinwheel_calculato.html

• https://www.census.gov/history/www/innovations/technology/the_hollerith_tabulator.html

• http://web.archive.org/web/20091011232635/http://www.dalefield.com/nzfmm/magazine/Differential_Analyser.html

• https://es.wikipedia.org/wiki/Z1

• http://www.colossus-computer.com

• https://en.wikipedia.org/wiki/Enigma_machine

• http://www.alanturing.net/ace/

• https://es.wikipedia.org/wiki/Máquina_de_Turing_universal

• http://eniacprogrammers.org/

• https://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC

• https://en.wikipedia.org/wiki/John_von_Neumann

• http://opentranscripts.org/transcript/working-on-eniac-lost-labors-information-age/

Bibliografía

59

• http://www.infor.uva.es/~cvaca/asigs/docpar/intro.pdf

• https://en.wikipedia.org/wiki/Assembly_language

• www.teach-ict.com/as_as_computing/ocr/H447/F453/

• http://latecladeescape.com/h/2015/09/compiladores-interpretes-y-maquinas-virtuales

• http://noticias.universia.es/ciencia-tecnologia/noticia/2016/03/18/1137432/lenguaje-programacion-aprender.html