Vistas a la página totales

martes, 30 de agosto de 2016

Lenguaje de Bajo Nivel

Lenguaje de bajo nivel: Un lenguaje de programación de características bajo nivel es aquel en el que sus instrucciones ejercen un control directo sobre el hardware y están condicionados por la estructura física de las computadoras que lo soportan. El uso de la palabra bajo en su denominación no implica que el lenguaje sea menos potente que un lenguaje de alto nivel, sino que se refiere a la reducida abstracción entre el lenguaje y el hardware. Por ejemplo, se utiliza este tipo de lenguajes para programar tareas críticas de los sistemas operativos, de aplicaciones en tiempo real o controladores de dispositivos.
Complejidad vs Dificultad: Dicho lenguaje es muy simple o nada complicado, pero estructurar programas a ese nivel es muy difícil. Dado que este lenguaje viene dado por las especificaciones técnicas del hardware, no permite una abstracción fuera de lo estipulado para el microprocesador de un ordenador. Consecuentemente, es fácilmente trasladado a lenguaje de máquina.
La estructura de los lenguajes son como sigue:
0. Código Binario - Es el lenguaje básico, sólo admite todo (1) o nada (0). Todo sistema informático está basado en este código, ya que el 1 (todo, SÍ) quiere decir que se permite el paso de la electricidad y el 0 (nada, NO) no lo permite. Sería la forma en la que están almacenados los programas, sea en memoria, sea en dispositivos de almacenamiento. De esta forma son recibidas y ejecutadas cada una de las instrucciones por la CPU del ordenador.
1. Lenguaje Máquina - Las invocaciones a memoria, como los procesos aritméticos lógicos son posiciones literales de conmutadores físicos del hardware en su representación booleana. Estos lenguajes son literales de tareas.
2. Lenguajes ensambladores - También denominados nemotécnicos o nemónicos, no son ya programas ejecutables directamente por el ordenador, sino textos de código fuente que necesitan de alguna herramienta para su conversión a lenguaje máquina, son los programas llamados ensambladores. Sus instrucciones suelen ser una denominación abreviada de la instrucción máquina que simbolizan, y tienen una correspondencia casi directa a las instrucciones máquina que representan. El código resultante de la ejecución del programa ensamblador generaría un código binario ejecutable.
Son instrucciones que ensamblan los grupos de conmutadores necesarios para expresar una mínima lógica aritmética. Están íntimamente vinculados al hardware. Por norma general están disponibles a nivel firmware, cmos o chip set. Estos lenguajes están orientados a procesos. Los procesos se componen de tareas. Contienen tantas instrucciones como la arquitectura del hardware así haya sido diseñada.
Por ejemplo: La arquitectura CISC contiene muchas más instrucciones a este nivel, que la RISC.
Los otros lenguajes que completan la clasificación no serían ya lenguajes de bajo nivel.
3. Lenguajes de medio nivel - Son aquellos que, basándose en los juegos de instrucciones disponibles (chip set), permiten el uso de funciones a nivel aritmético, pero a nivel lógico dependen de literales en ensamblador. Estos lenguajes están orientados a procedimientos. Los procedimientos se componen de procesos.
Ejemplos: C, Basic.
4. Lenguajes de alto nivel - Son aquellos que permiten una máxima flexibilidad al programador a la hora de abstraerse o de ser literal. Permiten un camino bidireccional entre el lenguaje máquina y una expresión casi oral entre la escritura del programa y su posterior compilación. Estos lenguajes están orientados a objetos. Los objetos se componen de propiedades cuya naturaleza emerge de procedimientos.
Ejemplos: C++, Fortran, Cobol, Lisp.
E.A. Lenguajes de aplicaciones - Son aquellos que no permiten una bidireccionalidad conceptual entre el lenguaje máquina y los lenguajes de alto nivel, ni tampoco la literalidad a la hora de invocar conceptos lógicos. Se basan en librerías creadas en lenguajes de alto nivel. Pueden permitir la creación de nuevas librerías, pero son propietarias y dependientes de las suministradas por la aplicación. Estos lenguajes están orientados a eventos. Los eventos acontecen cuando las propiedades de un objeto interactúan con otro.
Ejemplos: Visual Basic para aplicaciones.
E.B. Lenguajes de redes: Son aquellos que se basan en un convenio de instrucciones totalmente independientes de la máquina, y completamente dependientes de la red a la que están orientadas. Se dividen en descriptivos (HTML, XML, VML), de cliente-Servidor (Java, PHP) y de script (javascript).
Interacción máquina: 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 sobre la base de los planos del hardware y del objetivo del software.
isomorfismo - Conceptualización de los datos de la información, que se complementaran
Primera generación
El lenguaje de programación de primera generación: (por sus siglas en inglés: 1GL), es el lenguaje de código máquina. Es el único lenguaje que un microprocesador entiende de forma nativa. El lenguaje máquina no puede ser escrito o leído usando un editor de texto, y por lo tanto es raro que una persona lo use directamente.
Segunda generación: El lenguaje de programación de segunda generación (por sus siglas en inglés: 2GL), es el lenguaje ensamblador. Se considera de segunda generación porque, aunque no es lenguaje nativo del microprocesador, un programador de lenguaje ensamblador debe conocer la arquitectura del microprocesador (como por ejemplo las particularidades de sus registros o su conjunto de instrucciones).
Lenguaje 

El lenguaje ensamblador refleja directamente Hla arquitectura y lasinstrucciones en lenguaje de máquinade la CPU, y pueden ser muy diferentes de una arquitectura de CPU a otra. Cadaarquitectura de microprocesador tiene su propio lenguaje de máquina, y en consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado a la estructura del hardware para el cual se programa. Los microprocesadores difieren en el tipo y número de operaciones que soportan; también pueden tener diferente cantidad de registros, y distinta representación de los tipos de datos en memoria. Aunque la mayoría de los microprocesadores son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere y los respectivos lenguajes ensamblador reflejan tal diferencia.

Instrucciones de CPUEditar

La mayoría de las CPU tienen más o menos los mismos grupos de instrucciones, aunque no necesariamente tienen todas las instrucciones de cada grupo. Las operaciones que se pueden realizar varían de una CPU a otra. Una CPU particular puede tener instrucciones que no tenga otro y viceversa. Los primeros microprocesadores de 8 bits no tenían operaciones para multiplicar o dividir números, por ejemplo, y había que hacer subrutinas para realizar esas operaciones. Otras CPU puede que no tengan operaciones de punto flotante y habría que hacer o conseguir bibliotecas que realicen esas operaciones.
Las instrucciones de la CPU pueden agruparse, de acuerdo a su funcionalidad, en:
Operaciones con enteros: (de 8, 16, 32 y 64 bits dependiendo de la arquitectura de la CPU, en los sistemas muy viejos también de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por laUnidad aritmético lógica de la CPU
  • Operaciones aritméticas. Como suma, resta, multiplicación, división, módulo, cambio de signo
  • Operaciones booleanas. Operaciones lógicas bit a bit como ANDORXOR,NOT
  • Operaciones de bits. Como desplazamiento o shift lógico y rotaciones u Operadores a nivel de bits(hacia la derecha o hacia la izquierda, a través del bit del acarreo o sin él)
  • Comparaciones
Operaciones de mover datos:
Entre los registros y la memoria:
Aunque la instrucción se llama "mover", en la CPU, "mover datos" significa en realidad copiar datos, desde un origen a un destino, sin que el dato desaparezca del origen.
Se pueden mover valores:
  • desde un registro a otro
  • desde un registro a un lugar de la memoria
  • desde un lugar de la memoria a un registro
  • desde un lugar a otro de la memoria
  • un valor inmediato a un registro
  • un valor inmediato a un lugar de memoria
Operaciones de pila (stack, en inglés):
  • PUSH (escribe datos hacia el tope de la pila)
  • POP (lee datos desde el tope de la pila)
Operaciones de entrada/salida:
Son operaciones que mueven datos de un registro, desde y hacia un puerto; o de la memoria, desde y hacia un puerto
  • INPUT Lectura desde un puerto de entrada
  • OUTPUT Escritura hacia un puerto de salida
Operaciones para el control del flujo del programa:
  • Llamadas y retornos de subrutinas
  • Llamadas y retornos de interrupciones
  • Saltos condicionales de acuerdo al resultado de la comparaciones
  • Saltos incondicionales
Operaciones con números reales:
El estándar para las operaciones connúmeros reales en las CPU está definido por el IEEE 754.
Una CPU puede tener operaciones depunto flotante con números reales mediante el coprocesador numérico (si lo hay), como las siguientes:
El lenguaje ensamblador tiene mnemónicos para cada una de las instrucciones de la CPU en adición a otros mnemónicos a ser procesados por el programa ensamblador (como por ejemplo macros y otras sentencias en tiempo de ensamblado).

EnsambladoEditar

La transformación del lenguaje ensamblador en código máquina la realiza un programa ensamblador, y la traducción inversa la puede efectuar undesensamblador. A diferencia de loslenguajes de alto nivel, aquí hay usualmente una correspondencia 1 a 1 entre las instrucciones simples del ensamblador y el lenguaje de máquina. Sin embargo, en algunos casos, un ensamblador puede proveer "pseudo instrucciones" que se expanden en un código de máquina más extenso a fin de proveer la funcionalidad necesaria y simplificar la programación. Por ejemplo, para un código máquina condicional como "si X mayor o igual que", un ensamblador puede utilizar una pseudoinstrucción al grupo "haga si menor que", y "si = 0" sobre el resultado de la condición anterior. Los Ensambladores más completos también proveen un rico lenguaje de macros que se utiliza para generar código más complejo y secuencias de datos.
Para el mismo procesador y el mismoconjunto de instrucciones de CPU, diferentes programas ensambladores pueden tener, cada uno de ellos, variaciones y diferencias en el conjunto de mnemónicos o en la sintáxis de su lenguaje ensamblador. Por ejemplo, en un lenguaje ensamblador para la arquitectura x86, se puede expresar la instrucción para mover 5 al registro AL de la siguiente manera: MOV AL, 5, mientras que para otro ensamblador para la misma arquitectura se expresaría al revés: MOV 5, AL. Ambos lenguajes ensambladores harían exactamente lo mismo, solo que está expresado de manera diferente. El primero usa la sintaxis de Intel, mientras que el segundo usa la sintaxis de AT&T
El uso del ensamblador no resuelve definitivamente el problema de cómo programar un sistema basado en microprocesador de modo sencillo ya que para hacer un uso eficiente del mismo, hay que conocer a fondo elmicroprocesador, los registros de trabajo de que dispone, la estructura de la memoria, y muchas cosas más referentes a su estructura básica de funcionamiento.

EjemplosEditar

Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables por un microprocesador.
Por ejemplo, en el lenguaje ensamblador para un procesador x86:
La sentencia
  • MOV AL, 61h
Asigna el valor hexadecimal 61 (97decimal) al registro "AL".
El programa ensamblador lee la sentencia de arriba y produce su equivalente binario en lenguaje de máquina
  • Binario: 10110000 01100001(hexadecimal: B61)
El mnemónico MOV es un código de operación u "opcode". El opcode es seguido por una lista de argumentos oparámetros, completando una típica instrucción de ensamblador. En el ejemplo, AL es un registro de 8 bits del procesador, al cual se le asignará el valor hexadecimal 61 especificado.
El código de máquina generado por el ensamblador consiste de 2 bytes. El primer byte contiene empaquetado la instrucción MOV y el código del registro hacia donde se va a mover el dato:
1011 0000 01100001
| | |
| | +---- Número 61h en binario
| |
| +--- Registro AL
+-------- Instrucción MOV
En el segundo byte se especifica el número 61h, escrito en binario como 01100001, que se asignará al registro AL, quedando la sentencia ejecutable como:
  • 10110000 01100001
La cual puede ser entendida y ejecutada directamente por el procesador.



Lenguaje ensamblador


Lenguaje de máquina del Intel 8088. El código de máquina en hexadecimal se resalta en rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII.
El lenguaje ensamblador, o assembler(en inglés assembly language y la abreviación asm), es un lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que representan instrucciones básicas para los computadoresmicroprocesadores,microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de loscódigos de máquina binarios y otras constantes necesarias para programar una arquitectura de processador y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Cada arquitectura de processador tiene su propio lenguaje ensamblador que usualmente es definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoriay otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portátiles.
Un programa utilitario llamadoensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad demacro (descrita más abajo), y se llamanmacro ensambladores.
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 dehardware, alto rendimiento, o un uso de recursos controlado y reducido. También es utilizado en el desarrollo decontroladores 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.