Sunteți pe pagina 1din 68

Compilador

Compilacin redirige aqu. Para otras acepciones, vase recopilacin.

Diagrama a bloques de la operacin de un buen compilador.

Un compilador es un programa informtico que traduce un programa escrito en


un lenguaje de programacin a otro lenguaje diferente.1 Usualmente el segundo lenguaje
es lenguaje de mquina, pero tambin puede ser un cdigo intermedio (bytecode), o
simplemente texto. Este proceso de traduccin se conoce como compilacin.2

La construccin de un compilador involucra la divisin del proceso en una serie de fases


que variar con su complejidad. Generalmente estas fases se agrupan en dos tareas: el
anlisis del programa fuente y la sntesis del programa objeto.

Anlisis: Se trata de la comprobacin de la correccin del programa fuente, e


incluye las fases correspondientes al Anlisis lxico (que consiste en la
descomposicin del programa fuente en componentes lxicos), anlisis
sintctico (agrupacin de los componentes lxicos en frases gramaticales ) y anlisis
semntico (comprobacin de la validez semntica de las sentencias aceptadas en la
fase de anlisis sintctico).

Sntesis: Su objetivo es la generacin de la salida expresada en el lenguaje


objeto y suele estar formado por una o varias combinaciones de fases de generacin
de cdigo (normalmente se trata de cdigo intermedio o de cdigo objeto) y de
optimizacin de cdigo (en las que se busca obtener un cdigo lo ms eficiente
posible).

Alternativamente, las fases descritas para las tareas de anlisis y sntesis se pueden
agrupar en Front-end y Back-end:

Front-end: es la parte que analiza el cdigo fuente, comprueba su validez, genera


el rbol de derivacin y rellena los valores de la tabla de smbolos. Esta parte suele ser
independiente de la plataforma o sistema para el cual se vaya a compilar, y est
compuesta por las fases comprendidas entre el anlisis Lxico y la generacin de
cdigo intermedio.

Back-end: es la parte que genera el cdigo mquina, especfico de una plataforma,


a partir de los resultados de la fase de anlisis, realizada por el Front End.

Esta divisin permite que el mismo Back End se utilice para generar el cdigo mquina de
varios lenguajes de programacin distintos y que el mismo Front End que sirve para
analizar el cdigo fuente de un lenguaje de programacin concreto sirva para
generar cdigo mquina en varias plataformas distintas. Suele incluir la generacin y
optimizacin del cdigo dependiente de la mquina.
ndice
[ocultar]

1Historia

2Tipos de compiladores

3Proceso de compilacin

4Etapas del proceso


4.1Fase de anlisis

4.1.1Anlisis lxico

4.1.2Anlisis sintctico

4.1.3Anlisis semntico
4.2Fase de sntesis

4.2.1Generacin de cdigo intermedio


4.3Optimizacin de cdigo
5Estructura de datos principales

5.1Componentes lxicos o tokens

5.2rbol sintctico

5.3Tabla de smbolos

5.4Tabla de literales

5.5Cdigo intermedio

5.6Archivos temporales

6Vase tambin

7Referencias

8Enlaces externos

Historia[editar]
Artculo principal: Historia de la construccin de los compiladores

En 1946 se desarroll la primera computadora digital. En un principio, estas mquinas


ejecutaban instrucciones consistentes en cdigos numricos que sealaban a los circuitos
de la mquina los estados correspondientes a cada operacin, lo que se
denomin lenguaje mquina.
Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus
programas mediante claves ms fciles de recordar que esos cdigos; al final, todas esas
claves juntas se traducan manualmente a lenguaje mquina. Estas claves constituyen los
llamados lenguajes ensambladores.
Pese a todo, el lenguaje ensamblador segua siendo el de una mquina, pero ms fcil de
manejar. Los trabajos de investigacin se orientaron hacia la creacin de un lenguaje que
expresara las distintas acciones a realizar de una manera lo ms sencilla posible para una
persona. El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de
programacin A-0. En 1950 John Backus dirigi una investigacin en IBM sobre un
lenguaje algebraico. En 1954 se empez a desarrollar un lenguaje que permita escribir
frmulas matemticas de manera traducible por un ordenador; le llamaron FORTRAN
(FORmulae TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para
el uso de la computadora IBM modelo 704.
Surgi as por primera vez el concepto de un traductor como un programa que traduca un
lenguaje a otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje
de alto nivel y el lenguaje traducido de bajo nivel, se emplea el trmino compilador.
La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN tard 18
aos-persona en realizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy
influenciado por la mquina objeto en la que iba a ser implementado. Como un ejemplo de
ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido a que el
perifrico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas)
no contaba correctamente los espacios en blanco.
El primer compilador autocontenido, es decir, capaz de compilar su propio cdigo fuente
fue el creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido
en una prctica comn escribir el compilador en el mismo lenguaje que este compila,
aunque Pascal y C han sido alternativas muy usadas.
Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el
primer compilador creado para un lenguaje tiene que o bien ser compilado por un
compilador escrito en otro lenguaje o bien compilado al ejecutar el compilador en
un intrprete.

Tipos de compiladores[editar]
Esta taxonoma de los tipos de compiladores no es excluyente, por lo que puede haber
compiladores que se adscriban a varias categoras:

Compiladores cruzados: generan cdigo para un sistema distinto del que estn
funcionando.

Compiladores optimizadores: realizan cambios en el cdigo para mejorar su


eficiencia, pero manteniendo la funcionalidad del programa original.

Compiladores de una sola pasada: generan el cdigo mquina a partir de una


nica lectura del cdigo fuente.

Compiladores de varias pasadas: necesitan leer el cdigo fuente varias veces


antes de poder producir el cdigo mquina.

Compiladores JIT (Just In Time): forman parte de un intrprete y compilan partes


del cdigo segn se necesitan.

Pauta de creacin de un compilador: En las primeras pocas de la informtica,


el software de los compiladores era considerado como uno de los ms complejos
existentes.
Los primeros compiladores se realizaron programndolos directamente en lenguaje
mquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir
nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que
compila ese compilador.
Actualmente existen herramientas que facilitan la tarea de escribir compiladores
intrpretes informticos. Estas herramientas permiten generar el esqueleto del analizador
sintctico a partir de una definicin formal del lenguaje de partida, especificada
normalmente mediante una gramtica formal y barata, dejando nicamente al programador
del compilador la tarea de programar las acciones semnticas asociadas.

Proceso de compilacin[editar]
Es el proceso por el cual se traducen las instrucciones escritas en un determinado
lenguaje de programacin a lenguaje mquina. Adems de un traductor, se pueden
necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente
se puede dividir en mdulos almacenados en archivos distintos. La tarea de reunir el
programa fuente a menudo se confa a un programa distinto, llamado preprocesador. El
preprocesador tambin puede expandir abreviaturas, llamadas a macros, a proposiciones
del lenguaje fuente.
Normalmente la creacin de un programa ejecutable (un tpico.exe para Microsoft
Windows o DOS) conlleva dos pasos. El primer paso se llama compilacin (propiamente
dicho) y traduce el cdigo fuente escrito en un lenguaje de programacin almacenado en
un archivo a cdigo en bajo nivel (normalmente en cdigo objeto, no directamente a
lenguaje mquina). El segundo paso se llama enlazado en el cual se enlaza el cdigo de
bajo nivel generado de todos los ficheros y subprogramas que se han mandado a compilar
y se aade el cdigo de las funciones que hay en las bibliotecas del compilador para que
el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo as
finalmente el cdigo objeto a cdigo mquina, y generando un mdulo ejecutable.
Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de
compilacin en archivos objetos (un tpico.obj para Microsoft Windows, DOS o para Unix);
para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase
de compilacin se almacena solo temporalmente. Un programa podra tener partes
escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podran compilar de
forma independiente y luego enlazar juntas para formar un nico mdulo ejecutable.

Etapas del proceso[editar]


El proceso de traduccin se compone internamente de varias etapas o fases, que realizan
distintas operaciones lgicas. Es til pensar en estas fases como en piezas separadas

dentro del traductor, y pueden en realidad escribirse como operaciones codificadas


separadamente aunque en la prctica a menudo se integren juntas.

Fase de anlisis[editar]
Anlisis lxico[editar]
Artculo principal: Analizador lxico

El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de izquierda a
derecha y se agrupa en componentes lxicos (tokens), que son secuencias de
caracteres que tienen un significado. Adems, todos los espacios en blanco, lneas en
blanco, comentarios y dems informacin innecesaria se elimina del programa fuente.
Tambin se comprueba que los smbolos del lenguaje (palabras clave, operadores, etc.) se
han escrito correctamente.
Como la tarea que realiza el analizador lxico es un caso especial de coincidencia de
patrones, se necesitan los mtodos de especificacin y reconocimiento de patrones, se
usan principalmente los autmatas finitos que acepten expresiones regulares. Sin
embargo, un analizador lxico tambin es la parte del traductor que maneja la entrada del
cdigo fuente, y puesto que esta entrada a menudo involucra un importante gasto de
tiempo, el analizador lxico debe funcionar de manera tan eficiente como sea posible.
Anlisis sintctico[editar]
Artculo principal: Analizador sintctico
En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente en frases
gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido
de la fase anterior es sintcticamente correcto (obedece a la gramtica del lenguaje). Por
lo general, las frases gramaticales del programa fuente se representan mediante un rbol
de anlisis sintctico.
La estructura jerrquica de un programa normalmente se expresa utilizando
reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la
definicin de expresiones:
1. Cualquier identificador es una expresin.
2. Cualquier nmero es una expresin.
3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son:

expresin1 + expresin2

expresin1 * expresin2

( expresin1 )

Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3 define
expresiones en funcin de operadores aplicados a otras expresiones.
La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor para
determinar la divisin es si una construccin del lenguaje fuente es inherentemente
recursiva o no. Las construcciones lxicas no requieren recursin, mientras que las
construcciones sintcticas suelen requerirla. No se requiere recursin para reconocer los
identificadores, que suelen ser cadenas de letras y dgitos que comienzan con una letra.
Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada,
esperando hasta encontrar un carcter que no sea ni letra ni dgito, y agrupando despus
todas las letras y dgitos encontrados hasta ese punto en un componente lxico
llamado identificador. Por otra parte, esta clase de anlisis no es suficientemente
poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar

de manera apropiada los parntesis de las expresiones, o las palabras begin y end en
proposiciones sin imponer alguna clase de estructura jerrquica o de anidamiento a la
entrada.
Anlisis semntico[editar]
La fase de anlisis semntico revisa el programa fuente para tratar de encontrar errores
semnticos y rene la informacin sobre los tipos para la fase posterior de generacin de
cdigo. En ella se utiliza la estructura jerrquica determinada por la fase de anlisis
sintctico para identificar los operadores y operandos de expresiones y proposiciones.
Un componente importante del anlisis semntico es la verificacin de tipos. Aqu, el
compilador verifica si cada operador tiene operandos permitidos por la especificacin del
lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programacin
requieren que el compilador indique un error cada vez que se use un nmero real como
ndice de una matriz. Sin embargo, la especificacin del lenguaje puede imponer
restricciones a los operandos, por ejemplo, cuando un operador aritmtico binario se aplica
a un nmero entero y a un nmero real.3 Revisa que los arreglos tengan definido el tamao
correcto.

Fase de sntesis[editar]
Consiste en generar el cdigo objeto equivalente al programa fuente. Solo se genera
cdigo objeto cuando el programa fuente est libre de errores de anlisis, lo cual no quiere
decir que el programa se ejecute correctamente, ya que un programa puede tener errores
de concepto o expresiones mal calculadas. Por lo general el cdigo objeto es cdigo de
mquina relocalizable o cdigo ensamblador. Las posiciones de memoria se seleccionan
para cada una de las variables usadas por el programa. Despus, cada una de las
instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que
ejecuta la misma tarea. Un aspecto decisivo es la asignacin de variables a registros.
Generacin de cdigo intermedio[editar]
Despus de los anlisis sintctico y semntico, algunos compiladores generan una
representacin intermedia explcita del programa fuente. Se puede considerar esta
representacin intermedia como un programa para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes; debe ser fcil de
producir y fcil de traducir al programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma intermedia
llamada cdigo de tres direcciones que es como el lenguaje ensamblador de una
mquina en la que cada posicin de memoria puede actuar como un registro. El cdigo de
tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene
como mximo tres operandos. Esta representacin intermedia tiene varias propiedades:

Primera.- Cada instruccin de tres direcciones tiene a lo sumo un operador,


adems de la asignacin, por tanto, cuando se generan estas instrucciones, el
traductor tiene que decidir el orden en que deben efectuarse las operaciones.

Segunda.- El traductor debe generar un nombre temporal para guardar los valores
calculados por cada instruccin.

Tercera.- Algunas instrucciones de tres direcciones tienen menos de tres


operandos, por ejemplo, la asignacin.

Optimizacin de cdigo[editar]
Artculo principal: Compilador optimizador

La fase de optimizacin de cdigo consiste en mejorar el cdigo intermedio, de modo que


resulte un cdigo mquina ms rpido de ejecutar. Esta fase de la etapa de sntesis es
posible sobre todo si el traductor es un compilador (difcilmente un intrprete puede

optimizar el cdigo objeto). Hay mucha variacin en la cantidad de optimizacin de cdigo


que ejecutan los distintos compiladores. En los que hacen mucha optimizacin, llamados
compiladores optimizadores, una parte significativa del tiempo del compilador se ocupa
en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el
tiempo de ejecucin del programa objeto sin retardar demasiado la compilacin. 3

Estructura de datos principales[editar]


La interaccin entre los algoritmos utilizados por las fases del compilador y las estructuras
de datos que soportan estas fases es, naturalmente, muy fuerte. El escritor del compilador
se esfuerza por implementar estos algoritmos de una manera tan eficaz como sea posible,
sin aumentar demasiado la complejidad. De manera ideal, un compilador debera poder
compilar un programa en un tiempo proporcional al tamao del mismo.

Componentes lxicos o tokens[editar]


Cuando un analizador lxico rene los caracteres en un token, generalmente representa el
token de manera simblica, es decir, como un valor de un tipo de datos enumerado que
representa el conjunto de tokens del lenguaje fuente. En ocasiones tambin es necesario
mantener la cadena de caracteres misma u otra informacin derivada de ella, tal como el
nombre asociado con un token identificador o el valor de un token de nmero.
En la mayora de los lenguajes el analizador lxico solo necesita generar un token a la vez.
En este caso se puede utilizar una variable global simple para mantener la informacin del
token. En otros casos (cuyo ejemplo ms notable es FORTRAN), puede ser necesario
un arreglo (o vector) de tokens.

rbol sintctico[editar]
Si el analizador sintctico genera un rbol sintctico, por lo regular se construye como una
estructura estndar basada en un puntero que se asigna de manera dinmica a medida
que se efecta el anlisis sintctico. El rbol entero puede entonces conservarse como
una variable simple que apunta al nodo raz. Cada nodo en la estructura es un registro
cuyos campos representan la informacin recolectada tanto por el analizador sintctico
como, posteriormente, por el analizador semntico. Por ejemplo, el tipo de datos de una
expresin puede conservarse como un campo en el nodo del rbol sintctico para la
expresin.
En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinmica, o se
almacenan en otras estructuras de datos, tales como la tabla de smbolos, que permiten
una asignacin y desasignacin selectivas. En realidad, cada nodo del rbol sintctico por
s mismo puede requerir de atributos diferentes para ser almacenado, de acuerdo con la
clase de estructura del lenguaje que represente. En este caso, cada nodo en el rbol
sintctico puede estar representado por un registro variable, con cada clase de nodo
conteniendo solamente la informacin necesaria para ese caso.

Tabla de smbolos[editar]
Esta estructura de datos mantiene la informacin asociada con los
identificadores: funciones, variables, constantes y tipos de datos. La tabla de smbolos
interacta con casi todas las fases del compilador: el analizador lxico, el analizador
sintctico o el analizador semntico pueden introducir identificadores dentro de la tabla; el
analizador semntico agregar tipos de datos y otra informacin; y las fases de
optimizacin y generacin de cdigo utilizarn la informacin proporcionada por la tabla de
smbolos para efectuar selecciones apropiadas de cdigo objeto.
Puesto que la tabla de smbolos tendr solicitudes de acceso con tanta frecuencia, las
operaciones de insercin, eliminacin y acceso necesitan ser eficientes, preferiblemente
operaciones de tiempo constante. Una estructura de datos estndar para este propsito es
la tabla de dispersin o de clculo de direccin, aunque tambin se pueden utilizar

diversas estructuras de rbol. En ocasiones se utilizan varias tablas y se mantienen en


una lista o pila.

Tabla de literales[editar]
La bsqueda y la insercin rpida son esenciales tambin para la tabla de literales, la cual
almacena constantes y cadenas utilizadas en el programa. Sin embargo, una tabla de
literales necesita impedir las eliminaciones porque sus datos se aplican globalmente al
programa y una constante o cadena aparecer solo una vez en esta tabla. La tabla de
literales es importante en la reduccin del tamao de un programa en la memoria al
permitir la reutilizacin de constantes y cadenas. Tambin es necesaria para que
el generador de cdigo construya direcciones simblicas para las literales y para introducir
definiciones de datos en el archivo de cdigo objeto.

Cdigo intermedio[editar]
De acuerdo con la clase de cdigo intermedio (por ejemplo, cdigo de tres direcciones o
cdigo P) y de las clases de optimizaciones realizadas, este cdigo puede conservarse
como un arreglo de cadenas de texto, un archivo de texto temporal o bien una lista de
estructuras ligadas. En los compiladores que realizan optimizaciones complejas debe
ponerse particular atencin a la seleccin de representaciones que permitan una fcil
reorganizacin.
Generacin de cdigo intermedio
Despus de los anlisis sintctico y semntico, algunos compiladores generan una
representacin intermedia explcita del programa fuente. Se puede considerar esta
representacin intermedia como un programa para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes; debe ser fcil de
producir y fcil de traducir al programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma intermedia
llamada cdigo de tres direcciones, que es como el lenguaje ensamblador para una
mquina en la que cada posicin de memoria puede actuar como un registro. El cdigo de
tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene
como mximo tres operandos. El programa fuente de (1) puede aparecer en cdigo de tres
direcciones como
temp1 := entreal(60)
temp2 := id3 * temp1

===> (2)

temp3 := id2 + temp2


id1 := temp3

Esta representacin intermedia tiene varias propiedades. Primera, cada instruccin de tres
direcciones tiene a lo sumo un operador, adems de la asignacin. Por tanto, cuando se
generan esas instrucciones el compilador tiene que decidir el orden en que deben
efectuarse, las operaciones; la multiplicacin precede a la adicin al programa fuente de.
Segunda, el compilador debe generar un nombre temporal para guardar los valores
calculados por cada instruccin. Tercera, algunas instrucciones de tres direcciones
tienen menos de tres operadores, por ejemplo la primera y la ltima instrucciones de
asignacin.
Optimizacin de Cdigo
La fase de optimizacin de cdigo trata de mejorar el cdigo intermedio de modo que
resulte un cdigo de mquina ms rpido de ejecutar. Algunas optimizaciones son triviales.
Por ejemplo, un algoritmo natural genera el cdigo intermedio (2) utilizando una instruccin
para cada operador de la representacin del rbol despus del anlisis semntico, aunque
hay una forma mejor de realizar los mismos clculos usando las dos instrucciones

temp1 := id3 * 60.0

===> (3)

id1 := id2 + temp1

Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar
en la fase de optimizacin de cdigo. Esto es, el compilador puede deducir que la
conversin de 60 de entero a real se puede hacer de una vez por todas en el momento de
la compilacin, de modo que la operacin "entreal( )" se puede eliminar. Adems, temp3 se
usa solo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por
temp3, a partir de lo cual la ltima proposicin de (2) no se necesita y se obtiene el cdigo
de (3).
Hay muchas variaciones en la cantidad de optimizacin de cdigo que ejecutan los
distintos compiladores. En lo que hacen mucha optimizacin llamados compiladores
optimizadores, una parte significativa del tiempo del compilador se ocupa en esta fase.
Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de
ejecucin del programa objeto sin retardar demasiado la compilacin.

Archivos temporales[editar]
Al principio las computadoras no tenan la suficiente memoria para guardar un programa
completo durante la compilacin. Este problema se resolvi mediante el uso de archivos
temporales para mantener los productos de los pasos intermedios durante la traduccin o
bien al compilar al vuelo, es decir, manteniendo solo la informacin suficiente de las
partes anteriores del programa fuente que permita proceder a la traduccin.
Las limitaciones de memoria son ahora un problema mucho menor, y es posible requerir
que una unidad de compilacin entera se mantenga en memoria, en especial si se dispone
de la compilacin por separado en el lenguaje. Con todo, los compiladores ocasionalmente
encuentran til generar archivos intermedios durante alguna de las etapas del
procesamiento. Algo tpico de estos es la necesidad de direcciones de correccin hacia
atrs durante la generacin de cdigo.

Lenguaje de programacin

Captura de la microcomputadora Commodore PET-32 mostrando un programa en el lenguaje de


programacin BASIC, bajo el emulador VICE en una distribucin GNU/Linux.

Un ejemplo de cdigo fuente escrito en el lenguaje de programacin Java, que imprimir el mensaje
"Hello World!" a la salida estndar cuando es compilado y ejecutado

Un lenguaje de programacin es un lenguaje formal diseado para realizar procesos que


pueden ser llevados a cabo por mquinas como las computadoras.
Pueden usarse para crear programas que controlen el comportamiento fsico y lgico de
una mquina, para expresar algoritmos con precisin, o como modo de comunicacin
humana.1
Est formado por un conjunto de smbolos y reglas sintcticas y semnticas que definen su
estructura y el significado de sus elementos y expresiones. Al proceso por el cual se
escribe, se prueba, se depura, se compila (de ser necesario) y se mantiene el cdigo
fuente de un programa informtico se le llama programacin.
Tambin la palabra programacin se define como el proceso de creacin de
un programa de computadora, mediante la aplicacin de procedimientos lgicos, a travs
de los siguientes pasos:

El desarrollo lgico del programa para resolver un problema en particular.

Escritura de la lgica del programa empleando un lenguaje de programacin


especfico (codificacin del programa).

Ensamblaje o compilacin del programa hasta convertirlo en lenguaje de mquina.

Prueba y depuracin del programa.

Desarrollo de la documentacin.

Existe un error comn que trata por sinnimos los trminos 'lenguaje de programacin' y
'lenguaje informtico'. Los lenguajes informticos engloban a los lenguajes de
programacin y a otros ms, como por ejemplo HTML (lenguaje para el
marcado de pginas web que no es propiamente un lenguaje de programacin, sino
un conjunto de instrucciones que permiten estructurar el contenido de los documentos).
Permite especificar de manera precisa sobre qu datos debe operar una computadora,
cmo deben ser almacenados o transmitidos y qu acciones debe tomar bajo una variada
gama de circunstancias. Todo esto, a travs de un lenguaje que intenta
estar relativamente prximo al lenguaje humano o natural. Una caracterstica relevante de
los lenguajes de programacin es precisamente que ms de un programador pueda usar
un conjunto comn de instrucciones que sean comprendidas entre ellos para realizar la
construccin de un programa de forma colaborativa.
ndice
[ocultar]

1Historia

2Elementos
o

2.1Variables y vectores

2.2Condicionales

2.3Bucles

2.4Funciones

2.5Sintaxis

2.6Semntica esttica

2.7Sistema de tipos

2.7.1Lenguajes tipados versus lenguajes no tipados

2.7.2Tipos estticos versus tipos dinmicos

2.7.3Tipos dbiles y tipos fuertes

3Implementacin

4Tcnica
o

4.1Paradigmas

5Vase tambin

6Referencias

7Enlaces externos

Historia[editar]
Artculo principal: Historia de los lenguajes de programacin

Cdigo Fortran en una tarjeta perforada, mostrando el uso especializado de las columnas 1-5, 6 y
73-80.

Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje


especfico conocido como cdigo mquina, el cual la mquina comprende fcilmente, pero
que lo hace excesivamente complicado para las personas. De hecho slo consiste en
cadenas extensas de nmeros 0 y 1.
Para facilitar el trabajo, los primeros operadores de computadoras decidieron hacer un
traductor para reemplazar los 0 y 1 por palabras o abstraccin de palabras y letras
provenientes del ingls; ste se conoce como lenguaje ensamblador. Por ejemplo, para
sumar se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue
la misma estructura del lenguaje mquina, pero las letras y palabras son ms fciles de
recordar y entender que los nmeros.
La necesidad de recordar secuencias de programacin para las acciones usuales llev a
denominarlas con nombres fciles 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 programacin, los cuales reciben su denominacin porque tienen una
estructura sintctica semejante a la de los lenguajes escritos por los humanos,
denominados tambin lenguajes de alto nivel.
El primer programador de computadora que se haya conocido fue una mujer: Ada
Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella inici en las
matemticas a Ada quien, despus de conocer a Charles Babbage, tradujo y ampli una
descripcin de su mquina analtica. Incluso aunque Babbage nunca complet la
construccin de cualquiera de sus mquinas, el trabajo que Ada realiz con stas le hizo
ganarse el ttulo de primera programadora de computadoras del mundo. El nombre
del lenguaje de programacin Ada fue escogido como homenaje a esta programadora.
A finales de 1953, John Backus someti una propuesta a sus superiores en IBM para
desarrollar una alternativa ms prctica al lenguaje ensamblador para programar
la computadora central IBM 704. El histrico equipo Fortran de Backus consisti en los
programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy
Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.2
El primer manual para el lenguaje Fortran apareci en octubre de 1956, con el
primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado,
porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su
compilador pudiera generar cdigo cuyo desempeo fuera comparable al de un cdigo
hecho a mano en lenguaje ensamblador.
En 1960, se cre COBOL, uno de los lenguajes usados an en la actualidad,
en informtica de gestin.
A medida que la complejidad de las tareas que realizaban las computadoras aumentaba,
se hizo necesario disponer de un mtodo ms eficiente para programarlas. Entonces, se
crearon los lenguajes de alto nivel, como lo fue BASIC en las versiones introducidas en los
microordenadores de la dcada de 1980. Mientras que una tarea tan sencilla como sumar
dos nmeros puede necesitar varias instrucciones en lenguaje ensamblador, en un
lenguaje de alto nivel bastar una sola sentencia.

Elementos[editar]
Variables y vectores[editar]

Imagen tomada de Pauscal, lenguaje de programacin en espaol creado en Argentina.

Las variables son ttulos asignados a espacios en memoria para almacenar datos
especficos. Son contenedores de datos y por ello se diferencian segn el tipo de dato que
son capaces de almacenar. En la mayora de lenguajes de programacin se requiere
especificar un tipo de variable concreto para guardar un dato especfico. Por ejemplo,

en Java, si deseamos guardar una cadena de texto debemos especificar que la variable es
del tipo String. Por otra parte, en lenguajes como PHP este tipo de especificacin de
variables no es necesario. Adems, existen variables compuestas llamadas vectores. Un
vector no es ms que un conjunto de bytes consecutivas en memoria y del mismo tipo
guardadas dentro de una variable contenedor. A continuacin, un listado con los tipos de
variables y vectores ms comunes:
Tipo de
dato

Breve descripcin

Char

Estas variables contienen un nico carcter, es decir, una letra, un signo o un


nmero.

Int

Contienen un nmero entero.

Float

Contienen un nmero decimal.

String

Contienen cadenas de texto, o lo que es lo mismo, es un vector con varias variables


del tipo Char.

Boolean

Solo pueden contener un cero o un uno.

En el caso de variables booleanas, el cero es considerado para muchos lenguajes como el


literal falso ("False"), mientras que el uno se considera verdadero ("True").

Condicionales[editar]
Las sentencias condicionales son estructuras de cdigo que indican que, para que cierta
parte del programa se ejecute, deben cumplirse ciertas premisas; por ejemplo: que dos
valores sean iguales, que un valor exista, que un valor sea mayor que otro... Estos
condicionantes por lo general solo se ejecutan una vez a lo largo del programa. Los
condicionantes ms conocidos y empleados en programacin son:

If: Indica una condicin para que se ejecute una parte del programa.

Else if: Siempre va precedido de un "If" e indica una condicin para que se ejecute
una parte del programa siempre que no cumpla la condicin del if previo y si se cumpla
con la que el "else if" especifique.

Else: Siempre precedido de "If" y en ocasiones de "Else If". Indica que debe
ejecutarse cuando no se cumplan las condiciones previas.

Bucles[editar]
Los bucles son parientes cercanos de los condicionantes, pero ejecutan constantemente
un cdigo mientras se cumpla una determinada condicin. Los ms frecuentes son:

For: Ejecuta un cdigo mientras una variable se encuentre entre 2 determinados


parmetros.

While: Ejecuta un cdigo mientras que se cumpla la condicin que solicita.

Hay que decir que a pesar de que existan distintos tipos de bucles, ambos son capaces de
realizar exactamente las mismas funciones. El empleo de uno u otro depende, por lo
general, del gusto del programador.

Funciones[editar]
Las funciones se crearon para evitar tener que repetir constantemente fragmentos de
cdigo. Una funcin podra considerarse como una variable que encierra cdigo dentro de
si. Por lo tanto cuando accedemos a dicha variable (la funcin) en realidad lo que estamos
haciendo es ordenar al programa que ejecute un determinado cdigo predefinido
anteriormente.
Todos los lenguajes de programacin tienen algunos elementos de formacin primitivos
para la descripcin de los datos y de los procesos o transformaciones aplicadas a estos
datos (tal como la suma de dos nmeros o la seleccin de un elemento que forma parte de
una coleccin). Estos elementos primitivos son definidos por reglas sintcticas y
semnticas que describen su estructura y significado respectivamente.

Sintaxis[editar]

Con frecuencia se resaltan los elementos de la sintaxis con colores diferentes para facilitar su
lectura. Este ejemplo est escrito en Python.

A la forma visible de un lenguaje de programacin se le conoce como sintaxis. La mayora


de los lenguajes de programacin son puramente textuales, es decir, utilizan secuencias
de texto que incluyen palabras, nmeros y puntuacin, de manera similar a los lenguajes
naturales escritos. Por otra parte, hay algunos lenguajes de programacin que son ms
grficos en su naturaleza, utilizando relaciones visuales entre smbolos para especificar un
programa.
La sintaxis de un lenguaje de programacin describe las combinaciones posibles de los
smbolos que forman un programa sintcticamente correcto. El significado que se le da a
una combinacin de smbolos es manejado por su semntica (ya sea formal o como parte
del cdigo duro de la referencia de implementacin). Dado que la mayora de los lenguajes
son textuales, este artculo trata de la sintaxis textual.
La sintaxis de los lenguajes de programacin es definida generalmente utilizando una
combinacin de expresiones regulares (para la estructura lxica) y la Notacin de BackusNaur (para la estructura gramtica). Este es un ejemplo de una gramtica simple, tomada
de Lisp:
expresin ::= tomo | lista
tomo ::= nmero | smbolo

nmero ::= [+-]? ['0'-'9']+


smbolo ::= ['A'-'Z'] ['a'-'z'].*
lista ::= '(' expresin* ')'

Con esta gramtica se especifica lo siguiente:

una expresin puede ser un tomo o una lista;

un tomo puede ser un nmero o un smbolo;

un nmero es una secuencia continua de uno o ms dgitos decimales, precedido


opcionalmente por un signo ms o un signo menos;
un smbolo es una letra seguida de cero o ms caracteres (excluyendo espacios); y
una lista es un par de parntesis que abren y cierran, con cero o ms expresiones
en medio.

Algunos ejemplos de secuencias bien formadas de acuerdo a esta gramtica:


' 12345 ', ' () ', ' (a b c232 (1)) '
No todos los programas sintcticamente correctos son semnticamente correctos. Muchos
programas sintcticamente correctos tienen inconsistencias con las reglas del lenguaje; y
pueden (dependiendo de la especificacin del lenguaje y la solidez de la implementacin)
resultar en un error de traduccin o ejecucin. En algunos casos, tales programas pueden
exhibir un comportamiento indefinido. Adems, incluso cuando un programa est bien
definido dentro de un lenguaje, todava puede tener un significado que no es el que la
persona que lo escribi estaba tratando de construir.
Usando el lenguaje natural, por ejemplo, puede no ser posible asignarle significado a una
oracin gramaticalmente vlida o la oracin puede ser falsa:

"Las ideas verdes y descoloridas duermen furiosamente" es una oracin bien


formada gramaticalmente pero no tiene significado comnmente aceptado.

"Juan es un soltero casado" tambin est bien formada gramaticalmente pero


expresa un significado que no puede ser verdadero.

El siguiente fragmento en el lenguaje C es sintcticamente correcto, pero ejecuta una


operacin que no est definida semnticamente (dado que p es un apuntador nulo, las
operaciones p->real y p->im no tienen ningn significado):
complex *p = NULL;
complex abs_p = sqrt (p->real * p->real + p->im * p->im);

Si la declaracin de tipo de la primera lnea fuera omitida, el programa disparara un error


de compilacin, pues la variable "p" no estara definida. Pero el programa sera
sintcticamente correcto todava, dado que las declaraciones de tipo proveen informacin
semntica solamente.
La gramtica necesaria para especificar un lenguaje de programacin puede ser
clasificada por su posicin en la Jerarqua de Chomsky. La sintaxis de la mayora de los

lenguajes de programacin puede ser especificada utilizando una gramtica Tipo-2, es


decir, son gramticas libres de contexto. Algunos lenguajes, incluyendo a Perl y a Lisp,
contienen construcciones que permiten la ejecucin durante la fase de anlisis. Los
lenguajes que permiten construcciones que permiten al programador alterar el
comportamiento de un analizador hacen del anlisis de la sintaxis un problema sin decisin
nica, y generalmente oscurecen la separacin entre anlisis y ejecucin. En contraste con
el sistema de macros de Lisp y los bloques BEGIN de Perl, que pueden tener clculos
generales, las macros de C son meros reemplazos de cadenas, y no requieren ejecucin
de cdigo.

Semntica esttica[editar]
La semntica esttica define las restricciones sobre la estructura de los textos vlidos que
resulta imposible o muy difcil expresar mediante formalismos sintcticos estndar. Para
los lenguajes compilados, la semntica esttica bsicamente incluye las reglas semnticas
que se pueden verificar en el momento de compilar. Por ejemplo el chequeo de que cada
identificador sea declarado antes de ser usado (en lenguajes que requieren tales
declaraciones) o que las etiquetas en cada brazo de una estructura case sean distintas.
Muchas restricciones importantes de este tipo, como la validacin de que los
identificadores sean usados en los contextos apropiados (por ejemplo no sumar un entero
al nombre de una funcin), o que las llamadas a subrutinas tengan el nmero y tipo de
parmetros adecuado, puede ser implementadas definindolas como reglas en una lgica
conocida como sistema de tipos. Otras formas de anlisis estticos, como los anlisis de
flujo de datos, tambin pueden ser parte de la semntica esttica. Otros lenguajes de
programacin como Java y C# tienen un anlisis definido de asignaciones, una forma de
anlisis de flujo de datos, como parte de su semntica esttica.

Sistema de tipos[editar]
Artculo principal: Sistema de tipos

Un sistema de tipos define la manera en la cual un lenguaje de programacin clasifica los


valores y expresiones en tipos, cmo pueden ser manipulados dichos tipos y cmo
interactan. El objetivo de un sistema de tipos es verificar y normalmente poner en vigor un
cierto nivel de exactitud en programas escritos en el lenguaje en cuestin, detectando
ciertas operaciones invlidas. Cualquier sistema de tipos decidible tiene sus ventajas y
desventajas: mientras por un lado rechaza muchos programas incorrectos, tambin
prohbe algunos programas correctos aunque poco comunes. Para poder minimizar esta
desventaja, algunos lenguajes incluyen lagunas de tipos, conversiones explcitas no
verificadas que pueden ser usadas por el programador para permitir explcitamente una
operacin normalmente no permitida entre diferentes tipos. En la mayora de los lenguajes
con tipos, el sistema de tipos es usado solamente para verificar los tipos de los programas,
pero varios lenguajes, generalmente funcionales, llevan a cabo lo que se conoce como
inferencia de tipos, que le quita al programador la tarea de especificar los tipos. Al diseo y
estudio formal de los sistemas de tipos se le conoce como teora de tipos.
Lenguajes tipados versus lenguajes no tipados[editar]
El texto que sigue es una traduccin defectuosa.
Si quieres colaborar con Wikipedia, busca el artculo original y mejora esta traduccin.

{{subst:Aviso mal
traducido|Lenguaje de programacin}} ~~~~

Copia y pega el siguiente cdigo en la pgina de discusin del autor:

Se dice que un lenguaje tiene tipos si la especificacin de cada operacin define tipos de
datos para los cuales la operacin es aplicable, con la implicacin de que no es aplicable a
otros tipos. Por ejemplo, " este texto entre comillas " es una cadena. En la mayora
de los lenguajes de programacin, dividir un nmero por una cadena no tiene ningn
significado. Por tanto, la mayora de los lenguajes de programacin modernos rechazaran

cualquier intento de ejecutar dicha operacin por parte de algn programa. En algunos
lenguajes, estas operaciones sin significado son detectadas cuando el programa es
compilado (validacin de tipos "esttica") y son rechazadas por el compilador, mientras en
otros son detectadas cuando el programa es ejecutado (validacin de tipos "dinmica") y
se genera una excepcin en tiempo de ejecucin.
Un caso especial de lenguajes de tipo son los lenguajes de tipo sencillo. Estos son con
frecuencia lenguajes de marcado o de scripts, como REXX o SGML, y solamente cuentan
con un tipo de datos; comnmente cadenas de caracteres que luego son usadas tanto
para datos numricos como simblicos.
En contraste, un lenguaje sin tipos, como la mayora de los lenguajes ensambladores,
permiten que cualquier operacin se aplique a cualquier dato, que por lo general se
consideran secuencias de bits de varias longitudes. Lenguajes de alto nivel sin
datos incluyen BCPL y algunas variedades de Forth.
En la prctica, aunque pocos lenguajes son considerados con tipo desde el punto de vista
de la teora de tipos (es decir, que verifican o rechazan todas las operaciones), la mayora
de los lenguajes modernos ofrecen algn grado de manejo de tipos. Si bien muchos
lenguajes de produccin proveen medios para brincarse o subvertir el sistema de tipos.
Tipos estticos versus tipos dinmicos[editar]
El texto que sigue es una traduccin defectuosa.
Si quieres colaborar con Wikipedia, busca el artculo original y mejora esta traduccin.

{{subst:Aviso mal
traducido|Lenguaje de programacin}} ~~~~

Copia y pega el siguiente cdigo en la pgina de discusin del autor:

En lenguajes con tipos estticos se determina el tipo de todas las expresiones antes de la
ejecucin del programa (tpicamente al compilar). Por ejemplo, 1 y (2+2) son expresiones
enteras; no pueden ser pasadas a una funcin que espera una cadena, ni pueden
guardarse en una variable que est definida como fecha.
Los lenguajes con tipos estticos pueden manejar tipos explcitos o tipos inferidos. En el
primer caso, el programador debe escribir los tipos en determinadas posiciones textuales.
En el segundo caso, el compilador infiere los tipos de las expresiones y las declaraciones
de acuerdo al contexto. La mayora de los lenguajes populares con tipos estticos, tales
como C++, C# y Java, manejan tipos explcitos. Inferencia total de los tipos suele
asociarse con lenguajes menos populares, tales como Haskell y ML. Sin embargo, muchos
lenguajes de tipos explcitos permiten inferencias parciales de tipo; tanto Java y C#, por
ejemplo, infieren tipos en un nmero limitado de casos.
Los lenguajes con tipos dinmicos determinan la validez de los tipos involucrados en las
operaciones durante la ejecucin del programa. En otras palabras, los tipos estn
asociados con valores en ejecucin en lugar de expresiones textuales. Como en el caso de
lenguajes con tipos inferidos, los lenguajes con tipos dinmicos no requieren que el
programador escriba los tipos de las expresiones. Entre otras cosas, esto permite que una
misma variable se pueda asociar con valores de tipos distintos en diferentes momentos de
la ejecucin de un programa. Sin embargo, los errores de tipo no pueden ser detectados
automticamente hasta que se ejecuta el cdigo, dificultando la depuracin de los
programas, no obstante, en lenguajes con tipos dinmicos se suele dejar de lado la
depuracin en favor de tcnicas de desarrollo como por
ejemplo BDD y TDD. Ruby, Lisp, JavaScript y Python son lenguajes con tipos dinmicos.
Tipos dbiles y tipos fuertes[editar]
Los lenguajes dbilmente tipados permiten que un valor de un tipo pueda ser tratado como
de otro tipo, por ejemplo una cadena puede ser operada como un nmero. Esto puede ser
til a veces, pero tambin puede permitir ciertos tipos de fallas que no pueden ser
detectadas durante la compilacin o a veces ni siquiera durante la ejecucin.

Los lenguajes fuertemente tipados evitan que pase lo anterior. Cualquier intento de llevar a
cabo una operacin sobre el tipo equivocado dispara un error. A los lenguajes con tipos
fuertes se les suele llamar de tipos seguros.
Lenguajes con tipos dbiles como Perl y JavaScript permiten un gran nmero de
conversiones de tipo implcitas. Por ejemplo en JavaScript la expresin 2 * x convierte
implcitamente x a un nmero, y esta conversin es exitosa inclusive
cuando x es null , undefined , un Array o una cadena de letras. Estas conversiones
implcitas son tiles con frecuencia, pero tambin pueden ocultar errores de programacin.
Las caractersticas de estticos y fuertes son ahora generalmente consideradas conceptos
ortogonales, pero su trato en diferentes textos varia. Algunos utilizan el trmino de tipos
fuertes para referirse a tipos fuertemente estticos o, para aumentar la confusin,
simplemente como equivalencia de tipos estticos. De tal manera que C ha sido llamado
tanto lenguaje de tipos fuertes como lenguaje de tipos estticos dbiles.

Implementacin[editar]

Cdigo fuente de un programa escrito en el lenguaje de programacin Java.

La implementacin de un lenguaje es la que provee una manera de que se ejecute un


programa para una determinada combinacin de software y hardware. Existen
bsicamente dos maneras de implementar un lenguaje: compilacin e interpretacin.

Compilacin: es el proceso que traduce un programa escrito en un lenguaje de


programacin a otro lenguaje de programacin, generando un programa equivalente
que la mquina ser capaz interpretar. Los programas traductores que pueden realizar
esta operacin se llaman compiladores. stos, como los programas ensambladores
avanzados, pueden generar muchas lneas de cdigo de mquina por cada
proposicin del programa fuente.

Interpretacin: es una asignacin de significados a las frmulas bien formadas de


un lenguaje formal. Como los lenguajes formales pueden definirse en trminos
puramente sintcticos, sus frmulas bien formadas pueden no ser ms que cadenas
de smbolos sin ningn significado. Una interpretacin otorga significado a esas
frmulas.

Se puede tambin utilizar una alternativa para traducir lenguajes de alto nivel. En lugar de
traducir el programa fuente y grabar en forma permanente el cdigo objeto que se produce
durante la compilacin para utilizarlo en una ejecucin futura, el programador slo carga el
programa fuente en la computadora junto con los datos que se van a procesar. A

continuacin, un programa intrprete, almacenado en el sistema operativo del disco, o


incluido de manera permanente dentro de la mquina, convierte cada proposicin del
programa fuente en lenguaje de mquina conforme vaya siendo necesario durante el
procesamiento de los datos. El cdigo objeto no se graba para utilizarlo posteriormente.
La siguiente vez que se utilice una instruccin, se la deber interpretar otra vez y traducir a
lenguaje mquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un
ciclo o bucle, cada instruccin del bucle tendr que volver a ser interpretada en cada
ejecucin repetida del ciclo, lo cual hace que el programa sea ms lento en tiempo de
ejecucin (porque se va revisando el cdigo en tiempo de ejecucin) pero ms rpido en
tiempo de diseo (porque no se tiene que estar compilando a cada momento el cdigo
completo). El intrprete elimina la necesidad de realizar una compilacin despus de cada
modificacin del programa cuando se quiere agregar funciones o corregir errores; pero es
obvio que un programa objeto compilado con antelacin deber ejecutarse con mucha
mayor rapidez que uno que se debe interpretar a cada paso durante una ejecucin del
cdigo.
La mayora de lenguajes de alto nivel permiten la programacin multipropsito, aunque
muchos de ellos fueron diseados para permitir programacin dedicada, como lo fue
el Pascal con las matemticas en su comienzo. Tambin se han implementado lenguajes
educativos infantiles como Logo mediante una serie de simples instrucciones. En la
actualidad son muy populares algunos lenguajes especialmente indicados
para aplicaciones web, como Perl, PHP, Ruby, Python o JavaScript.

Tcnica[editar]

Libros sobre diversos lenguajes de programacin.

Para escribir programas que proporcionen los mejores resultados, cabe tener en cuenta
una serie de detalles.

Correccin. Un programa es correcto si hace lo que debe hacer tal y como se


estableci en las fases previas a su desarrollo. Para determinar si un programa hace lo
que debe, es muy importante especificar claramente qu debe hacer el programa
antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace.

Claridad. Es muy importante que el programa sea lo ms claro y legible posible,


para facilitar as su desarrollo y posterior mantenimiento. Al elaborar un programa se
debe intentar que su estructura sea sencilla y coherente, as como cuidar el estilo en la
edicin; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de
creacin como en las fases posteriores de correccin de errores, ampliaciones,
modificaciones, etc. Fases que pueden ser realizadas incluso por otro programador,
con lo cual la claridad es an ms necesaria para que otros programadores puedan
continuar el trabajo fcilmente. Algunos programadores llegan incluso a utilizar Arte

ASCII para delimitar secciones de cdigo. Otros, por diversin o para impedir un
anlisis cmodo a otros programadores, recurren al uso de cdigo ofuscado.

Eficiencia. Se trata de que el programa, adems de realizar aquello para lo que fue
creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los
recursos que utiliza. Normalmente, al hablar de eficiencia de un programa, se suele
hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a
la cantidad de memoria que necesita, pero hay otros recursos que tambin pueden ser
de consideracin al obtener la eficiencia de un programa, dependiendo de su
naturaleza (espacio en disco que utiliza, trfico de red que genera, etc.).

Portabilidad. Un programa es portable cuando tiene la capacidad de poder


ejecutarse en una plataforma, ya sea hardware o software, diferente a aquella en la
que se elabor. La portabilidad es una caracterstica muy deseable para un programa,
ya que permite, por ejemplo, a un programa que se ha desarrollado para
sistemas GNU/Linux ejecutarse tambin en la familia de sistemas operativos Windows.
Esto permite que el programa pueda llegar a ms usuarios ms fcilmente.

Paradigmas[editar]
Los programas se pueden clasificar por el paradigma del lenguaje que se use para
producirlos. Los principales paradigmas son: imperativos, declarativos y orientacin a
objetos.
Los programas que usan un lenguaje imperativo especifican un algoritmo, usan
declaraciones, expresiones y sentencias.3 Una declaracin asocia un nombre de variable
con un tipo de dato, por ejemplo: var x: integer; . Una expresin contiene un valor,
por ejemplo: 2 + 2 contiene el valor 4. Finalmente, una sentencia debe asignar una
expresin a una variable o usar el valor de una variable para alterar el flujo de un
programa, por ejemplo: x := 2 + 2; if x == 4 then haz_algo(); . Una crtica
comn en los lenguajes imperativos es el efecto de las sentencias de asignacin sobre una
clase de variables llamadas "no locales".4
Los programas que usan un lenguaje declarativo especifican las propiedades que la salida
debe conocer y no especifican cualquier detalle de implementacin. Dos amplias
categoras de lenguajes declarativos son los lenguajes funcionales y los lenguajes lgicos.
Los lenguajes funcionales no permiten asignaciones de variables no locales, as, se hacen
ms fcil, por ejemplo, programas como funciones matemticas. 4 El principio detrs de los
lenguajes lgicos es definir el problema que se quiere resolver (el objetivo) y dejar los
detalles de la solucin al sistema.5 El objetivo es definido dando una lista de sub-objetivos.
Cada sub-objetivo tambin se define dando una lista de sus sub-objetivos, etc. Si al tratar
de buscar una solucin, una ruta de sub-objetivos falla, entonces tal sub-objetivo se
descarta y sistemticamente se prueba otra ruta.
La forma en la cual se programa puede ser por medio de texto o de forma visual. En
la programacin visual los elementos son manipulados grficamente en vez de
especificarse por medio de texto.

Programacin orientada a objetos


Este artculo o seccin necesita referencias que aparezcan en una publicacin acreditada.
Este aviso fue puesto el 14 de febrero de 2015.
Puedes aadirlas o avisar al autor principal del artculo en su pgina de discusin
pegando: {{sust:Aviso referencias|Programacin orientada a

objetos}} ~~~~

La programacin orientada a objetos (POO, u OOP segn sus siglas en ingls) es


un paradigma de programacin que viene a innovar la forma de obtener resultados. Los
objetos manipulan los datos de entrada para la obtencin de datos de salida especficos,
donde cada objeto ofrece una funcionalidad especial.
Muchos de los objetos pre-diseados de los lenguajes de programacin actuales permiten
la agrupacin en bibliotecas o libreras, sin embargo, muchos de estos lenguajes permiten
al usuario la creacin de sus propias bibliotecas.
Est basada en varias tcnicas,
incluyendo herencia, cohesin, abstraccin, polimorfismo, acoplamiento y encapsulamiento
.
Su uso se populariz a principios de la dcada de 1990. En la actualidad, existe una gran
variedad de lenguajes de programacin que soportan la orientacin a objetos.
ndice
[ocultar]

1Introduccin

2Origen

3Conceptos fundamentales

4Caractersticas de la POO

5Resumen

6Algunos lenguajes orientados a objetos

7Vase tambin

8Notas y referencias

9Enlaces externos

Introduccin[editar]
Los objetos son entidades que tienen un determinado "estado", "comportamiento
(mtodo)" e "identidad":

La identidad es una propiedad de un objeto que lo diferencia del resto; dicho con
otras palabras, es su identificador (concepto anlogo al de identificador de
una variable o una constante).

Un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros
objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al
poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de
mecanismos de interaccin llamados mtodos, que favorecen la comunicacin entre ellos.
Esta comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta
caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separa el
estado y el comportamiento.
Los mtodos (comportamiento) y atributos (estado) estn estrechamente relacionados
por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos

para poder tratar los atributos con los que cuenta. El programador debe pensar
indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de
ellos. Hacerlo podra producir el hbito errneo de crear clases contenedoras de
informacin por un lado y clases con mtodos que manejen a las primeras por el otro. De
esta manera se estara realizando una "programacin estructurada camuflada" en un
lenguaje de POO.
La programacin orientada a objetos difiere de la programacin estructurada tradicional, en
la que los datos y los procedimientos estn separados y sin relacin, ya que lo nico que
se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La
programacin estructurada anima al programador a pensar sobre todo en trminos de
procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos
procedimientos manejan. En la programacin estructurada solo se escriben funciones que
procesan datos. Los programadores que emplean POO, en cambio, primero definen
objetos para luego enviarles mensajes solicitndoles que realicen sus mtodos por s
mismos.

Origen[editar]
Los conceptos de la POO tienen origen en Simula 67, un lenguaje diseado para hacer
simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de Cmputo
Noruego en Oslo. En este centro se trabajaba en simulaciones de naves, que fueron
confundidas por la explosin combinatoria de cmo las diversas cualidades de diferentes
naves podan afectar unas a las otras. La idea surgi al agrupar los diversos tipos de
naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir
sus "propios" datos y comportamientos. Fueron refinados ms tarde en Smalltalk,
desarrollado en Simula en Xerox PARC (cuya primera versin fue escrita sobre Basic) pero
diseado para ser un sistema completamente dinmico en el cual los objetos se podran
crear y modificar "sobre la marcha" (en tiempo de ejecucin) en lugar de tener un sistema
basado en programas estticos.
La POO se fue convirtiendo en el estilo de programacin dominante a mediados de
los aos 1980, en gran parte debido a la influencia de C++, una extensin del lenguaje de
programacin C. Su dominacin fue consolidada gracias al auge de las interfaces grficas
de usuario, para las cuales la POO est particularmente bien adaptada. En este caso, se
habla tambin de programacin dirigida por eventos.
Las caractersticas de orientacin a objetos fueron agregadas a muchos lenguajes
existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp ms Pascal, entre otros. La
adicin de estas caractersticas a los lenguajes que no fueron diseados inicialmente para
ellas condujo a menudo a problemas de compatibilidad y en la capacidad de
mantenimiento del cdigo. Los lenguajes orientados a objetos "puros", por su parte,
carecan de las caractersticas de las cuales muchos programadores haban venido a
depender. Para saltar este obstculo, se hicieron muchas tentativas para crear nuevos
lenguajes basados en mtodos orientados a objetos, pero permitiendo algunas
caractersticas imperativas de maneras "seguras". El lenguaje de programacin Eiffel de
Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos,
pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la
aparicin de Internet y a la implementacin de la mquina virtual Java en la mayora
de navegadores web. PHP en su versin 5 se ha modificado; soporta una orientacin
completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a
objetos.

Conceptos fundamentales[editar]
La POO es una forma de programar que trata de encontrar una solucin a estos
problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya
conocidos. Entre ellos destacan los siguientes:

Clase
Definiciones de las propiedades y comportamiento de un tipo de objeto concreto.
La instanciacin es la lectura de estas definiciones y la creacin de un objeto a
partir de ella.
Herencia
Por ejemplo, herencia de la clase C a la clase D, es la facilidad mediante la cual la
clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos
atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto,
puede usar los mismos mtodos y variables pblicas declaradas en C. Los
componentes registrados como "privados" (private) tambin se heredan, pero
como no pertenecen a la clase, se mantienen escondidos al programador y slo
pueden ser accedidos a travs de otros mtodos pblicos. En el caso de los
componentes registrados como "protegidos" (protected) tambin se heredan, pero
solo para esa clase, no para futuras clases heredadas. Esto es as para mantener
hegemnico el ideal de POO.
Objeto
Instancia de una clase. Entidad provista de un conjunto de propiedades o atributos
(datos) y de comportamiento o funcionalidad (mtodos), los mismos que
consecuentemente reaccionan a eventos. Se corresponden con los objetos reales
del mundo que nos rodea, o con objetos internos del sistema (del programa).
Mtodo
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se
desencadena tras la recepcin de un "mensaje". Desde el punto de vista del
comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un
cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo
mensaje para otro objeto del sistema.
Evento
Es un suceso en el sistema (tal como una interaccin del usuario con la mquina, o
un mensaje enviado por un objeto). El sistema maneja el evento enviando el
mensaje adecuado al objeto pertinente. Tambin se puede definir como evento la
reaccin que puede desencadenar un objeto; es decir, la accin que genera.
Atributos
Caractersticas que tiene la clase.
Mensaje
Una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus
mtodos con ciertos parmetros asociados al evento que lo gener.
Propiedad o atributo
Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos),
que hace los datos visibles desde fuera del objeto y esto se define como sus
caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin
de algn mtodo.
Estado interno
Es una variable que se declara privada, que puede ser nicamente accedida y
alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones
posibles para el objeto (o clase de objetos). No es visible al programador que
maneja una instancia de la clase.
Componentes de un objeto
Atributos, identidad, relaciones y mtodos.
Identificacin de un objeto
Un objeto se representa por medio de una tabla o entidad que est compuesta por
sus atributos y funciones correspondientes.
En comparacin con un lenguaje imperativo,
una "variable" no es ms que un contenedor
interno del atributo del objeto o de un estado

interno, as como la "funcin" es un


procedimiento interno del mtodo del objeto.

Caractersticas de la
POO[editar]
Existe un acuerdo acerca de qu
caractersticas contempla la "orientacin a
objetos". Las caractersticas siguientes son
las ms importantes:1
Abstraccin
Denota las caractersticas esenciales de un objeto, donde se capturan sus
comportamientos. Cada objeto en el sistema sirve como modelo de un "agente"
abstracto que puede realizar trabajo, informar y cambiar su estado, y
"comunicarse" con otros objetos en el sistema sin revelar "cmo" se implementan
estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin
ser abstrados, y, cuando lo estn, una variedad de tcnicas son requeridas para
ampliar una abstraccin. El proceso de abstraccin permite seleccionar las
caractersticas relevantes dentro de un conjunto e identificar comportamientos
comunes para definir nuevos tipos de entidades en el mundo real. La abstraccin
es clave en el proceso de anlisis y diseo orientado a objetos, ya que mediante
ella podemos llegar a armar un conjunto de clases que permitan modelar la
realidad o el problema que se quiere atacar.
Encapsulamiento
Significa reunir todos los elementos que pueden considerarse pertenecientes a una
misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin
(diseo estructurado) de los componentes del sistema. Algunos autores confunden
este concepto con el principio de ocultacin, principalmente porque se suelen
emplear conjuntamente.
Polimorfismo
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el
mismo nombre; al llamarlos por ese nombre se utilizar el comportamiento
correspondiente al objeto que se est usando. O, dicho de otro modo, las
referencias y las colecciones de objetos pueden contener objetos de diferentes
tipos, y la invocacin de un comportamiento en una referencia producir el
comportamiento correcto para el tipo real del objeto referenciado. Cuando esto
ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin
tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms
estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y
la sobrecarga de operadores de C++.
Herencia
Las clases no se encuentran aisladas, sino que se relacionan entre s, formando
una jerarqua de clasificacin. Los objetos heredan las propiedades y el
comportamiento de todas las clases a las que pertenecen. La herencia organiza y
facilita el polimorfismo y el encapsulamiento, permitiendo a los objetos ser
definidos y creados como tipos especializados de objetos preexistentes. Estos
pueden compartir (y extender) su comportamiento sin tener que volver a
implementarlo. Esto suele hacerse habitualmente agrupando los objetos
en clases y estas en rboles o enrejados que reflejan un comportamiento comn.
Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple;
siendo de alta complejidad tcnica por lo cual suele recurrirse a la herencia virtual
para evitar la duplicacin de datos.
Modularidad
Se denomina "modularidad" a la propiedad que permite subdividir una aplicacin
en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan

independiente como sea posible de la aplicacin en s y de las restantes partes.


Estos mdulos se pueden compilar por separado, pero tienen conexiones con otros
mdulos. Al igual que la encapsulacin, los lenguajes soportan la modularidad de
diversas formas.
Principio de ocultacin
Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto
expone una "interfaz" a otros objetos que especifica cmo pueden interactuar con
los objetos de la clase. El aislamiento protege a las propiedades de un objeto
contra su modificacin por quien no tenga derecho a acceder a ellas; solamente los
propios mtodos internos del objeto pueden acceder a su estado. Esto asegura
que otros objetos no puedan cambiar el estado interno de un objeto de manera
inesperada, eliminando efectos secundarios e interacciones inesperadas. Algunos
lenguajes relajan esto, permitiendo un acceso directo a los datos internos del
objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin
entera se reduce a un agregado o rompecabezas de objetos.
Recoleccin de
basura
La recoleccin de basura (garbage collection) es la tcnica por la cual el entorno
de objetos se encarga de destruir automticamente, y por tanto desvincular la
memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos.
Esto significa que el programador no debe preocuparse por la asignacin o
liberacin de memoria, ya que el entorno la asignar al crear un nuevo objeto y la
liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que
se extendieron para soportar el Paradigma de Programacin Orientada a Objetos
como C++ u Object Pascal, esta caracterstica no existe y la memoria debe
desasignarse expresamente.

Resumen[e
ditar]
La POO es un
paradigma
surgido en
los aos 1970,
que utiliza
objetos como
elementos
fundamentales
en la
construccin de
la solucin. Un
objeto es una
abstraccin de
algn hecho o
ente del mundo
real, con
atributos que
representan sus
caractersticas o
propiedades, y
mtodos que
emulan su
comportamiento
o actividad.
Todas las
propiedades y
mtodos

comunes a los
objetos se
encapsulan o
agrupan en
clases. Una
clase es una
plantilla, un
prototipo para
crear objetos; en
general, se dice
que cada objeto
es una instancia
o ejemplar de
una clase.

Algunos
lenguajes
orientados
a
objetos[edit
ar]
Simula (1967)
es aceptado
como el primer
lenguaje que
posee las
caractersticas
principales de un
lenguaje
orientado a
objetos. Fue
creado para
hacer programas
de simulacin,
en donde los
"objetos" son la
representacin
de la
informacin ms
importante.
Smalltalk (1972
a 1980) es
posiblemente el
ejemplo
cannico, y con
el que gran parte
de la teora de la
programacin
orientada a
objetos se ha
desarrollado.
Entre los
lenguajes

orientados a
objetos se
destacan los
siguientes:

ABAP2

ABL3

ActionScript

ActionScript
3

Ada

C++

C
Sharp (C#)

Clarion

Clipper4

Object
Pascal (Emb
arcadero
Delphi)

Gambas

GObject

Genie

Harbour

Eiffel

Fortran 90/9
5

Java

JavaScript5

Lexico6

Objective-C

Ocaml

Oz

Pauscal (en
espaol)

Perl7 8

PHP9

PowerBuilde
r

Processing.1
0

Python

Ruby

Self

Smalltalk11

Magik (Smal
lWorld)

Vala

VB.NET

Visual
FoxPro12

Visual
Basic 6.0

Visual
DataFlex

Visual
Objects

XBase++

DRP

Scala13 14

Muchos de estos
lenguajes de
programacin no
son puramente
orientados a
objetos, sino que
son hbridos que
combinan la
POO con otros
paradigmas.
Al igual que C+
+, otros
lenguajes, como
OOCOBOL,
OOLisp,
OOProlog
y Object REXX,
han sido
creados
aadiendo
extensiones
orientadas a
objetos a un
lenguaje de
programacin
clsico.
Un nuevo paso
en la abstraccin
de paradigmas
de programacin
es
la Programacin
Orientada a
Aspectos (POA).
Aunque es
todava una
metodologa en
estado de
maduracin,
cada vez atrae a
ms
investigadores e
incluso
proyectos
comerciales en
todo el mundo.

Paradigma de programacin

Este artculo o seccin necesita referencias que aparezcan en una publicacin acreditada.
Este aviso fue puesto el 23 de octubre de 2013.
Puedes aadirlas o avisar al autor principal del artculo en su pgina de discusin
pegando: {{sust:Aviso referencias|Paradigma de programacin}}

~~~~

Un paradigma de programacin es una propuesta tecnolgica adoptada por una


comunidad de programadores y desarrolladores cuyo ncleo central es incuestionable en
cuanto que nicamente trata de resolver uno o varios problemas claramente delimitados; la
resolucin de estos problemas debe suponer consecuentemente un avance significativo en
al menos un parmetro que afecte a la ingeniera de software.
Un paradigma de programacin representa un enfoque particular o filosofa para disear
soluciones. Los paradigmas difieren unos de otros, en los conceptos y la forma de abstraer
los elementos involucrados en un problema, as como en los pasos que integran su
solucin del problema, en otras palabras, el cmputo.
Tiene una estrecha relacin con la formalizacin de determinados lenguajes en su
momento de definicin. Es un estilo de programacin empleado.
Un paradigma de programacin est delimitado en el tiempo en cuanto a aceptacin y uso,
porque nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial
o totalmente.
El paradigma de programacin que actualmente es el ms utilizado es la "orientacin a
objetos" (OO). El ncleo central de este paradigma es la unin de datos y procesamiento
en una entidad llamada "objeto", relacionable a su vez con otras entidades "objeto".
Tradicionalmente, datos y procesamiento se han separado en reas diferente del diseo y
la implementacin de software. Esto provoc que grandes desarrollos tuvieran problemas
de fiabilidad, mantenimiento, adaptacin a los cambios y escalabilidad. Con la OO y
caractersticas como el encapsulado, polimorfismo o la herencia, se permiti un avance
significativo en el desarrollo de software a cualquier escala de produccin. La OO parece
estar ligada en sus orgenes con lenguajes como Lisp y Simula, aunque el primero que
acu el ttulo de "programacin orientada a objetos" fue Smalltalk.

Tipos ms comunes de paradigmas de programacin [editar]


En general la mayora son variantes de los dos tipos principales, imperativa y declarativa:

Programacin imperativa o por procedimientos: es el ms usado en general, se


basa en dar instrucciones al ordenador de como hacer las cosas en forma de
algoritmos. La programacin imperativa es la ms usada y la ms antigua, el ejemplo
principal es el lenguaje de mquina. Ejemplos de lenguajes puros de este paradigma
seran el C, BASIC o Pascal.

Programacin orientada a objetos: est basada en el imperativo, pero encapsula


elementos denominados objetos que incluyen tanto variables como funciones. Est
representado por C++, C# o Java, entre otros, pero el ms representativo sera
el Smalltalk que est completamente orientado a objetos.

Programacin dinmica: est definida como el proceso de romper problemas en


partes pequeas para analizarlos y resolverlos de forma lo ms cercana al ptimo,
busca resolver problemas en O(n) sin usar por tanto mtodos recursivos. Este
paradigma est ms basado en el modo de realizar los algoritmos, por lo que se puede
usar con cualquier lenguaje imperativo.

Programacin dirigida por eventos: la programacin dirigida por eventos es un


paradigma de programacin en el que tanto la estructura como la ejecucin de los
programas van determinados por los sucesos que ocurran en el sistema, definidos por
el usuario o que ellos mismos provoquen.

Programacin declarativa: est basado en describir el problema declarando


propiedades y reglas que deben cumplirse, en lugar de instrucciones. Hay lenguajes
para la programacin funcional, la programacin lgica, o la combinacin lgicofuncional. Unos de los primeros lenguajes funcionales fueron Lisp y Prolog.

Programacin funcional: basada en la definicin los predicados y es de corte ms


matemtico, est representado por Scheme (una variante de Lisp) o Haskell.

Programacin lgica: basado en la definicin de relaciones lgicas, est


representado por Prolog.

Programacin con restricciones: similar a la lgica usando ecuaciones. Casi todos


los lenguajes son variantes del Prolog.

Programacin multiparadigma: es el uso de dos o ms paradigmas dentro de un


programa. El lenguaje Lisp se considera multiparadigma.

Lenguaje especfico del dominio o DSL: se denomina as a los lenguajes


desarrollados para resolver un problema especfico, pudiendo entrar dentro de
cualquier grupo anterior. El ms representativo sera SQL para el manejo de las bases
de datos, de tipo declarativo, pero los hay imperativos, como el Logo.

Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar,


en la prctica es habitual que se mezclen, dando lugar a la programacin multiparadigma
o lenguajes de programacin multiparadigma.
Actualmente, el paradigma de programacin ms utilizado es el paradigma de
la programacin orientada a objetos.

Ensamblador
Para otros usos de este trmino, vase Ensamblador (desambiguacin).
Tambin ver: lenguaje ensamblador
Este artculo o seccin necesita referencias que aparezcan en una publicacin acreditada.
Este aviso fue puesto el 15 de octubre de 2015.
Puedes aadirlas o avisar al autor principal del artculo en su pgina de discusin
pegando: {{sust:Aviso referencias|Ensamblador}} ~~~~

El trmino ensamblador (del ingls assembler) se refiere a un tipo de programa


informtico que se encarga de traducir un fichero fuente escrito en un lenguaje
ensamblador, a un fichero objeto que contiene cdigo mquina, ejecutable
directamente por el microprocesador

Funcionamiento[editar]
El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los
cdigos nemotcnicos que aparecen por su cdigo de operacin correspondiente en
sistema binario para la plataforma que se eligi como destino en las opciones
especficas del ensamblador.

Tipos de ensambladores[editar]
Artculo principal: Ensamblador de alto nivel

Podemos distinguir entre dos tipos de ensambladores:

Ensambladores bsicos. Son de muy bajo nivel, y su tarea consiste bsicamente


en ofrecer nombres simblicos a las distintas instrucciones, parmetros y cosas
tales como los modos.

Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que


aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits,
muchos de ellos teniendo compatibilidad hacia atrs pudiendo trabajar con
programas con estructuras de 16 bits. Adems de realizar la misma tarea que los
anteriores, permitiendo tambin el uso de macros, permiten utilizar estructuras de
programacin ms complejas propias de los lenguajes de alto nivel.

Lenguaje ensamblador
Para otros usos de este trmino, vase Ensamblador (desambiguacin).

Lenguaje de mquina del Intel 8088. El cdigo de mquina en hexadecimal se resalta en rojo, el
equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria donde se
encuentra el cdigo, en azul. Abajo se ve un texto en hexadecimal y ASCII.

El lenguaje ensamblador, o assembler (en ingls assembly language y la


abreviacin asm), es un lenguaje de programacin de bajo nivel. Consiste en un conjunto
de mnemnicos que representan instrucciones bsicas para
los computadores, microprocesadores, microcontroladores y otros circuitos
integrados programables. Implementa una representacin simblica de los cdigos de
mquina binarios y otras constantes necesarias para programar una arquitectura de
procesador y constituye la representacin ms directa del cdigo mquina especfico para
cada arquitectura legible por un programador. Cada arquitectura de procesador tiene su
propio lenguaje ensamblador que usualmente es definida por el fabricante de hardware, y
est basada en los mnemnicos que simbolizan los pasos de procesamiento
(las instrucciones), los registros del procesador, las posiciones de memoria y otras
caractersticas del lenguaje. Un lenguaje ensamblador es por lo tanto especfico de
cierta arquitectura de computador fsica (o virtual). Esto est en contraste con la mayora
de los lenguajes de programacin de alto nivel, que idealmente son porttiles.
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje
ensamblador al cdigo de mquina del computador objetivo. El ensamblador realiza una
traduccin ms o menos isomorfa (un mapeo de uno a uno) desde las sentencias
mnemnicas a las instrucciones y datos de mquina. Esto est en contraste con los
lenguajes de alto nivel, en los cuales una sola declaracin generalmente da lugar a
muchas instrucciones de mquina.
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el
desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuracin.

Particularmente, la mayora de los ensambladores modernos incluyen una facilidad


de macro (descrita ms abajo), y se llaman macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de software, cuando an no se
contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se
utiliza con frecuencia en ambientes acadmicos y de investigacin, especialmente cuando
se requiere la manipulacin directa de hardware, alto rendimiento, o un uso de recursos
controlado y reducido. Tambin es utilizado en el desarrollo de controladores de
dispositivo (en ingls, device drivers) y en el desarrollo de sistemas operativos, debido a la
necesidad del acceso directo a las instrucciones de la mquina. Muchos dispositivos
programables (como los microcontroladores) an cuentan con el ensamblador como la
nica manera de ser manipulados.
ndice
[ocultar]

1Caractersticas

2Programa ensamblador
o

2.1Nmero de pasos

2.2Ensambladores de alto nivel

2.3Uso del trmino

3Lenguaje
o

3.1Instrucciones de CPU

3.2Ensamblado

3.3Ejemplos

4Diseo del lenguaje


4.1Elementos bsicos

4.1.1Nemnicos de opcode y mnemnicos extendidos

4.1.2Secciones de datos

4.1.3Directivas del ensamblador

4.2Macros

4.3Soporte para programacin estructurada

5Uso del lenguaje ensamblador


o

5.1Perspectiva histrica

5.2Uso actual

5.3Aplicaciones tpicas

6Detalles adicionales

7Ejemplos de lenguaje ensamblador


o

7.1Ejemplo para la arquitectura x86

7.2Ejemplo para el computador virtual (POCA)

7.3Ejemplo para el C Intel 8051

7.4Ejemplo para el Microchip PIC16F84

8Vase tambin

9Referencias

10Bibliografa

11Enlaces externos

Caractersticas[editar]

El cdigo escrito en lenguaje ensamblador posee una cierta dificultad de ser


entendido ya que su estructura se acerca al lenguaje mquina, es decir, es un lenguaje
de bajo nivel.

El lenguaje ensamblador es difcilmente portable, es decir, un cdigo escrito para


un microprocesador, puede necesitar ser modificado, para poder ser usado en otra
mquina distinta. Al cambiar a una mquina con arquitectura diferente, generalmente
es necesario reescribirlo completamente.

Los programas hechos por un programador experto en lenguaje ensamblador son


generalmente mucho ms rpidos 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 ms rpidamente 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 cdigo
difciles 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 estn disponibles en los lenguajes de alto nivel.

Tambin se puede controlar el tiempo en que tarda una rutina en ejecutarse, e


impedir que se interrumpa durante su ejecucin.

Programa ensamblador[editar]
Artculo principal: Ensamblador

Generalmente, un programa ensamblador (assembler en ingls) moderno crea cdigo


objeto traduciendo instrucciones mnemnicas de lenguaje ensamblador en opcodes, y
resolviendo los nombres simblicos para las localizaciones de memoria y otras
entidades.1 El uso de referencias simblicas es una caracterstica clave del lenguaje
ensamblador, evitando tediosos clculos y actualizaciones manuales de las direcciones
despus de cada modificacin del programa. La mayora de los ensambladores tambin
incluyen facilidades de macros para realizar sustitucin textual - ej. generar cortas
secuencias de instrucciones como expansin en lnea en vez de llamar a subrutinas.
Los ensambladores son generalmente ms simples de escribir que los compiladores para
los lenguajes de alto nivel, y han estado disponibles desde los aos 1950. Los
ensambladores modernos, especialmente para las arquitecturas basadas en RISC, tales
como MIPS, Sun SPARC, y HP PA-RISC, as como tambin para el x86 (-64), optimizan la
planificacin de instrucciones para explotar la segmentacin del CPU eficientemente.
En los compiladores para lenguajes de alto nivel, son el ltimo paso antes de generar el
cdigo ejecutable.

Nmero de pasos[editar]
Hay dos tipos de ensambladores basados en cuntos pasos a travs de la fuente son
necesarios para producir el programa ejecutable.

Los ensambladores de un solo paso pasan a travs del cdigo fuente una vez y
asumen que todos los smbolos sern definidos antes de cualquier instruccin que los
refiera.

Los ensambladores de dos pasos crean una tabla con todos los smbolos y sus
valores en el primer paso, despus usan la tabla en un segundo paso para generar
cdigo. El ensamblador debe por lo menos poder determinar la longitud de cada
instruccin en el primer paso para que puedan ser calculadas las direcciones de los
smbolos.

La ventaja de un ensamblador de un solo paso es la velocidad, que no es tan importante


como lo fue en un momento dados los avances en velocidad y capacidades del
computador. La ventaja del ensamblador de dos pasos es que los smbolos pueden ser
definidos dondequiera en el cdigo fuente del programa. Esto permite a los programas ser
definidos de maneras ms lgicas y ms significativas, haciendo los programas de
ensamblador de dos pasos ms fciles de leer y mantener.2

Ensambladores de alto nivel[editar]


Los ms sofisticados ensambladores de alto nivel proporcionan abstracciones del lenguaje
tales como:

Estructuras de control avanzadas

Declaraciones e invocaciones de procedimientos/funciones de alto nivel

Tipos de datos abstractos de alto nivel, incluyendo las estructuras/records,


uniones, clases, y conjuntos

Procesamiento de macros sofisticado (aunque est disponible en los


ensambladores ordinarios desde finales de 1960 para el IBM/360, entre otras
mquinas)

Caractersticas de programacin orientada a objetos

Uso del trmino[editar]

Note que, en el uso profesional normal, el trmino ensamblador es frecuentemente usado


tanto para referirse al lenguaje ensamblador como tambin al programa ensamblador (que
convierte el cdigo fuente escrito en el lenguaje ensamblador a cdigo objeto que luego
ser enlazado para producir lenguaje de mquina). Las dos expresiones siguientes utilizan
el trmino "ensamblador":

Lenguaje[editar]
El lenguaje ensamblador refleja directamente la arquitectura y
las instrucciones en lenguaje de mquina de la CPU, y pueden ser muy diferentes de una
arquitectura de CPU a otra. Cada arquitectura de microprocesador tiene su propio lenguaje
de mquina, 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 nmero de operaciones que soportan; tambin pueden tener diferente
cantidad de registros, y distinta representacin de los tipos de datos en memoria. Aunque
la mayora 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 CPU[editar]
La mayora de las CPU tienen ms o menos los mismos grupos de instrucciones, aunque
no necesariamente tienen todas las instrucciones de cada grupo. Las operaciones que se
pueden realizar varan de una CPU a otra. Una CPU particular puede tener instrucciones
que no tenga otro y viceversa. Los primeros microprocesadores de 8 bits no tenan
operaciones para multiplicar o dividir nmeros, por ejemplo, y haba que hacer subrutinas
para realizar esas operaciones. Otras CPU puede que no tengan operaciones de punto
flotante y habra 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 tambin de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por la Unidad aritmtico lgica de la CPU

Operaciones aritmticas. Como suma, resta, multiplicacin, divisin, mdulo,


cambio de signo

Operaciones booleanas. Operaciones lgicas bit a bit como AND, OR, XOR, NOT

Operaciones de bits. Como desplazamiento o shift lgico y rotaciones


u Operadores a nivel de bits (hacia la derecha o hacia la izquierda, a travs del bit del
acarreo o sin l)

Comparaciones

Operaciones de mover datos:


Entre los registros y la memoria:
Aunque la instruccin 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 ingls):

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 nmeros reales:


El estndar para las operaciones con nmeros reales en
las CPU est definido por el IEEE 754.
Una CPU puede tener operaciones de punto flotante con
nmeros reales mediante el coprocesador numrico (si lo
hay), como las siguientes:

Operaciones aritmticas. Suma, resta, multiplicacin,


divisin, cambio de signo, valor absoluto, parte entera

Operaciones trascendentales

Operaciones
trigonomtricas. Seno, coseno, tangente, arcotan
gente

Operaciones con logaritmos, potencias y races

Otras

El lenguaje ensamblador tiene mnemnicos para cada


una de las instrucciones de la CPU en adicin a otros

mnemnicos a ser procesados por el programa


ensamblador (como por ejemplo macros y otras
sentencias en tiempo de ensamblado).

Ensamblado[editar]
La transformacin del lenguaje ensamblador en cdigo
mquina la realiza un programa ensamblador, y la
traduccin inversa la puede efectuar un desensamblador.
A diferencia de los lenguajes de alto nivel, aqu hay
usualmente una correspondencia 1 a 1 entre las
instrucciones simples del ensamblador y el lenguaje de
mquina. Sin embargo, en algunos casos, un
ensamblador puede proveer "pseudo instrucciones" que
se expanden en un cdigo de mquina ms extenso a fin
de proveer la funcionalidad necesaria y simplificar la
programacin. Por ejemplo, para un cdigo mquina
condicional como "si X mayor o igual que", un
ensamblador puede utilizar una pseudoinstruccin al
grupo "haga si menor que", y "si = 0" sobre el resultado
de la condicin anterior. Los Ensambladores ms
completos tambin proveen un rico lenguaje de macros
que se utiliza para generar cdigo ms complejo y
secuencias de datos.
Para el mismo procesador y el mismo conjunto de
instrucciones de CPU, diferentes programas
ensambladores pueden tener, cada uno de ellos,
variaciones y diferencias en el conjunto de mnemnicos o
en la sintaxis de su lenguaje ensamblador. Por ejemplo,
en un lenguaje ensamblador para la arquitectura x86, se
puede expresar la instruccin para mover 5 al
registro AL de la siguiente manera: MOV AL, 5 ,
mientras que para otro ensamblador para la misma
arquitectura se expresara al revs: MOV 5, AL . Ambos
lenguajes ensambladores haran 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 cmo programar un sistema basado en
microprocesador de modo sencillo ya que para hacer un
uso eficiente del mismo, hay que conocer a fondo
el microprocesador, los registros de trabajo de que
dispone, la estructura de la memoria, y muchas cosas
ms referentes a su estructura bsica de funcionamiento.

Ejemplos[editar]
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 (97 decimal) al registro


" AL ".
El programa ensamblador lee la sentencia de arriba y
produce su equivalente binario en lenguaje de mquina

Binario: 10110000 01100001 (hexadecimal: B61 )

El mnemnico MOV es un cdigo de operacin u


"opcode". El opcode es seguido por una lista de
argumentos o parmetros, completando una tpica
instruccin 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 cdigo de mquina generado por el ensamblador
consiste de 2 bytes. El primer byte contiene empaquetado
la instruccin MOV y el cdigo del registro hacia donde se
va a mover el dato:
1011

0000

01100001

+---- Nmero 61h en binario

+--- Registro AL

+-------- Instruccin MOV

En el segundo byte se especifica el nmero 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.

Diseo del lenguaje[editar]


Elementos bsicos[editar]
Hay un grado grande de diversidad en la manera en que
los autores de los ensambladores categorizan las
sentencias y en la nomenclatura que usan. En particular,
algunos describen cualquier cosa como pseudo-operacin
(pseudo-Op), con excepcin del mnemnico de mquina
o del mnemnico extendido.
Un tpico lenguaje ensamblador consiste en 3 tipos de
sentencias de instruccin que son usadas para definir las
operaciones del programa:

Mnemnicos de opcode

Secciones de datos

Directivas de ensamblador

Nemnicos de opcode y mnemnicos


extendidos[editar]
A diferencia de las instrucciones (sentencias) de
los lenguajes de alto nivel, las instrucciones en el
lenguaje ensamblador son generalmente muy simples.
Generalmente, una mnemnico es un nombre simblico
para una sola instruccin en lenguaje de mquina
ejecutable (un opcode), y hay por lo menos un
mnemnico de opcode definido para cada instruccin en
lenguaje de mquina. Cada instruccin consiste
tpicamente en una operacin u opcode ms cero o
ms operandos. La mayora de las instrucciones refieren
a un solo valor, o a un par de valores. Los operandos
pueden ser inmediatos (tpicamente valores de un byte,
codificados en la propia
instruccin), registros especificados en la instruccin,
implcitos o las direcciones de los datos localizados en
otra parte de la memoria. Esto est determinado por la
arquitectura subyacente del procesador, el ensamblador
simplemente refleja cmo trabaja esta arquitectura. Los
mnemnicos extendidos son frecuentemente usados para
especificar una combinacin de un opcode con un
operando especfico, ej, el ensamblador del System/360
usa a B como un mnemnico extendido para el BC con
una mscara de 15 y NOP al BC con una mscara de 0.
Los mnemnicos extendidos son frecuentemente usados
para soportar usos especializados de instrucciones, a
menudo para propsitos no obvios con respecto al
nombre de la instruccin. Por ejemplo, muchos CPU no
tienen una instruccin explcita de NOP (No Operacin),
pero tienen instrucciones que puedan ser usadas para tal
propsito. En el CPU 8086, la instruccin XCHG
AX,AX (intercambia el registro AX consigo mismo) es
usada para el NOP , con NOP siendo un pseudo-opcode
para codificar la instruccin XCHG AX,AX . Algunos
desensambladores reconocen esto y decodificarn la
instruccin XCHG AX,AX como NOP . Similarmente, los
ensambladores de IBM para el System/360 usan los
mnemnicos extendidos NOP y NOPR con las mscaras
cero para BC y BCR .
Algunos ensambladores tambin soportan simples
macroinstrucciones incorporadas que generan dos o ms
instrucciones de mquina. Por ejemplo, con algunos
ensambladores para el Z80, la instruccin
LD HL, BC

genera las instrucciones


LD L, C
LD H, B .3

LD HL, BC es un pseudo-opcode, que en


este caso simula ser una instruccin de 16
bits, cuando se expande se producen dos
instrucciones de 8 bits que equivalen a la
simulada de 16 bits.

Secciones de datos[editar]
Hay instrucciones usadas para definir
elementos de datos para manejar datos y
variables. Definen el tipo de dato, la longitud
y la alineacin de los datos. Estas
instrucciones tambin pueden definir si los
datos estn disponibles para programas
exteriores (programas ensamblados
separadamente) o solamente para el
programa en el cual la seccin de datos est
definida. Algunos ensambladores clasifican
estas instruccin
Directivas del ensamblador[editar]
Los directivas del ensamblador, tambin
llamadas los pseudo opcodes, pseudooperaciones o pseudo-ops, son instrucciones
que son ejecutadas por un ensamblador en el
tiempo de ensamblado, no por un CPU en
el tiempo de ejecucin. Pueden hacer al
ensamblado del programa dependiente de
parmetros entrados por un programador, de
modo que un programa pueda ser
ensamblado de diferentes maneras, quizs
para diversos aplicaciones. Tambin pueden
ser usadas para manipular la presentacin de
un programa para hacerlo ms fcil leer y
mantener.
Por ejemplo, las directivas pudieran ser
usadas para reservar reas de
almacenamiento y opcionalmente su para
asignar su contenido inicial. Los nombres de
las directivas a menudo comienzan con un
punto para distinguirlas de las instrucciones
de mquina.
Los ensambladores simblicos le permiten a
los programadores asociar nombres
arbitrarios (etiquetas o smbolos) a
posiciones de memoria. Usualmente, cada
constante y variable tiene un nombre para
que las instrucciones pueden referir a esas
ubicaciones por nombre, as promoviendo el
cdigo autodocumentado. En el cdigo
ejecutable, el nombre de cada subprograma
es asociado a su punto de entrada, as que
cualquier llamada a un subprograma puede
usar su nombre. Dentro de subprogramas, a
los destinos GOTO se le dan etiquetas.
Algunos ensambladores soportan smbolos
locales que son lxicamente distintos de los

smbolos normales (ej, el uso de "10$" como


un destino GOTO).
La mayora de los ensambladores
proporcionan un manejo flexible de smbolos,
permitiendo a los programadores manejar
diversos espacios de nombres, calcular
automticamente offsets dentro
de estructuras de datos, y asignar etiquetas
que refieren a valores literales o al resultado
de clculos simples realizados por el
ensamblador. Las etiquetas tambin pueden
ser usadas para inicializar constantes y
variables con direcciones relocalizables.
Los lenguajes ensambladores, como la
mayora de los otros lenguajes de
computador, permiten que comentarios sean
aadidos al cdigo fuente, que son ignorados
por el programa ensamblador. El buen uso de
los comentarios es an ms importante con
cdigo ensamblador que con lenguajes de
alto nivel, pues el significado y el propsito de
una secuencia de instrucciones es ms duro
de descifrar a partir del cdigo en s mismo.
El uso sabio de estas facilidades puede
simplificar grandemente los problemas de
codificar y mantener el cdigo de bajo nivel.
El cdigo fuente de lenguaje ensamblador
crudo generado por compiladores o
desensambladores - cdigo sin ningn
comentario, ni smbolos con algn sentido, ni
definiciones de datos - es muy difcil de leer
cuando deben hacerse cambios.

Macros[editar]
Muchos ensambladores soportan macros
predefinidas, y otras soportan macros
definidas (y repetidamente redefinibles) por el
programador que implican secuencias de
lneas del texto en las cuales las variables y
las constantes estn empotradas. Esta
secuencia de lneas de texto puede
incluir opcodes o directivas. Una vez una
macro se define, su nombre se puede usar
en lugar de un mnemnico. Cuando el
ensamblador procesa tal sentencia,
reemplaza la sentencia por las lneas del
texto asociadas a esa macro, entonces las
procesa como si hubieran existido en el
archivo del cdigo fuente original (incluyendo,
en algunos ensambladores, la expansin de
cualquier macro que exista en el texto de
reemplazo).
Puesto que las macros pueden tener
nombres cortos pero se expanden a varias, o
de hecho, muchas lneas de cdigo, pueden

usarse para hacer que los programas en


lenguaje ensamblador parezcan ser mucho
ms cortos, requiriendo menos lneas de
cdigo fuente, como sucede con los
lenguajes de alto nivel. Tambin se pueden
usar para aadir niveles de estructura ms
altos a los programas ensamblador;
opcionalmente introducen cdigo de
depuracin empotrado va parmetros y otras
caractersticas similares.
Muchos ensambladores tienen macros
incorporadas (o predefinidas) para las
llamadas de sistema y otras secuencias
especiales de cdigo, tales como la
generacin y el almacenamiento de los datos
realizados a travs de avanzadas
operaciones bitwise y operaciones booleanas
usadas en juegos, software de seguridad,
gestin de datos y criptografa.
Los macro ensambladores a menudo
permiten a las macros tomar parmetros.
Algunos ensambladores incluyen lenguajes
macro muy sofisticados, incorporando
elementos de lenguajes de alto nivel tales
como parmetros opcionales, variables
simblicas, condiciones, manipulaciones
de strings, operaciones aritmticas, todos
usables durante la ejecucin de una macro
dada, y permitiendo a las macros guardar el
contexto o intercambiar informacin. As una
macro puede generar un gran nmero de
instrucciones o definiciones de datos en
lenguaje ensamblador, basadas en los
argumentos de la macro. Esto se podra usar
para generar, por ejemplo, estructuras de
datos de estilo de rcord o bucles
"desenrollados", o podra generar algoritmos
enteros basados en parmetros complejos.
Una organizacin, usando lenguaje
ensamblador, que ha sido fuertemente
extendido usando tal suite de macros, puede
ser considerada que se est trabajando en un
lenguaje de alto nivel, puesto que tales
programadores no estn trabajando con los
elementos conceptuales de ms bajo nivel
del computador.
Las macros se usaron para adaptar sistemas
de software de gran escala para clientes
especficos en la era del mainframe, y
tambin se usaron por el personal del cliente
para satisfacer las necesidades de sus
patrones haciendo versiones especficas de
los sistemas operativos del fabricante. Esto
fue hecho, por ejemplo, por los
programadores de sistema que trabajaban
con el Conversational Monitor System /

Virtual Machine (CMS/VM) de IBM y con los


complementos real time transaction
processing de IBM, CICS, Customer
Information Control System,
el airline/financial system que comenz en los
aos 1970 y todava corre con muchos
sistemas de reservaciones computarizados
(CRS) y sistemas de tarjeta de crdito de
hoy.
Tambin es posible usar solamente las
habilidades de procesamiento de macros de
un ensamblador para generar cdigo escrito
en lenguajes completamente diferentes. Por
ejemplo, para generar una versin de un
programa en COBOL usando un programa
macro ensamblador puro conteniendo lneas
de cdigo COBOL dentro de operadores de
tiempo ensamblaje dando instrucciones al
ensamblador para generar cdigo arbitrario.
Esto era porque, como en los aos 1970 fue
observado, el concepto de "procesamiento de
macro" es independiente del concepto de
"ensamblaje", siendo el anterior, en trminos
modernos, ms un procesamiento de textos,
que una generacin de cdigo objeto. El
concepto de procesamiento de macro
apareci, y aparece, en el lenguaje de
programacin C, que soporta "instrucciones
de preprocesador" de fijar variables, y hace
pruebas condicionales en sus valores.
Observe que a diferencia de ciertos
macroprocesadores previos dentro de los
ensambladores, el preprocesador de C no
es Turing-completo porque careca de la
capacidad de bucle o go to, esto ltimo
permitiendo a los programas hacer bucles.
A pesar del poder del procesamiento macro,
ste dej de usarse en muchos lenguajes de
alto nivel (una importante excepcin es C/C+
+) mientras que segua siendo perenne para
los ensambladores. Esto era porque muchos
programadores estaban bastante
confundidos por la sustitucin de parmetros
macro y no distinguan la diferencia entre
procesamiento macro, el ensamblaje y la
ejecucin.
La sustitucin de parmetros macro es
estrictamente por nombre: en el tiempo de
procesamiento macro, el valor de un
parmetro es sustituido textualmente por su
nombre. La clase ms famosa de Error de
software resultantes era el uso de un
parmetro que en s mismo era una
expresin y no un nombre primario cuando el

escritor macro esperaba un nombre. En el


macro:
foo: macro a
load a*b
la intencin era que la rutina que
llama proporcionara el nombre de
una variable, y la variable o
constante "global b" sera usada para
multiplicar a "a". Si foo se llama con
el parmetro a-c , ocurre la
expansin macro load a-c*b . Para
evitar cualquier posible ambigedad,
los usuarios de macro procesadores
pueden encerrar en parntesis los
parmetros formales dentro de las
definiciones de macros, o las rutinas
que llaman pueden envolver en
parntesis los parmetos de
entrada.4 As, el macro correcto, con
los parntesis, sera:
foo: macro a
load (a)*b
y su expansin, dara como
resultado: load (a-c)*b
El PL/I y el C/C++ ofrecen
macros, pero la esta facilidad
solo puede manipular texto.
Por otra parte, los
lenguajes homoicnicos,
tales como Lisp, Prolog,
y Forth, retienen el poder de
los macros de lenguaje
ensamblador porque pueden
manipular su propio cdigo
como datos.

Soporte para
programacin
estructurada[editar]
Algunos ensambladores han
incorporado elementos
de programacin
estructurada para codificar el
flujo de la ejecucin. El
ejemplo ms temprano de
este acercamiento estaba en
el Concept-14 macro set,
originalmente propuesto por
el Dr. H.D. Mills (marzo de
1970), e implementado por
Marvin Kessler en la Federal
Systems Division de IBM,
que extendi el macro

ensamblador del S/360 con


bloques de control de flujo
IF/ELSE/ENDIF y
similares.5 Esto era una
manera de reducir o eliminar
el uso de operaciones GOTO
en el cdigo en lenguaje
ensamblador, uno de los
principales factores que
causaban cdigo
espagueti en el lenguaje
ensamblador. Este
acercamiento fue
ampliamente aceptado a
principios de los aos 1980
(los ltimos das del uso de
lenguaje ensamblador en
gran escala).
Un curioso diseo fue Anatural, un ensamblador
"orientado a la corriente"
(stream-oriented) para los
procesadores 8080/Z80[cita requ
erida]
de Whitesmiths Ltd.
(desarrolladores del sistema
operativo Idris, similar
al Unix), y lo que fue
reportado como el primer
compilador C comercial). El
lenguaje fue clasificado
como un ensamblador,
porque trabajaba con
elementos de mquina
crudos tales como opcodes,
registros, y referencias de
memoria; pero incorporaba
una sintaxis de expresin
para indicar el orden de
ejecucin. Los parntesis y
otros smbolos especiales,
junto con construcciones de
programacin estructurada
orientadas a bloques,
controlaban la secuencia de
las instrucciones generadas.
A-natural fue construido
como el lenguaje objeto de
un compilador C, en vez de
la codificacin manual, pero
su sintaxis lgica gan
algunos seguidores.
Ha habido poca demanda
aparente para
ensambladores ms
sofisticados debido a la
declinacin del desarrollo de

lenguaje ensamblador de
larga escala.6 A pesar de
eso, todava se estn
desarrollando y aplicando en
casos donde las limitaciones
de recursos o las
particularidades en la
arquitectura de sistema
objetivo previenen el efectivo
uso de lenguajes de alto
nivel.7

Uso del lenguaje


ensamblador[editar]
Perspectiva
histrica[editar]
Los lenguajes
ensambladores fueron
primero desarrollados en los
aos 1950, cuando fueron
referidos como lenguajes de
programacin de segunda
generacin. Por ejemplo, el
SOAP (Symbolic Optimal
Assembly Program) era un
lenguaje ensamblador de
1957 para el
computador IBM 650. Los
lenguajes ensambladores
eliminaron mucha de la
propensin a errores y del
consumo de tiempo de la
programacin de los
lenguajes de primera
generacin, que se
necesitaba con los primeros
computadores, liberando a
los programadores del tedio
tal como recordar cdigos
numricos y clculo de
direcciones. Una vez fueron
ampliamente usados para
todo tipo de programacin.
Sin embargo, por los aos
1980 (1990 en
los microcomputadores), su
uso haba sido en gran parte
suplantado por los lenguajes
de alto nivel,[cita requerida] en la
bsqueda de una mejorada
productividad en
programacin. Hoy en da,
aunque el lenguaje
ensamblador es casi siempre
manejado y generado por

los compiladores, todava se


usa para la manipulacin
directa del hardware, acceso
a instrucciones
especializadas del
procesador, o para resolver
problemas de desempeo
crtico. Los usos tpicos son
controladores/manejadores
(drivers) de dispositivo,
sistemas embebidos de bajo
nivel, y sistemas de tiempo
real.
Histricamente, un gran
nmero de programas han
sido escritos enteramente en
lenguaje ensamblador. Los
sistemas operativos fueron
casi exclusivamente escritos
en lenguaje ensamblador
hasta la aceptacin amplia
del lenguaje de
programacin C en los aos
1970 y principios de los
1980. Tambin, muchas
aplicaciones comerciales
fueron escritas en lenguaje
ensamblador, incluyendo una
gran cantidad del software
escrito por grandes
corporaciones para
mainframes de IBM. Los
lenguajes COBOL y FORTR
AN eventualmente
desplazaron mucho de este
trabajo, aunque un nmero
de organizaciones grandes
conservaran las
infraestructuras de
aplicaciones en lenguaje
ensamblador hasta bien
entrados los aos 1990.
La mayora de los primeros
microcomputadores
confiaron en el lenguaje
ensamblador codificado a
mano, incluyendo la mayora
de los sistemas operativos y
de las aplicaciones grandes.
Esto era porque estos
sistemas tenan limitaciones
severas de recursos,
impusieron idiosincrticas
arquitecturas de memoria y
de pantalla, y proporcionaron
servicios de sistema

limitados y con errores.


Quizs ms importante era la
falta de compiladores de
primera clase de lenguajes
de alto nivel adecuados para
el uso en el
microcomputador. Un factor
psicolgico tambin pudo
haber jugado un papel: la
primera generacin de
programadores de los
microcomputadores
conserv una actitud de
aficionado de "alambres y
alicates".
En un contexto ms
comercial, las ms grandes
razones para usar el
lenguaje ensamblador era
hacer programas con mnimo
tamao, mnima sobrecarga,
mayor velocidad y
confiabilidad.
Los tpicos ejemplos de
programas grandes en
lenguaje ensamblador de
ese tiempo son los sistemas
operativos IBM PC DOS y
aplicaciones tempranas tales
como la hoja de
clculo Lotus 1-2-3, y casi
todos los juegos populares
para la familia Atari 800 de
computadores personales.
Incluso en los aos 1990, la
mayora de los videojuegos
de consola fueron escritos en
ensamblador, incluyendo la
mayora de los juegos para
la Mega Drive/Genesis y
el Super Nintendo
Entertainment System.
[cita requerida]
Segn algunos
insiders de la industria, el
lenguaje ensamblador era el
mejor lenguaje de
programacin a usar para
obtener el mejor desempeo
del Sega Saturn, una
consola para la cual era
notoriamente desafiante
desarrollar y programar
juegos.8 El popular juego
de arcade NBA Jam (1993)
es otro ejemplo. El
ensamblador ha sido por

largo trecho, el lenguaje de


desarrollo primario en los
computadores
hogareos Commodore
64, Atari ST, as como el ZX
Spectrum. Esto fue as en
gran parte porque los
dialectos del BASIC en estos
sistemas ofrecieron
insuficiente velocidad de
ejecucin, as como
insuficientes caractersticas
para aprovechar
completamente el hardware
disponible. Algunos
sistemas, ms notablemente
el Amiga, incluso tienen IDEs
con caractersticas de
depuracin y macros
altamente avanzados, tales
como el freeware ASM-One
assembler, comparable a las
del Microsoft Visual
Studio (el ASM-Uno precede
al Microsoft Visual Studio).
El ensamblador para el VIC20 fue escrito por Don
French y publicado por
French Silk. Con 1639 bytes
de longitud, su autor cree
que es el ms pequeo
ensamblador simblico
jams escrito. El
ensamblador soportaba el
direccionamiento simblico
usual y la definicin
de cadenas de caracteres o
cadenas hexadecimales.
Tambin permita
expresiones de direcciones
que podan combinarse con
las operaciones
de adicin, sustraccin, multi
plicacin, divisin, AND
lgico, OR lgico,
y exponenciacin.9

Uso actual[editar]
Siempre ha habido debates
sobre la utilidad y el
desempeo del lenguaje
ensamblador relativo a
lenguajes de alto nivel. El
lenguaje ensamblador tiene
nichos especficos donde es
importante (ver abajo). Pero,
en general, los modernos

compiladores de
optimizacin para traducir
lenguajes de alto nivel en
cdigo que puede correr tan
rpidamente como el
lenguaje ensamblador
escrito a mano, a pesar de
los contraejemplos que
pueden ser
encontrados.10 11 12 La
complejidad de los
procesadores modernos y
del subsistema de memoria
hace la optimizacin efectiva
cada vez ms difcil para los
compiladores, as como para
los programadores en
ensamblador.13 14 Adicionalm
ente, y para la consternacin
de los amantes de la
eficiencia, el desempeo
cada vez mayor del
procesador ha significado
que la mayora de
los CPU estn desocupados
la mayor parte del tiempo,
con retardos causados por
embotellamientos
predecibles tales como
operaciones
de entrada/salida y paginaci
n de memoria. Esto ha
hecho que la velocidad de
ejecucin cruda del cdigo
no sea un problema para
muchos programadores.
Hay algunas situaciones en
las cuales los profesionales
pudieran elegir utilizar el
lenguaje ensamblador. Por
ejemplo cuando:

Es requerido un
ejecutable binario
independiente (standalone), es decir uno que
deba ejecutarse sin
recursos a componentes
de tiempo de ejecucin o
a bibliotecas asociadas
con un lenguaje de alto
nivel; sta es quizs la
situacin ms comn.
Son programas
empotrados que solo
almacenan una pequea
cantidad de memoria y el

dispositivo est dirigido


para hacer tareas para
un simple propsito.
Ejemplos consisten en
telfonos, sistemas de
combustible e ignicin
para automviles,
sistemas de control del
aire acondicionado,
sistemas de seguridad, y
sensores

Interactuando
directamente con el
hardware, por ejemplo
en controladores
(drivers) de dispositivo y
manejadores de
interrupcin

Usando instrucciones
especficas del
procesador no
explotadas o disponibles
por el compilador. Un
ejemplo comn es la
instruccin de rotacin
bitwise en el ncleo de
muchos algoritmos de
cifrado

Creando funciones
vectorizadas para
programas en lenguajes
de alto nivel como C. En
el lenguaje de alto nivel
esto es a veces ayudado
por funciones intrnsecas
del compilador que
mapean directamente a
los mnemnicos del
SIMD, pero sin embargo
resulta en una
conversin de
ensamblador de uno a
uno para un procesador
de vector asociado

Es requerida la
optimizacin extrema, ej,
en un bucle interno en
un algoritmo intensivo en
el uso del procesador.
Los programadores de
juegos toman ventaja de
las habilidades de las

caractersticas del
hardware en los
sistemas, permitiendo a
los juegos correr ms
rpidamente. Tambin
las grandes simulaciones
cientficas requieren
algoritmos altamente
optimizados, ej, lgebra
lineal con BLAS o
la transformada de
coseno discreta (ej, la
versin SIMD en
ensamblador
del x264,15 (una
biblioteca para codificar
streams de video)

Un sistema con severas


limitaciones de recursos
(ej, un sistema
empotrado) debe ser
codificado a mano para
maximizar el uso de los
limitados recursos; pero
esto est llegando a ser
menos comn a medida
que el precio del
procesador decrece y el
desempeo mejora

No existe ningn
lenguaje de alto nivel, en
un procesador nuevo o
especializado, por
ejemplo

Escribiendo programas
de tiempo real que
necesitan sincronizacin
y respuestas precisas,
tales como sistemas de
navegacin de vuelo, y
equipo mdico. Por
ejemplo, en un
sistema fly-by-wire (vuel
o por mandos elctricos),
la telemetra debe ser
interpretada y hay que
actuar dentro de
limitaciones estrictas de
tiempo. Tales sistemas
deben eliminar fuentes
de retrasos
impredecibles, que
pueden ser creados por
(algunos) lenguajes

interpretados, recolecci
n de basura automtica,
operaciones de
paginacin, o multitarea
preventiva. Sin embargo,
algunos lenguajes de
alto nivel incorporan
componentes de tiempo
de ejecucin e interfaces
de sistema operativo que
pueden introducir tales
retrasos. Elegir el
ensamblador o lenguajes
de bajo nivel para tales
sistemas da a los
programadores mayor
visibilidad y control sobre
el proceso de los
detalles

Es requerido control total


sobre el ambiente, en
situaciones de seguridad
extremadamente alta
donde nada puede darse
por sentado.

Se escriben virus de
computadora, bootloader
s, ciertos
controladores/manejador
es de dispositivo, u otros
elementos muy cerca del
hardware o al sistema
operativo de bajo nivel

Se escriben simuladores
del conjunto de
instrucciones para
monitoreo, trazado
y depuracin de
errores donde la
sobrecarga adicional es
mantenida al mnimo

Se hace ingeniera
inversa en binarios exist
entes que pueden o no
haber sido escritos
originalmente en un
lenguaje de alto nivel,
por ejemplo al crackear
la proteccin
anticopia del software
propietario.

Se hace ingeniera
inversa y modificacin de
video juegos (tambin
denominado ROM
hacking), que es posible
por medio de varios
mtodos. El ms
ampliamente
implementado es
alterando el cdigo del
programa a nivel de
lenguaje ensamblador

Se escribe cdigo
automodificable, algo
para lo que el lenguaje
ensamblador se presta
bien

Se escriben juegos y
otros softwares
para calculadoras
grficas16

Se escribe software
compilador que genera
cdigo ensamblador, y
por lo tanto los
desarrolladores deben
ser programadores de
lenguaje ensamblador

Se escriben algoritmos
criptogrficos que
siempre deben tomar
estrictamente el mismo
tiempo para ejecutar,
previniendo ataques de
tiempo

Sin embargo, el lenguaje


ensamblador es todava
enseado en la mayora de
los programas de ciencias de
la computacin e ingeniera
electrnica. Aunque hoy en
da, pocos programadores
trabajan regularmente con el
lenguaje ensamblador como
una herramienta, los
conceptos fundamentales
continan siendo muy
importantes. Tales tpicos
fundamentales,
como aritmtica
binaria, asignacin de
memoria, procesamiento del

stack, codificacin de
conjunto de caracteres,
procesamiento de
interrupciones, y diseo de
compiladores, seran duros
de estudiar en detalle sin la
comprensin de cmo el
computador opera a nivel del
hardware. Puesto que el
comportamiento del
computador es
fundamentalmente definido
por su conjunto de
instrucciones, la manera
lgica de aprender tales
conceptos es estudiar un
lenguaje ensamblador. La
mayora de los
computadores modernos
tienen un conjunto de
instrucciones similares. Por
lo tanto, estudiar un solo
lenguaje ensamblador es
suficiente para aprender: i)
los conceptos bsicos; ii)
reconocer situaciones donde
el uso de lenguaje
ensamblador puede ser
apropiado; y iii) ver cmo el
cdigo ejecutable eficiente
puede ser creado por los
lenguajes de alto nivel17

Aplicaciones
tpicas[editar]
El lenguaje
ensamblador hard-coded es
tpicamente usado en
el ROM de arranque del
sistema (BIOS en los
sistemas compatible IBM
PC). Este cdigo de bajo
nivel es usado, entre otras
cosas, para inicializar y
probar el hardware del
sistema antes
de cargar el sistema
operativo, y est
almacenado en el ROM. Una
vez que ha tomado lugar un
cierto nivel de inicializacin
del hardware, la ejecucin se
transfiere a otro cdigo,
tpicamente escrito en
lenguajes de alto nivel; pero
el cdigo corriendo
inmediatamente despus de

que es aplicada la energa


usualmente est escrito en
lenguaje ensamblador. Lo
mismo es cierto para los boot
loaders.
Muchos compiladores
traducen lenguajes de alto
nivel a lenguaje ensamblador
primero, antes de la
compilacin completa,
permitiendo que el cdigo en
ensamblador sea visto para
propsitos de depuracin y
optimizacin. Lenguajes de
relativo bajo nivel, como C,
con frecuencia
proveen sintaxis especial
para empotrar lenguaje
ensamblador en cada
plataforma de hardware. El
cdigo portable del sistema
entonces puede usar estos
componentes especficos a
un procesador a travs de
una interface uniforme.
El lenguaje ensamblador
tambin es valioso
en ingeniera inversa, puesto
que muchos programas
solamente son distribuidos
en una forma de cdigo de
mquina. El cdigo de
mquina es usualmente fcil
de trasladar hacia lenguaje
ensamblador para luego ser
cuidadosamente examinado
en esta forma, pero es muy
difcil de trasladar hacia un
lenguaje de alto nivel.
Herramientas
como Interactive
Disassembler, hacen uso
extenso
del desensamblador para
tales propsitos.
Un nicho que hace uso del
lenguaje ensamblador es
el demoscene. Ciertas
competiciones requieren a
los concursantes restringir
sus creaciones a un muy
pequeo tamao (ej,
256 bytes, 1 KB, 4 KB 64
KB), y el lenguaje
ensamblador es el lenguaje
de preferencia para alcanzar

este objetivo.18 Cuando los


recursos son una
preocupacin, es una
necesidad la codificacin en
ensamblador, especialmente
en sistemas constreidos por
el procesamiento del CPU,
como los primeros modelos
del Amiga, y el Commodore
64. El cdigo optimizado en
ensamblador es escrito "a
mano" por
los programadores en un
intento de minimizar el
nmero de ciclos de
CPU usados. Las
limitaciones del CPU son tan
grandes que cada ciclo
cuenta. Usar tales mtodos
ha habilitado, a sistemas
como el Commodore 64,
para producir grficos en
3D en tiempo real con
efectos avanzados, una
hazaa que puede ser
considerada improbable o
incluso imposible para un
sistema con un procesador
de 0.99 MHz.[cita requerida]

Detalles
adicionales[editar]
Para un determinado
computador personal,
mainframe, sistema
empotrado, y consola de
juegos, tanto del pasado
como del presente, ha sido
escrito al menos uno, y
posiblemente docenas de
ensambladores. Para
algunos ejemplos, vea la lista
de ensambladores.
En los sistemas Unix, el
ensamblador es llamado
tradicionalmente as, aunque
no es un simple cuerpo de
cdigo, siendo tpicamente
escrito uno nuevo por cada
port. Un nmero de variantes
de Unix usan el GAS
Dentro de los grupos de
procesadores, cada
ensamblador tiene su propio
dialecto. A veces, algunos

ensambladores pueden leer


el dialecto de otro, por
ejemplo, TASM puede leer el
viejo cdigo del MASM, pero
no al
revs. FASM y NASM tienen
una sintaxis similar, pero
cada uno soporta diferentes
macros que pueden ser difcil
de trasladar de uno al otro.
Las cosas bsicas son
siempre las mismas, pero las
caractersticas avanzadas
sern diferentes19
Tambin, los lenguajes
ensambladores a veces
pueden ser portables a
travs de diferentes sistemas
operativos en el mismo tipo
de CPU. Las convenciones
de llamadas entre los
sistemas operativos con
frecuencia difieren
ligeramente o en nada. y con
cuidado es posible ganar
portabilidad en el lenguaje
ensamblador, usualmente al
enlazar con una biblioteca de
lenguaje C que no cambia
entre sistemas operativos.
Un simulador de conjunto de
instrucciones (que
idealmente sera escrito en
lenguaje ensamblador)
puede, en teora, procesar
el cdigo
objeto/binario de cualquier e
nsamblador) para lograr la
portabilidad incluso a travs
de plataformas (con una
sobrecargue no mayor que la
de un interpretador
de bytecode tpico). Esto es
esencialmente lo que logra
el microcdigo cuando una
plataforma de hardware
cambia internamente.
Por ejemplo, muchas cosas
en libc dependen
del preprocesador para
hacer, al programa antes de
compilar, cosas que son
especficas del sistema
operativo o especficas del
C. De hecho, algunas
funciones y smbolos ni

siquiera estn garantizados


que existan fuera del
preprocesador. Peor an, el
tamao y el orden de los
campos de las estructuras,
tanto como el tamao de
ciertas typedefs como off_t,
no estn disponibles en
lenguaje ensamblador sin la
ayuda de un script de
configuracin, y difieren
incluso entre versiones
de Linux, haciendo imposible
portar llamadas de funciones
en libc diferentes de los que
toman simples enteros o
punteros como parmetros.
Para manejar estos
problemas, el proyecto
FASMLIB provee una
biblioteca de lenguaje
ensamblador portable para
las plataformas Win32 y
Linux, pero todava est muy
incompleta.20
Algunos lenguajes de muy
alto nivel, como C y
Borland/Pascal, soportan
ensamblado en lnea, donde
relativamente secciones
cortas de cdigo en
ensamblador puede ser
empotradas dentro del
cdigo del lenguaje de alto
nivel. El
lenguaje Forth comnmente
contiene un ensamblador
usado para codificar
palabras.
La mayora de la gente usa
un emulador para depurar su
s programas en lenguaje
ensamblador.

Ejemplos de
lenguaje
ensamblador[editar]
Ejemplo para la
arquitectura x86[editar]
El siguiente es un ejemplo
del programa clsico Hola
mundo escrito para la
arquitectura de

procesador x86 (bajo el


sistema operativo DOS).
;
------------------------------------------; Programa que imprime
un string en la
pantalla
;
------------------------------------------.model small
; modelo de memoria
.stack
; segmento del stack
.data
; segmento de datos
Cadena1 DB 'Hola
Mundo.$' ; string a
imprimir (finalizado
en $)
.code
; segmento del cdigo
;
------------------------------------------; Inicio del programa
;
------------------------------------------programa:
;
----------------------------------------------------------------

--------------------------------; inicia
el segmento de datos
;
-----------------------------------------------------------------------------------------------MOV AX,
@data

; carga

en AX la direccin del
segmento de datos
MOV DS,
AX

; mueve

la direccin al
registro de segmento
por medio de AX
;
-----------------------------------------------------------------------------------------------; Imprime
un string en pantalla
;
-----------------------------------------------------------------------------------------------MOV DX,
offset Cadena1 ; mueve
a DX la direccin del
string a imprimir
MOV AH, 9
; AH = cdigo para
indicar al MS DOS que
imprima en la

pantalla, el string en
DS:DX
INT 21h
; llamada al MS DOS
para ejecutar la
funcin (en este caso
especificada en AH)
;
-----------------------------------------------------------------------------------------------;
Finaliza el programa
;
-----------------------------------------------------------------------------------------------INT 20h
; llamada al MS DOS
para finalizar el
programa
end programa

Ejemplo para el
computador virtual
(POCA)[editar]
Una seleccin de
instrucciones para una
computadora virtual21 ) con
las correspondientes
direcciones de memoria en
las que se ubicarn las
instrucciones. Estas
direcciones NO son
estticas. Cada instruccin
se acompaa del cdigo en
lenguaje ensamblador
generado (cdigo objeto)
que coincide con la
arquitectura de computador

virtual, o conjunto de
instrucciones ISA.
Dir.

Etiqueta

In

.begin

.org 2048

a_start

.equ 3000

2048

ld length,

2064

be done

2068

addcc %r1,

2072

addcc %r1,

2076

ld %r4,%r5

2080

ba loop

2084

addcc %r3,

2088

done:

jmpl %r15+

2092

length:

20

2096

address:

a_start

.org a_sta

3000

a:</tt

Ejemplo para el C
Intel 8051[editar]
Cdigo en lenguaje
ensamblador para C Intel
80C51:

ORG 8030H
include
T05SEG:
SETB TR0
JNB uSEG,T05SEG
;esta subrutina es
utilizada
CLR TR0 ;para
realizar una cuenta de
CPL uSEG ;0,5
segundos mediante la
MOV R1,DPL
;interrupcin del
timer 0.
INVOKE
MOV R2,DPH

CJNE
R2,#07H,T05SEG
CJNE
R1,#78H,T05SEG
MOV DPTR,#0
RET

Ejemplo para el
Microchip
PIC16F84[editar]
Cdigo en lenguaje
ensamblador para
el microcontrolador 16F84 de
Microchip:
ORG 0
Inicio
bcf
STATUS,RP0
clrf

PORTB

movlw

0xFF

movwf

PORTA

bsf
STATUS,RP0
Principal
movf

PORTA,W

movwf

Contador

movf
Contador,F
btfsc

STATUS,Z

goto
PuntoDecimal

END

sublw

d'9'

btfss

STATUS,C

Vase
tambin[editar]

Lenguaje ensamblador
x86

Anexo:Listados de
instrucciones x86

Ensamblador

Macro ensamblador

Ensamblador de alto
nivel

Desensamblador

Compilador

Decompilador

Intrprete (informtica)

Depurador

Lenguaje de alto nivel

Lenguaje de bajo nivel

Lenguaje de mquina

Conjunto de
instrucciones

Tipos de datos mquina

Little man computer

Ensambladores

Comparacin de
ensambladores

High Level Assembly

Netwide Assembler

Flat assembler

GNU Assembler

Microsoft Macro
Assembler

RosASM

A86 y A386 assemblers

Turbo Assembler

GNU toolchain

Desensambladores

Interactive Disassembler

Depuradores

SoftICE

GNU Debugger

OllyDbg

Valgrind

RosASM

A86 y A386 assemblers

Data Display Debugger

Otros
Sistemas operativos
escritos completamente en
assembler:

MenuetOS

KolibriOS

BareMetal OS

S-ar putea să vă placă și