Arquitectura de Von Neumann
Es una familia de
arquitecturas de computadoras que utilizan el mismo dispositivo de almacenamiento tanto para las instrucciones como para los datos a diferencia
de la arquitectura Harvard, que que almacenaba las
instrucciones en cintas perforadas y los
datos en interruptores. Todas
las computadoras constan principalmente de dos partes, la CPU que procesa los
datos, y la memoria que guarda los datos.
Cuando hablamos de memoria manejamos dos parámetros, los datos en sí, y el
lugar donde se encuentran almacenados(o dirección). Los dos son importantes para la CPU, pues muchas instrucciones
frecuentes se traducen a algo así como
“coge los datos de ésta dirección y
añádelos a los datos de ésta otra
dirección", sin saber en realidad qué es lo que contienen los datos.
En los últimos años la velocidad de las CPUs ha aumentado mucho en comparación a la de las memorias con
las que trabaja, así que se debe
poner mucha atención en reducir el
número de veces que se accede a ella para mantener el rendimiento. Si, por ejemplo, cada instrucción
ejecutada en la CPU requiere un
acceso a la memoria, no se gana nada incrementando la velocidad de la CPU -
este problema es conocido como
'limitación de memoria'.
INTRODUCCIÓN
Con el tiempo el hombre va inventando cosas nuevas para ir mejorando su
calidad de vida, a fin de hacer las cosas más eficientes.
Así es como surgen las computadoras, un aparato electrónico que hoy en día nos
facilita la vida. Realiza un sin fin de funciones que para un persona le
llevaría horas e incluso días. Por citar un algo, sería el comparativo de las reglas
de cálculo, con las calculadoras científicas, las primeras nos facilitaban la idea de hacer un
montón de cálculos a mano, pero aun así, el tiempo era muy largo. Ahora con las calculadoras científicas, el tiempo
se reduce a minutos y segundos. Por eso, las computadoras son una gran herramienta
muy fascinante, además de útiles. Cada día van evolucionando y siendo mejores cada día, es una de las
herramientas más usadas hoy en día y
todo es por el núcleo, el alma de la
computadora, que es el microprocesador. Este componente hacer las millones de
intrusiones necesarias para el hombre a una enorme velocidad.
Nombre
El término arquitectura de Von Neumann se acuñó
a partir del memorando
First
Draft of a Report on the EDVAC
(1945) escrito por el conocido matemático John von Neumann en el que se
proponía el concepto de programa almacenado. Dicho documento fue redactado en vistas a la construcción del sucesor de la Computadora ENIAC y su contenido fue desarrollado por John
Presper Eckert, John William Mauchly, Arthur Burks y otros durante varios meses antes
de que von Neumann redactara el borrador del informe. Es por ello que otros tecnólogos como David A.
Patterson y John L.Hennessy promueven
la sustitución de este término por el
de arquitectura
Eckert-Mauchly.
Lenguaje Máquina
Los circuitos micro programables son sistemas digitales, lo que significa que trabajan con dos únicos niveles
de tensión. Dichos niveles, por
abstracción, se simbolizan con el cero, 0, y el uno, 1, por eso el lenguaje de
máquina sólo utiliza dichos signos. Esto permite el empleo de las teorías
del álgebra booleana y del sistema binario en el diseño de este tipo de circuitos y en su programación.
Álgebra
booleana
También llamada Algebra de Boole, en
informática y matemática, es una estructura algebraica que contiene las operaciones
lógicas AND, OR y NOT, así como el conjunto de
operaciones unión, intersección y complemento.
Sistema Binario
En matemáticas e informática, es un sistema de
numeración en el que los números se representan utilizando
solamente las cifras cero y uno (0 y 1). Los ordenadores trabajan internamente
con dos niveles de voltaje, por lo que su sistema
de numeración natural es el sistema binario (encendido 1, apagado 0).
PARTES
DE LA ARQUITECTURA DE VON NEUMANN
Los ordenadores con arquitectura Eckert-Mauchly
constan de cinco partes:
-La unidad aritmético-lógica (ALU)
-La unidad de control
-La memoria
-Un dispositivo de entrada/salida
-El bus de datos que proporciona un
medio de transporte de los datos entre
las distintas partes.
Un ordenador con arquitectura Eckert-Mauchly
realiza o emúlados siguientes pasos secuencialmente:
-Enciende el ordenador y obtiene la siguiente instrucción
desde la memoria en la dirección indicada
por el contador de programa y la guarda en el registro de instrucción.
-Aumenta el contador de programa en la
longitud de la instrucción para
apuntar a la siguiente.
-Decodifica la instrucción mediante la
unidad de control. Ésta se encarga
de coordinar el resto de componentes
del ordenador para realizar una función
determinada.
-Se ejecuta la instrucción. Ésta puede
cambiar el valor del contador del programa, permitiendo así operaciones
repetitivas. El contador puede cambiar también cuando se cumpla una cierta condición aritmética, haciendo que el
ordenador pueda 'tomar decisiones', que pueden alcanzar cualquier grado de
complejidad, mediante la aritmética y
lógica anteriores.
-Vuelve al paso 2.
LENGUAJE DE PROGRAMACIÓN
Con la aparición de las computadoras desaparecen
las secuencias de posiciones de llaves mecánicas que
debían desconectarse para obtener una acción
determinada, una llave conectada era un 1 y una llave
desconectada era un 0. Una sucesión de llaves en
cualquiera de sus dos posiciones definía una
secuencia de ceros y unos (por ejemplo:
0100011010011101...) que venía a representar una instrucción o un conjunto de
instrucciones (programa) para el ordenador(o computador)
en el que se estaba trabajando. A esta primera forma
de especificar programas para una computadora se la denomina lenguaje máquina o
código máquina. La necesidad de recordar secuencias de programación para las
acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador. Posteriormente aparecieron
diferentes lenguajes de programación, los cuales reciben
su denominación porque tienen una estructura sintáctica
similar a los lenguajes escritos por los humanos.
Concepto
Un lenguaje de programación es un conjunto de
símbolos y reglas sintácticas y semánticas que definen su
estructura y el significado de sus elementos y expresiones, y utilizado para controlar el comportamiento físico y lógico
de una máquina. 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, 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 Léxico. 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 procesos e lo llama
interpretar y a los programas que lo hacerse 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 un malhecho compilador.
Clasificación de los lenguajes de programación.
Los lenguajes de programación se determinan según el nivel de abstracción, Según la forma de ejecución y
Según el paradigma de programación
que poseen cada uno de ellos yesos
pueden ser:
Según
su nivel de abstracción.
Lenguajes Maquina:
Están escritos en lenguajes directamente
inteligibles por la maquina (computadora), ya que sus instrucciones son cadenas
binarias (0 y 1). Da la posibilidad de cargar (transferir un programa a la
memoria) sin necesidad de traducción posterior lo que supone una velocidad de
ejecución superior, solo que con poca fiabilidad y
dificultad de verificar y poner a punto los
programas.
Lenguajes de bajo nivel:
Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamiento de una
computadora. El lenguaje de más bajo nivel es, por excelencia, el código máquina. A éste le sigue el lenguaje
ensamblador, ya que al programar en
ensamblador se trabajan con los registros de memoria de la computadora de
forma directa.
Lenguajes de medio nivel:
Hay lenguajes de programación que son
considerados por algunos expertos como lenguajes de medio nivel (como
es el caso del lenguaje C) al tener ciertas características que los acercan a los lenguajes de bajo nivel pero
teniendo, al mismo tiempo, ciertas cualidades que lo hacen un lenguaje más cercano al humano y, por tanto, de alto
nivel.
Lenguajes de alto nivel:
Artículo principal: Lenguaje de alto nivel. Los lenguajes de alto nivel son normalmente fáciles de aprender
porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como "IF
CONTADOR = 10 THENSTOP" pueden utilizarse para pedir a la computadora que
pares y CONTADOR es igual a 10. Por
desgracia para muchas personas esta
forma de trabajar es un poco frustrante, dado que a pesar de que las
computadoras parecen comprender un lenguaje
natural, lo hacen en realidad de una forma rígida y sistemática.
Según la forma de ejecución
Lenguajes compilados:
Naturalmente, un programa que se escribe en un lenguaje de alto nivel también tiene que traducirse a un
código que pueda utilizar la máquina.
Los programas traductores que pueden
realizar esta operación se llaman compiladores. Éstos, como los
programas ensambladores avanzados, pueden
generar muchas líneas de código de máquina por cada proposición del programa fuente. Se requiere una
corrida de compilación antes de procesar los datos de un problema. Los
compiladores son aquellos cuya función es traducir un programa escrito en un determinado lenguaje a un idioma quela computadora entienda (lenguaje máquina con
código binario).Al usar un lenguaje
compilado (como lo son los lenguajes del popular Visual Studio de Microsoft), el programa desarrollado
nunca se ejecuta mientras haya errores, sino
hasta que luego de haber compilado el programa, ya no aparecen errores en el código
Lenguajes interpretados:
Se puede también utilizar una alternativa diferente de los compiladores
para traducir lenguajes de alto nivel. En vez
de traducir el programa fuente y grabar
en forma permanente el código objeto
que se produce durante la corrida de
compilación para utilizarlo en una corrida de producción futura, el
programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado
en el sistema operativo del disco, o
incluido de manera permanente dentro
de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo
necesario durante el proceso de los datos. No se graba el código objeto para utilizarlo posteriormente. La
siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje
máquina. Por ejemplo, durante el
procesamiento repetitivo de los pasos de un ciclo, cada instrucción del ciclo
tendrá que volver a ser interpretado cada vez que se ejecute el ciclo, lo cual
hace que el programa sea más lento en tiempo de ejecución (porque se va
revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo).
El intérprete elimina la necesidad de realizar una corrida de compilación
después de cada modificación del programa cuando se quiere agregar funciones o
corregir errores; pero es obvio que un programa objeto compilado con antelación
deberá ejecutárselo mucha mayor rapidez que uno que se debe interpretar a cada paso durante una corrida de producción
Según el paradigma 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. Dependiendo de la
situación un paradigma resulta más
apropiado que otro. Atendiendo al
paradigma de programación, se pueden
clasificar los lenguajes en:
-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.
-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.
Lenguaje ensamblador
El
lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para
escribir programas informáticos, y constitúyela representación más directa del
código máquina específico para cada arquitectura de
computadoras legible por un programador. Fue usado ampliamente en el pasado para el desarrollo de software,
pero actualmente sólo se utiliza en contadas
ocasiones, especialmente cuando se requiere la manipulación directa del
hardware o se pretenden rendimientos inusuales
de los equipos.
Características
-Programar en lenguaje ensamblador es
difícil de aprender, entender, leer,
escribir, depurar y mantener, por
eso surgió la necesidad de los lenguajes compilados.
-A pesar de perder rendimiento en un
proceso de compilación, en la
actualidad la mayoría de las
computadoras son suficientemente rápidas.
-El lenguaje ensamblador no es
portable.
-Programar en lenguaje ensamblador
lleva mucho tiempo.
-Los programas hechos en lenguaje
ensamblador son generalmente más rápidos. Al programar cuidadosamente en lenguaje ensamblador se pueden crear
programas de 5a 10 veces más rápidos
que con lenguajes de alto nivel.
-Los programas hechos en lenguaje
ensamblador generalmente ocupan
menos espacio. Un buen programa en
lenguaje ensamblador puede ocupar casi la mitad despacio que su contraparte en lenguaje de alto
nivel.
-Con el lenguaje ensamblador se pueden crear segmentos de código imposibles
de formar en un lenguaje de alto nivel.
Tiempo de programación
Al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en
comparación con un lenguaje de alto nivel. Por otro lado, requiere demás
cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
Por todo esto, es más lento el
desarrollo de programas comparables en Lenguaje Ensamblador que en un
lenguaje de alto nivel, pues el programador
goza de una menor abstracción.
Programas fuente grande
Por las mismas razones que aumenta el tiempo,
crecen los programas fuentes; simplemente, requerimos más
instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos
inesperadamente
Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje
Ensamblador (flexibilidad). El problema es que todo error que podamos
cometer, o todo riesgo que podamos tener, podemos tenerlo también en este
Lenguaje. Dicho de otra forma, tener mucho
poder es útil pero también es peligroso. En la vida práctica,
afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje
verán que es mucho más común que la máquina se "cuelgue",
"bloquee" o "se lleva ya el
avión"; y que se reinicialice. ¿Por qué?, porque con este lenguaje es
perfectamente posible (y sencillo) realizar secuencias de instrucciones
inválidas, que normalmente no aparecen al
usar un lenguaje de alto nivel. En
ciertos casos extremos, puede llegarse a sobrescribir información del CMOS de la máquina (no he visto
efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro,
junto con toda su información.
Falta de portabilidad
Como ya se mencionó, existe un lenguaje
ensamblador para cada máquina; por ello, evidentemente no es una
selección apropiada de lenguaje cuando
deseamos codificar en una máquina y
luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho
más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que
desarrollo en "C", en una PC, al llevarlo a una RS/6000con
UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté
bien hecho y siga los estándares de "C”, y los principios de la
programación estructurada. En cambio, si escribimos el programa en Ensamblador
de la PC, por bien que lo desarrollemos y
muchos estándares que sigamos,
tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX,
y otra vez lo mismo al llevarlo a Mac.