Post on 30-Apr-2020
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
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.
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
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