Documente Academic
Documente Profesional
Documente Cultură
Alternativamente, las fases descritas para las tareas de anlisis y sntesis se pueden
agrupar en Front-end y Back-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
4.1.1Anlisis lxico
4.1.2Anlisis sintctico
4.1.3Anlisis semntico
4.2Fase de sntesis
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
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.
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.
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:
Segunda.- El traductor debe generar un nombre temporal para guardar los valores
calculados por cada instruccin.
Optimizacin de cdigo[editar]
Artculo principal: Compilador optimizador
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
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)
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
===> (3)
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
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
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
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.
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]
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
Int
Float
String
Boolean
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:
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.
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
{{subst:Aviso mal
traducido|Lenguaje de programacin}} ~~~~
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}} ~~~~
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]
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
Tcnica[editar]
Para escribir programas que proporcionen los mejores resultados, cabe tener en cuenta
una serie de detalles.
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.).
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.
objetos}} ~~~~
1Introduccin
2Origen
3Conceptos fundamentales
4Caractersticas de la POO
5Resumen
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
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
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}}
~~~~
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}} ~~~~
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
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.
1Caractersticas
2Programa ensamblador
o
2.1Nmero de pasos
3Lenguaje
o
3.1Instrucciones de CPU
3.2Ensamblado
3.3Ejemplos
4.1.2Secciones de datos
4.2Macros
5.1Perspectiva histrica
5.2Uso actual
5.3Aplicaciones tpicas
6Detalles adicionales
8Vase tambin
9Referencias
10Bibliografa
11Enlaces externos
Caractersticas[editar]
Programa ensamblador[editar]
Artculo principal: Ensamblador
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.
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 booleanas. Operaciones lgicas bit a bit como AND, OR, XOR, NOT
Comparaciones
Saltos incondicionales
Operaciones trascendentales
Operaciones
trigonomtricas. Seno, coseno, tangente, arcotan
gente
Otras
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
0000
01100001
+--- Registro AL
10110000 01100001
Mnemnicos de opcode
Secciones de datos
Directivas de ensamblador
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
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
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
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 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
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)
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
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
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
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
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
--------------------------------; 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 mquina
Conjunto de
instrucciones
Ensambladores
Comparacin de
ensambladores
Netwide Assembler
Flat assembler
GNU Assembler
Microsoft Macro
Assembler
RosASM
Turbo Assembler
GNU toolchain
Desensambladores
Interactive Disassembler
Depuradores
SoftICE
GNU Debugger
OllyDbg
Valgrind
RosASM
Otros
Sistemas operativos
escritos completamente en
assembler:
MenuetOS
KolibriOS
BareMetal OS