Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Maquinas y Lenguajes
Maquinas y Lenguajes
Los Computadores son herramientas muy útiles, pero por sí solos no pueden
actuar o tomar decisiones. Los programas son un conjunto de instrucciones
escritos en un lenguaje determinado, el cual consta de una sintaxis y una serie
de símbolos, donde cada uno cuenta con distintas funciones.
El lenguaje de un Computador se lo denomina leguaje de máquina, y consiste en
una codificación de instrucciones que puede realizar un procesador, la
codificación se realiza mediante la representación binaria. Es decir, cada
instrucción era un conjunto de unos y ceros.
En la década del 40, surgen representaciones para estas instrucciones. Ya no eran
unos y ceros, sino que se los representaba con palabras más fáciles de recordar
(instrucciones mnemónicas) como MOVE, LDA, ADD, etc.
La relación con el código binario era directa, por cada instrucción MNEMONICA,
existe una instrucción en binario y viceversa. Así se construyen los primeros
traductores que pasarán la instrucción MNEMONICA a Binario. Estos traductores
recibieron el nombre de ensambladores, y se convirtieron en el primer lenguaje
de los Computadores.
Entre 1954 y 1957, John Bakus y sus colegas de IBM desarrollaron FORTRAN, el
cual introdujo muchas ventajas sobre el ensamblador, e hizo mas claras las
operaciones básicas. La idea era hacer la programación más cercana al lenguaje
natural humano.
Poco tiempo después en 1958, surge ALGOL-58, que unía la sintaxis de FORTRAN y
mejoraba la notación.
En 1960, aparece COBOL, este lenguaje tenía como objetivo ser utilizado en el
procesamiento de datos a gran escala. Inmediatamente fue adoptado en bancos,
compañías y dependencias oficiales.
En 1965, John Kemey y Thomas Kurtz crean BASIC, con la intención de que se
convierta en un lenguaje de enseñanza.
En 1970, el profesor Niklaus Wirth crea el lenguaje PASCAL a partir del
ALGOL-58, también con fines didácticos.
Puesto que los autómatas finitos no son suficientemente poderosos para aceptar los LLC, cabe
preguntarnos que tipo de autómata se necesitaría para aceptar los LLC. Una idea es agregar algo a los AF
de manera que se incremente su poder de calculo.
Para ser más concretos, tomemos por ejemplo el lenguaje de los paréntesis bien balanceados, que
sabemos que es propiamente LLC. ¿Qué máquina se requiere para distinguir las palabras de paréntesis
bien balanceados de las que tienen los paréntesis desbalanceados? Una primera idea podría ser la de una
maquina que tuviera un registro aritmético que le permitiera contar los paréntesis; dicho registro seria
controlado por el control finito, quien le mandaría símbolos I para incrementar en uno el contador y D para
decrementillo en uno. A su vez, el registro mandaría un símbolo Z para indicar que esta en cero, o bien N
para indicar que no está en cero. Entonces para analizar una palabra con paréntesis lo que haríamos sería
llevar la cuenta de cuántos paréntesis han sido abiertos pero no cerrados; en todo momento dicha cuenta
debe ser positiva o cero, y al final del cálculo debe ser exactamente cero. Por ejemplo, para la palabra
(())() el registro tomaría sucesivamente los valores 1, 2, 1, 0, 1, 0. Recomendamos al lector tratar de
diseñar en detalle la tabla describiendo las transiciones del autómata.
Funcionamiento de los Aut´omatas de
Pila (informal)
La pila funciona de manera que el ´ultimo carácter que se almacena en ella es el primero en
salir (“LIFO” por las siglas en inglés), como si empiláramos platos uno encima de otro, y
naturalmente el primero que quitaremos es el ultimo que hemos colocado. Un aspecto crucial
de la pila es que sólo podemos modificar su “tope”, que es el extremo por donde entran o
salen los caracteres. Los caracteres a la mitad de la pila no son accesibles sin quitar antes
los que están encima de ellos.
La pila tendrá un alfabeto propio, que puede o no coincidir con el alfabeto de la palabra de
entrada. Esto se justifica porque puede ser necesario introducir en la pila caracteres
especiales usados como separadores, según las necesidades de diseño del autómata. Al
iniciar la operación de un AP, la pila se encuentra vacía. Durante la operación del AP, la pila
puede ir recibiendo (y almacenando) caracteres, según lo indiquen las transiciones
ejecutadas. Al final de su operación, para aceptar una palabra, la pila debe estar nuevamente
vacía.
Conversiones a lenguaje de maquina
1. de decimal a hexadecimal
2. De hexadecimal a binario
Natural
De Programación
Compilado o Interprete
De Maquina
Etapas de la Compilación
Existen dos tipos de lenguajes diferenciados: los lenguajes de bajo nivel y los lenguaje de alto
nivel. Los lenguajes más cercanos a la arquitectura hardware se denominan lenguajes de bajo
nivel y los que se encuentran más cercanos a los programadores y usuarios se denominan
lenguajes de alto nivel.
Lenguajes de bajo nivel
Son lenguajes dependientes de la máquina, el programa que se realiza con este tipo de
lenguajes no se pueden migrar o utilizar en otras maquinas.
Estos lenguajes como están diseñados a medida del hardware, aprovechan al máximo las
características del mismo.
HACE
Dentro de los lenguajes de bajo nivel están:
El lenguaje maquina, es el que da ordenes a la máquina, que son las operaciones
fundamentales para su funcionamiento.
El computador sólo entiende un lenguaje conocido como código binario o código máquina,
consistente en ceros y unos, que son las ordenes, y que sean fáciles de entender por el
hardware de la maquina. Este lenguaje es mucho más rápido que los lenguajes de alto
nivel.
La desventaja es que son bastantes difíciles de manejar y usar, además de tener códigos
fuente enormes donde encontrar un fallo es casi imposible.
El lenguaje ensamblador, es un derivado del lenguaje maquina y esta formado por
abreviaturas de letras y números. Con la aparición de este lenguaje se crearon los
programas traductores para poder pasar los
programas escritos en lenguaje ensamblador a lenguaje máquina.
Como ventaja, es que los códigos fuentes eran más cortos y los programas creados
ocupaban menos memoria.
Las desventajas de este lenguaje siguen siendo prácticamente las mismas que las del
lenguaje ensamblador, añadiendo la dificultad de tener que aprender un nuevo lenguaje
difícil de probar y mantener.
En este tipo de lenguajes se trabaja a nivel de instrucciones, es decir, su programación es
al más fino detalle, además, está completamente orientado a la máquina.
Adaptación - Máxima entre programación y aprovechamiento del recurso de la
máquina.
Velocidad - Máxima al contar con un acceso directo a los recursos, sin capas
intermedias.
Portabilidad - Mínima por estar restringido a las especificaciones del fabricante.
Abstracción - Mínima por depender completamente de la técnica del hardware.
Uso - Requiere de la máxima atención y de una organización estructurada en base a los
planos del hardware y del objetivo del software.
Ventajas
Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su
mayor facilidad de codificación y, en general, su velocidad de cálculo.
Inconvenientes
Dependencia total de la máquina lo que impide la transpirabilidad de los programas.
La formación de los programadores es más compleja que la correspondiente a los
programadores de alto nivel, ya que no sólo las técnicas de programación, sino también el
conocimiento del interior de la máquina.
Lenguajes de alto nivel
Son aquellos que se encuentran más cercanos al lenguaje natural que al lenguaje máquina. Se tratan
de lenguajes independientes de la arquitectura del ordenador. Por lo que, en principio, un programa
escrito en un lenguaje de alto nivel, lo puedes migrar de una máquina a otra sin ningún tipo de
problema. Estos lenguajes permiten al programador olvidarse por completo del funcionamiento
interno de la maquina/s para la que están diseñando el programa. Tan solo necesitan un traductor
que entiendan el código fuente como las características de la maquina. Suelen usar tipos de datos
para la programación y hay lenguajes de propósito general y de propósito especifico..
Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba
con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con
frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la
manipulación directa de hardware, alto rendimiento, o un uso de recursos controlado y
reducido. También es utilizado en el desarrollo de controladores de dispositivo (en
inglés, device drivers) y en el desarrollo de sistemas operativos, debido a la necesidad del
acceso directo a las instrucciones de la máquina. Muchos dispositivos programables (como los
microcontroladores) aún cuentan con el ensamblador como la única manera de ser
manipulados.
Características
El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que
su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un
microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina
distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario
reescribirlo completamente.
Los programas hechos por un programador experto en lenguaje ensamblador son generalmente
mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el
programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente
en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y
ocupan menos espacio que con lenguajes de alto nivel.
Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por
un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy
ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje
ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los
lenguajes de alto nivel.
También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se
interrumpa durante su ejecución.
Generalmente, un programa ensamblador (assembler en inglés) moderno
crea código objeto traduciendo instrucciones mnemónicas de lenguaje
ensamblador en opcodes, y resolviendo los nombres simbólicos para las
localizaciones de memoria y otras entidades.1 El uso de referencias simbólicas es
una característica clave del lenguaje ensamblador, evitando tediosos cálculos y
actualizaciones manuales de las direcciones después de cada modificación del
programa. La mayoría de los ensambladores también incluyen facilidades
de macros para realizar sustitución textual - ej. generar cortas secuencias de
instrucciones como expansión en línea en vez de llamar a subrutinas
Hay dos tipos de ensambladores basados en cuántos pasos a través de la fuente son necesarios
para producir el programa ejecutable:
Los ensambladores de un solo paso pasan a través del código fuente una vez y asumen que
todos los símbolos serán definidos antes de cualquier instrucción que los refiera.
Los ensambladores de dos pasos crean una tabla con todos los símbolos y sus valores en el
primer paso, después usan la tabla en un segundo paso para generar código. El
ensamblador debe por lo menos poder determinar la longitud de cada instrucción en el
primer paso para que puedan ser calculadas las direcciones de los símbolos.
Sintaxis del lenguaje ensamblador.
La sintaxis es la siguiente Nombre de la instrucción Operando 1, Operando 2, Operando 3,
Operando 4, ... El nombre de la instrucción está formada por 2 o 3 letras, los operandos
pueden ser registros, constantes o direcciones de memoria. La cantidad de operandos
dependerá de la instrucción. Por ejemplo:
MOV AL, [1000]
Esta instrucción indica que se copie el valor de la porción de la memoria que esté en la
ubicación 1000 (En hexadecimal) a la parte baja del registro AX (AL). Cuando un operando es
un valor de una dirección de memoria, ésta dirección se escribe entre corchetes, recordar
que el operando 1 es el destino y el operando 2 es el origen. Y cuando es una constante
dependerá del ensamblador, en el caso del debug (Un programa que sirve para crear y editar
aplicaciones que viene con el DOS) se interpretarán como hexadecimales, en los siguientes
ejemplos se interpretará que las constantes son números hexadecimales.
También se puede copiar el valor de un registro a otro
MOV AL, BL
En este caso se copia el valor de BL a AL Igualmente se puede copiar el valor de la parte baja
de un registro a la parte alta de otro registro
MOV CH, DL
Así como también operar con las partes altas
MOV AH, DH
Inclusive se puede copiar el valor de un registro a una dirección de memoria MOV [1000], AL
Instrucciones del leguaje ensamblador