Anda di halaman 1dari 9

Compilador

1
Compilador
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 de
programacin, generando un programa
equivalente que la mquina ser capaz de
interpretar. 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.
Un compilador es un programa que permite
traducir el cdigo fuente de un programa en
lenguaje de alto nivel, a otro lenguaje de nivel
inferior (tpicamente lenguaje de mquina).
De esta manera un programador puede disear
un programa en un lenguaje mucho ms
cercano a como piensa un ser humano, para
luego compilarlo a un programa ms
manejable por una computadora.
Como parte importante de este proceso de
traduccin, el compilador informa a su usuario
de la presencia de errores en el programa
fuente.
Partes de un compilador
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.
Compilador
2
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.
El cdigo que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado
por un programa enlazador (linker)
Historia
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
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.
Compilador
3
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
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 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 slo 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
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
Anlisis 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
Compilador
4
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
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 expresin
1
y expresin
2
son expresiones, entonces tambin lo son:
expresin
1
+ expresin
2
expresin
1
* expresin
2
( expresin
1
)
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
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. Revisa que los
arreglos tengan definido el tamao correcto.
Compilador
5
Fase de sntesis
Consiste en generar el cdigo objeto equivalente al programa fuente. Slo 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
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
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.
Estructura de datos principales
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
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.
Compilador
6
En la mayora de los lenguajes el analizador lxico slo 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
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
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
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 slo 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.
Compilador
7
Cdigo intermedio
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 slo 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.
Compilador
8
Archivos temporales
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 slo 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 stos es la necesidad de direcciones de correccin hacia atrs durante la
generacin de cdigo.
Referencias
Enlaces externos
Wikcionario tiene definiciones y otra informacin sobre compilador.Wikcionario
Let's Build a Compiler (http:/ / compilers. iecc. com/ crenshaw/ ). Tutorial de Jack W. Crenshaw sobre cmo
hacer un compilador
Java a tope: Traductores y Compiladores con Lex/Yacc, JFlex/Cup y JavaCC. (http:/ / www. lcc. uma. es/
~galvez/ Compiladores. html) Libro bsico sobre compiladores
Fuentes y contribuyentes del artculo
9
Fuentes y contribuyentes del artculo
Compilador Fuente: http://es.wikipedia.org/w/index.php?oldid=74962436 Contribuyentes: Aleix87, Amads, Antonorsi, Antur, Arcibel, Axvolution, Balles2601, BetoCG, Biasoli, Cerokelvin,
Cheveri, Chomoi, Cookie, Daviba, Dgmrtabu, Diegusjaimes, Dodo, Draxtreme, Edgar, EduLeo, Eduardosalg, Elabra sanchez, Eldelgas, Ellinik, Escarlati, Facon, Farisori, Fixertool, FkieCarrero,
Fortran, FrancoGG, GMoyano, Garciaejalfonso, Gengiskanhg, GermanX, Giliofelix, Gorivero, Gngora, Huds, Interwiki, Isha, Ivan rome, Ivanics, Jarisleif, Jesuja, Jkbw, Jlm29, JojAGT,
Jorgechp, Kroji, Leonpolanco, LordT, Lourdes Cardenal, MadriCR, Mansoncc, ManuelGR, Manuelt15, Marianov, Markoszarrate, Matdrodes, Milestones, Mjmi, Moriel, Murphy era un optimista,
Murven, Nachomanco, Neodop, Niqueco, Paz.ar, Petruss, Plux, Queninosta, Qwertyytrewqqwerty, Rmaestre, RoyFocker, Rsg, Sabbut, Sauron, Soulreaper, Spazer, Superzerocool, Taichi, The
worst user, Timohap, Tirithel, UA31, Vitamine, Waeswaes, Waka Waka, Walter closser, Willtron, Zenko corp, conversion script, ngel Luis Alfaro, 267 ediciones annimas
Fuentes de imagen, Licencias y contribuyentes
Archivo:CompilationScheme-Spanish.png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:CompilationScheme-Spanish.png Licencia: GNU Free Documentation License
Contribuyentes: Bayo, Gengiskanhg, Jochen Burghardt, LoStrangolatore, Nuno Tavares
Archivo:Wiktionary-logo-es.png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wiktionary-logo-es.png Licencia: logo Contribuyentes: es:Usuario:Pybalo
Licencia
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/

Anda mungkin juga menyukai