Compilador

- redirect Plantilla:Redirige aquí
En informàtica, un compilador és un programa que traduïx còdic escrit en un llenguage de programació (cridat font) a un atre llenguage (conegut com objecte).[1] En este tipo de traductor el llenguage font és generalment un llenguage d'alt nivell i l'objecte un llenguage de baix nivell, com assembly o còdic màquina.[2] Este procés de traducció es coneix com a compilació.[3]
La construcció d'un compilador involucra la divisió del procés en una série de fases que variarà en la seua complexitat. Generalment estes fases s'agrupen en dos tasques: l'anàlisis del programa font i la #síntesis del programa objecte.[4]Plantilla:R/superscript
- Anàlisis: es tracta de la comprovació de la correcció del programa font, segons la definició del llenguage en térmens de teoria de llenguages formals. Inclou les fases corresponents al anàlisis lèxic (que consistix en la descomposició del programa font en components lèxics), anàlisis sintàctic (agrupació dels components lèxics en frases gramaticals ) i anàlisis semàntic (comprovació de la validea semàntica de les sentències acceptades en la fase d'anàlisis sintàctic).[4]Plantilla:R/superscript
- #Síntesis: el seu objectiu és la generació de l'eixida expressada en el llenguage objecte i sol estar format per una o vàries combinacions de fases de generació de còdic (normalment es tracta de còdic intermig o de còdic objecte) i d'optimisació de còdic[4]Plantilla:R/superscript (en les que es busca obtindre un programa objectiu lo més eficient possible, segons el seu complexitat computacional o complexitat de Kolmogórov: temps d'eixecució, espai durant eixecució, espai per a ser almagasenat fòra d'eixecució, etc.).
Alternativament, les fases descrites per a les tasques d'anàlisis i #síntesis es poden agrupar en:
- Analisador o front-end: és la part que analisa el còdic font,[5] comprova la seua validea, genera l'arbre de derivació i reblix els valors de la taula de símbols. Esta part sol ser independent de la plataforma o sistema per al qual es vaja a compilar, i està composta per les fases compreses entre l'anàlisis lèxic i la generació de còdic intermig.
- Generador o back-end: és la part que genera el còdic màquina, específic d'una plataforma, a partir dels resultats de la fase d'anàlisis.[5]
Esta divisió permet que el mateix generador s'utilise per a crear el còdic màquina de varis llenguages de programació distints i que el mateix analisador que servix per a examinar el còdic font d'un llenguage de programació concret servixca per a produir còdic màquina en vàries plataformes.
Història
[editar | editar còdic]- Artícul principal → Història de la construcció dels compiladors.
En 1938, Konrad Zuse va desenrollar la primera computadora digital electromecànica, denominada Z1 en Alemània, i posteriorment, en 1946, es va desenrollar la primera computadora totalment electrònica ENIAC, succeïda principalment per la EDVAC (1951), primera computadora electrònica digital. En un principi, estes màquines eixecutaven instruccions consistents en còdics numèrics que senyalaven als circuits de la màquina els estats corresponents a cada operació, #lo que es va denominar llenguage màquina.
Pronte els primers usuaris d'estos ordenadors varen descobrir la ventaja d'escriure els seus programes per mig de claus més fàcils de recordar que eixos còdics; al final, totes eixes claus juntes es traduïen manualment a llenguage màquina. Estes claus constituïxen els cridats llenguages ensambladors.
Pese a tot, el llenguage ensamblador seguia sent el d'una màquina, pero més fàcil de manejar (les instruccions de màquina es reemplacen per mnemònics). Els treballs d'investigació es varen orientar cap a la creació d'un llenguage que expressara les distintes accions a realisar d'una manera lo més senzilla possible per a una persona. El primer compilador va ser escrit per Grace Hopper, en 1952 per al llenguage de programació A-0. En 1950 John Backus va dirigir una investigació en IBM sobre un llenguage algebraic. En 1954 es va escomençar a desenrollar un llenguage que permetia escriure fòrmules matemàtiques de manera traducible per un ordenador; li varen cridar FORTRAN (FORmulae TRANslator). Va ser el primer llenguage d'alt nivell i es va introduir en 1957 per a l'us de la computadora IBM modele 704.
Va sorgir aixina per primera volta el concepte d'un traductor com un programa que traduïa un llenguage a un atre llenguage. En el cas particular de que el llenguage a traduir és un llenguage d'alt nivell i el llenguage traduït de baix nivell, s'ampra el terme compilador.
El treball de realisar un compilador va ser complicat de realisar. El primer compilador de FORTRAN va tardar 18 anys-persona en realisar-se i era molt senzill. Este desenroll de FORTRAN estava molt influenciat per la màquina objecte en la que anava a ser implementat. Com un eixemple d'això tenim el fet de que els espais en blanc anaren ignorats, degut a que el perifèric que s'utilisava com a entrada de programes (una llectora de targetes perforades) no contava correctament els espais en blanc.
El primer compilador autocontenido, és dir, capaç de compilar el seu propi còdic font va ser el creat per a Lisp per Hart i Levin en el MIT en 1962. Des de 1970 s'ha convertit en una pràctica comuna escriure el compilador en el mateix llenguage que este compila, encara que PASCAL i C han segut alternatives molt usades.
Crear un compilador autocontenido genera un problema cridat bootstrapping, és dir el primer compilador creat per a un llenguage té que o ben ser compilado per un compilador escrit en un atre llenguage o be compilado en eixecutar el compilador en un intérpret.
[1] Tipos de compiladors
[editar | editar còdic]Esta taxonomia dels tipos de compiladors no és excloent, per #lo que pugues haver compiladors que s'adscriguen a vàries categories:
- Compiladors creuats: generen còdic per a una plataforma distinta a aquella en la que estan funcionant.[6]
- Compiladors optimizadores: realisen canvis en el còdic per a millorar la seua eficiència, pero mantenint la funcionalitat del programa original.
- Compiladors d'una sola passada: generen el còdic màquina a partir d'una única llectura del còdic font.
- Compiladors de vàries passades: necessiten llegir el còdic font vàries voltes abans de poder produir el còdic màquina.
- Compiladors JIT (just in clave): formen part d'un intérpret i compilan parts del còdic segons es necessiten.
En les primeres époques de la informàtica, els compiladors eren considerats un software dels més complexos existents.cita requerida
Els primers compiladors es varen realisar programant-los directament en llenguage màquina o en ensamblador. Una volta que es dispon d'un compilador, es poden escriure noves versions del compilador (o atres compiladors distints) en el llenguage que compila eixe compilador.
Existixen ferramentes que faciliten la tasca d'escriure compiladors o intérprets informàtics. Estes ferramentes permeten generar l'esquelet del analisador sintàctic a partir d'una definició formal del llenguage de partida, especificada normalment per mig d'una gramàtica formal i barata, deixant únicament al programador del compilador la tasca de programar les accions semàntiques associades.
Procés de compilació
[editar | editar còdic]És el procés pel qual es traduïxen les instruccions escrites en un determinat llenguage de programació a llenguage màquina. Ademés d'un traductor, es poden necessitar atres programes per a crear un programa objecte eixecutable. Un programa font es pot dividir en mòduls almagasenats en archius distints. La tasca de reunir el programa font a sovint es confia a un programa distint, cridat preprocesador. El preprocesador també pot expandir abreviatures, cridades a macros, a proposicions del llenguage font.
Normalment la creació d'un programa eixecutable (un típic archiu .exe para Windows o DOS) comporta dos passos. El primer pas es diu compilació (pròpiament dit) i traduïx el còdic font escrit en un llenguage de programació almagasenat en un archiu a còdic en baix nivell (normalment en còdic objecte, no directament a llenguage màquina). El segon pas es diu enllaçat en el qual s'enllaça el còdic de baix nivell generat de tots els fichers i subprogramas que s'han manat a compilar i s'afig el còdic de les funcions que hi ha en les biblioteques del compilador per a que l'eixecutable puga comunicar-se directament en el sistema operatiu, traduint aixina finalment el còdic objecte a còdic màquina, i generant un mòdul eixecutable.
Estos dos passos es poden fer per separat, almagasenant el resultat de la fase de compilació en archius objectes (un típic.obj per a Microsoft Windows, DOS o para Unix); per a enllaçar-los en fases posteriors, o crear directament l'eixecutable; en lo que la fase de compilació s'almagasena solament temporalment. Un programa podria tindre parts escrites en varis llenguages (per eixemple C, C++ i Asm), que es podrien compilar de forma independent i després enllaçar juntes per a formar un únic mòdul eixecutable.
Etapes del procés
[editar | editar còdic]El procés de traducció es compon internament de vàries etapes o fases, que realisen distintes operacions llògiques. És útil pensar en estes fases com en peces separades dins del traductor, i poden en realitat escriure's com a operacions codificades separadament encara que en la pràctica a sovint s'integren juntes.
Fase d'anàlisis
[editar | editar còdic]Anàlisis lèxic
[editar | editar còdic]- Artícul principal → Analisador lèxic.
L'anàlisis lèxic constituïx la primera fase, ací es llig el programa font d'esquerra a dreta i s'agrupa en components lèxics (tókenes), que són seqüències de caràcters que tenen un significat. Ademés, tots els espais en blanc, llínees en blanc, comentaris i demés informació innecessària s'elimina del programa font. També es comprova que els símbols del llenguage (paraules clau, operadorés, etc.) s'han escrit correctament.
Com la tasca que realisa l'analisador lèxic és un cas especial de coincidència de patrons, es necessiten els métodos d'especificació i reconeiximent de patrons, s'usen principalment els autómates finitos que accepten expressions regulars. No obstant, un analisador lèxic també és la part del traductor que maneja l'entrada del còdic font, i lloc que esta entrada a sovint involucra una important despesa de temps, l'analisador lèxic deu funcionar de manera tan eficient com siga possible.
Anàlisis sintàctic
[editar | editar còdic]- Artícul principal → Analisador sintàctic.
En esta fase els caràcters o components lèxics s'agrupen jerárquicamente en frases gramaticals que el compilador utilisa per a sintetisar l'eixida. Es comprova si lo obtingut de la fase anterior és sintácticamente correcte (obedix a la gramàtica del llenguage). Per lo general, les frases gramaticals del programa font es representen per mig d'un arbre d'anàlisis sintàctic.
L'estructura jeràrquica d'un programa normalment s'expressa utilisant regles recursivas. Per eixemple, es poden donar les següents regles com a part de la definició d'expressions:
- Un identificador pot ser una expressió.
- Un número pot ser una expressió.
- Si expressió1 i expressió2 són expressions, llavors també ho són:
- expressió1 + expressió2
- expressió1 * expressió2
- ( expressió1 )
Les regles 1 i 2 són regles bàsiques (no recursivas), mentres que la regla 3 definix expressions en funció d'operadors aplicats a atres expressions.
La divisió entre anàlisis lèxic i anàlisis sintàctic és alguna cosa arbitrària. Un factor per a determinar la divisió és si una construcció del llenguage font és inherentemente recursiva o no. Les construccions lèxiques no requerixen recursión, mentres que les construccions sintàctiques solen requerir-la. No es requerix recursión per a reconéixer els identificadors, que solen ser cadenes de lletres i dígits que comencen en una lletra. Normalment, es reconeixen els identificadors pel simple examen del fluix d'entrada, esperant fins a trobar un caràcter que no siga ni lletra ni dígit, i agrupant despuix totes les lletres i dígits trobats fins a eixe punt en un component lèxic cridat identificador. Per una atra part, esta classe d'anàlisis no és suficientment poderós per a analisar expressions o proposicions. Per eixemple, no podem emparellar de manera apropiada els paréntesis de les expressions, o les paraules begin i end en proposicions sense impondre alguna classe d'estructura jeràrquica o de anidamiento a l'entrada.
Anàlisis semàntic
[editar | editar còdic]La fase d'anàlisis semàntic revisa el programa font per a tractar de trobar errors semàntics i reunix l'informació sobre els tipos per a la fase posterior de generació de còdic. En ella s'utilisa l'estructura jeràrquica determinada per la fase d'anàlisis sintàctic per a identificar els operadors i operants d'expressions i proposicions.
Un component important de l'anàlisis semàntic és la verificació de tipos. Ací, el compilador verifica si cada operador té operants permesos per l'especificació del llenguage font. Per eixemple, les definicions de molts llenguages de programació requerixen que el compilador indique un error cada volta que s'use un número real com a índex d'una matriu. No obstant, l'especificació del llenguage pot impondre restriccions als operants, per eixemple, quan un operador aritmètic binario s'aplica a un número entero i a un número real.[7] Revisa que els apanys tinguen definit el tamany correcte.
Fase de #síntesis
[editar | editar còdic]Consistix en generar el còdic objecte equivalent al programa font. Solament es generarà còdic objecte quan el programa font està lliure d'errors d'anàlisis.
El resultat pot ser llenguage de màquina o còdic ensamblador.[8] Les posicions de memòria se seleccionen per a cada una de les variables usades pel programa. Despuix, cada una de les instruccions intermiges es traduïx a una seqüència d'instruccions de màquina que eixecuta la mateixa tasca. Un aspecte decisiu és l'assignació de variables a registres.
Generació de còdic intermig
[editar | editar còdic]Despuix dels anàlisis sintàctic i semàntic, alguns compiladors generen una representació intermija explícita del programa font. Esta representació intermija deu tindre dos propietats importants: deu ser fàcil de produir i fàcil de traduir al programa objecte.[9]
La representació intermija pot tindre diverses formes. Existix una forma intermija cridada «còdic de tres direccions», similar al llenguage ensamblador, en la que cada instrucció porta a terme una sola operació. El còdic de tres direccions consistix en una seqüència d'instruccions, cada una de les quals té com a màxim tres operants. Esta representació intermija té vàries propietats:
- Primera: cada instrucció de tres direccions té com a molt un operador, ademés de l'assignació.
- Segona: el traductor deu generar un nom temporal per a guardar els valors calculats per cada instrucció.
- Tercera: algunes instruccions «de tres direccions» tenen menys de tres operants.
Optimisació de còdic
[editar | editar còdic]- Artícul principal → Compilador optimizador.
La fase d'optimisació de còdic consistix en millorar el còdic intermig, de modo que resulte un còdic màquina més ràpit d'eixecutar. Esta fase de l'etapa de #síntesis és possible sobretot si el traductor és un compilador (difícilment un intérpret pot optimisar el còdic objecte). Hi ha molta variació en la cantitat d'optimisació de còdic que eixecuten els distints compiladors. En els que fan molta optimisació, cridats «compiladors optimizadores», una part significativa del temps del compilador s'ocupa en esta fase. No obstant, hi ha optimisacions senzilles que milloren sensiblement el temps d'eixecució del programa objecte sense retardar massa la compilació.[7]
Estructura de senyes principals
[editar | editar còdic]L'interacció entre els algoritmes utilisats per les fases del compilador i les estructures de senyes que soporten estes fases és, naturalment, molt forta. L'escritor del compilador s'esforça per implementar estos algoritmes d'una manera tan eficaç com siga possible, sense aumentar massa la complexitat. De manera ideal, un compilador deuria poder compilar un programa en un temps proporcional al tamany del mateix.
Components lèxics o tókenes
[editar | editar còdic]Quan un analisador lèxic reunix els caràcters en un token, generalment representa el token de manera simbòlica, és dir, com un valor d'un tipo de senyes enumerat que representa el conjunt de tokens del llenguage font. En ocasions també és necessari mantindre la cadena de caràcters mateixa o una atra informació derivada d'ella, tal com el nom associat en un token identificador o el valor d'un token de número.
En la majoria dels llenguages l'analisador lèxic solament necessita generar un token al mateix temps. En este cas es pot utilisar una variable global simple per a mantindre l'informació del token. En atres casos (l'eixemple dels quals més notable és FORTRAN), pot ser necessari un apany (o vector) de tókenes.
Arbre sintàctic
[editar | editar còdic]Si l'analisador sintàctic genera un arbre sintàctic, por lo regular es construïx com una estructura estàndar basada en un punter que s'assigna de manera dinàmica a mida que s'efectua l'anàlisis sintàctic. L'arbre sancer pugues llavors conservar-se com una variable simple que apunta al nodo raïl. Cada nodo en l'estructura és un registre els camps del qual representen l'informació recolectada tant per l'analisador sintàctic com, posteriorment, per l'analisador semàntic. Per eixemple, el tipo de senyes d'una expressió pot conservar-se com un camp en el nodo de l'arbre sintàctic per a l'expressió.
En ocasions, per a aforrar espai, estos camps s'assignen de manera dinàmica, o s'almagasenen en atres estructures de senyes, tals com la taula de símbols, que permeten una assignació i desasignación selectives. En realitat, cada nodo de l'arbre sintàctic per sí mateixa pot requerir d'atributs diferents per a ser almagasenat, d'acort en la classe d'estructura del llenguage que represente. En este cas, cada nodo en l'arbre sintàctic pot estar representat per un registre variable, en cada classe de nodo contenint solament l'informació necessària per a eixe cas.
Taula de símbols
[editar | editar còdic]Esta estructura de senyes manté l'informació associada en els identificadors: funcions, variables, constants i tipos de senyes. La taula de símbols interactua en casi totes les fases del compilador: l'analisador lèxic, l'analisador sintàctic o l'analisador semàntic poden introduir identificadors dins de la taula; l'analisador semàntic agregarà tipos de senyes i una atra informació; i les fases d'optimisació i generació de còdic utilisaran l'informació proporcionada per la taula de símbols per a efectuar seleccions apropiades de còdic objecte.
ya que la taula de símbols tindrà solicituts d'accés en tanta freqüència, les operacions d'inserció, eliminació i accés necessiten ser eficients, preferiblement operacions de temps constant. Una estructura de senyes estàndar per a este propòsit és la taula de dispersió o de càlcul de direcció, encara que també es poden utilisar diverses estructures d'arbre. En ocasions s'utilisen vàries taules i es mantenen en una llista o pila.
Taula de lliterals
[editar | editar còdic]La busca i l'inserció ràpida són essencials també per a la taula de lliterals, la qual almagasena constants i cadenes utilisades en el programa. No obstant, una taula de lliterals necessita impedir les eliminacions perque les seues senyes s'apliquen globalment al programa i una constant o cadena apareixerà solament una volta en esta taula. La taula de lliterals és important en la reducció del tamany d'un programa en la memòria en permetre la reutilisació de constants i cadenes. També és necessària per a que el generador de còdic construïxca direccions simbòliques per a les lliterals i per a introduir definicions de senyes en l'archiu de còdic objecte.
Còdic intermig
[editar | editar còdic]D'acort en la classe de còdic intermig (per eixemple, còdic de tres direccions o còdic P) i de les classes d'optimisacions realisades, este còdic pot conservar-se com un apany de cadenes de text, un archiu de text temporal o be una llista d'estructures lligades. En els compiladors que realisen optimisacions complexes deu posar-se particular atenció a la selecció de representacions que permeten una fàcil reorganisació.
Optimisació de còdic
[editar | editar còdic]La fase d'optimisació de còdic tracta de millorar el còdic intermig de modo que resulte un còdic de màquina més ràpit d'eixecutar. Algunes optimisacions són trivials. Per eixemple, un algoritme natural genera el còdic intermig (2) utilisant una instrucció per a cada operador de la representació de l'arbre despuix de l'anàlisis semàntic, encara que hi ha una forma millor de realisar els mateixos càlculs usant les dos instruccions
temp1 := aneu3 * 60.0 ===> (3) aneu1 := aneu2 + temp1
Este senzill algoritme no té res de mal, ya que el problema es pot solucionar en la fase d'optimisació de còdic. Açò és, el compilador pot deduir que la conversió de 60 de sancer a real es pot fer d'una volta per totes en el moment de la compilació, de modo que l'operació "entreal( )" es pot eliminar. Ademés, temp3 s'usa solament una volta, per a transmetre el seu valor a aneu1. Llavors resulta segur substituir a aneu1 per temp3, a partir de la qual cosa l'última proposició de (2) no es necessita i s'obté el còdic de (3).
Hi ha moltes variacions en la cantitat d'optimisació de còdic que eixecuten els distints compiladors. En lo que fan molta optimisació cridats «compiladors optimizadores», una part significativa del temps del compilador s'ocupa en esta fase. No obstant, hi ha optimisacions senzilles que milloren sensiblement el temps d'eixecució del programa objecte sense retardar massa la compilació.
Archius temporals
[editar | editar còdic]Al principi les computadores no tenien la suficient memòria per a guardar un programa complet durant la compilació. Este problema es va resoldre per mig de l'us d'archius temporals per a mantindre els productes dels passos intermijos durant la traducció o be al compilar «al vol», és dir, mantenint solament l'informació suficient de les parts anteriors del programa font que permeta procedir a la traducció.
Les llimitacions de memòria són ara un problema molt menor, i és possible requerir que una unitat de compilació sancera es mantinga en memòria, en especial si es dispon de la compilació per separat en el llenguage. En tot, els compiladors ocasionalment troben útil generar archius intermijos durant alguna de les etapes del processament. Alguna cosa típic d'estos és la necessitat de direccions de correcció cap a arrere durant la generació de còdic.
Vore també
[editar | editar còdic]- BlueJ
- Llenguage de programació
- Llenguage ensamblador
- Ensamblador
- Desensamblador
- Decompilador
- Intérpret
- Depurador
- Llenguage d'alt nivell
- Llenguage de baix nivell
- Llenguage de màquina
- Història de la construcció dels compiladors
Referències
[editar | editar còdic]- ↑ 1,0 1,1 (1997) Clause and effect, Springer-Verlag, p. 93. ISBN 978-3-540-62971-9.
- ↑ Garrido Alenda; Iñesta Quereda, José Manuel; Moreno Sec, Francisco; Pérez Ortiz, {{{nom4}}} (2002). «1», Dissenye de compiladors. ISBN 978-84-7908-700-5.
- ↑ Laborda, Javier (1985). «Software», Biblioteca pràctica de la computació, Barcelona: Edicions Oceà-Èxit, S.A..
- ↑ 4,0 4,1 4,2 Grune, Dick; van Reeuwijk, Kees; Bal, {{{nom3}}}; Jacobs, {{{nom4}}} (2012). Modern Compiler Design (en en), Springer New York. doi:10.1007/978-1-4614-4699-6. ISBN 978-1-4614-4698-9.
- ↑ 5,0 5,1 Hjort Blindell, Gabriel (2016). Instruction Selection (en en), Springer International Publishing, p. 4. doi:10.1007/978-3-319-34019-7. ISBN 978-3-319-34017-3.
- ↑ Wirth, Niklaus (1996). Compiler construction (en Inglés), Addison-Wesley. ISBN 0-201-40353-6.
- ↑ 7,0 7,1 Aho, Alfred V. (2008). «Introducció a la Compilació», Compiladors: Principis, tècniques i pràctiques, Mèxic: Addison Wesley.
- ↑ Calingaert, Peter (1979). Assemblers, compilers, and program translation (en Inglés), Computer Science Press, p. 139. OCLC 4497216. ISBN 0-914894-23-4.
- ↑ Aho, Alfred V.; Lam, Monica S.; Sethi, {{{nom3}}}; Ullman, {{{nom4}}} (2007). Compilers : principles, techniques, & tools, 2.ª edició. OCLC 70775643. ISBN 0-321-48681-1.
Enllaços externs
[editar | editar còdic]
Compilador en el Viccionari.
- Let's Build a Compiler. Tutorial de Jack W. Crenshaw sobre cóm fer un compilador
- Java a top: Traductors i Compiladors en Lex/Yacc, JFlex/Cup i JavaCC. Llibre bàsic sobre compiladors
Referències
[editar | editar còdic]- Este artícul conté una traducció derivada de «Compilador» de Wikipedia en castellà publicada baix la Llicència de documentació lliure de GNU i la Llicència Creative Commons Reconeiximent-CompartirIgual 4.0 Internacional.