Cumpilador

Un **cumpilador** ye un porgrama de cumputador (ó un grupo de porgramas) que, a partir dun código fuonte scrito nua lenguaige cumpilada, cria un porgrama semanticamente eiquibalente, mas scrito an outra lenguaige, código oubjeto. El ye chamado **cumpilador** por rezones stóricas; ne ls purmeiros anhos de la porgramaçon outomática, eisistian porgramas que percorrian bibliotecas de subrotinas i las reunia juntas, ó cumpilaba, las subrotinas neçairas para eisecutar ua detreminada tarefa.

L nome "cumpilador" ye ousado percipalmente pa ls porgramas que traduzen l código fuonte dua lenguaige de porgramaçon d'alto nible para ua lenguaige de porgramaçon de baixo nible (por eisemplo, *[[Assembly]]* ó código de máquina). Assi i to alguns outores citan eisemplos de cumpiladores que traduzen para lenguaiges d'alto nible cumo C. Para alguns outores un porgrama que faç ua traduçon antre lenguaiges d'alto nible ye normalmente chamado un tradutor, filtro ó cumbersor de lenguaige. Un porgrama que traduç ua lenguaige de porgramaçon de baixo nible para ua lenguaige de porgramaçon d'alto nible ye un çcumpilador. Un porgrama que faç ua traduçon antre ua lenguaige de montaige i l código de máquina ye chamado montador (*assembler*). Un porgrama que faç ua traduçon antre l código de máquina i ua lenguaige de montaige ye chamado çmontador (*çassembler*). Se l porgrama cumpilado puode ser eisecutado nun cumputador cuja CPU ó sistema ouperacional ye defrente daquele an que l cumpilador ye eisecutado, l cumpilador ye coincido cumo un cumpilador cruzado.

## Stória

Ls softwares pa ls purmeiros cumputadores fúrun scritos percipalmente an lenguaige assembly por muitos anhos. Las lenguaiges d'alto nible de porgramaçon nun fúrun ambentadas até que ls benefícios de ser capaç de reutelizar software an defrentes tipos de CPUs passassen a ser seneficatibamente maiores de l que l custo de se screbir un cumpilador. La capacidade de mimória mui lemitada capacidade de ls purmeiros cumputadores tamien criaba muitos porblemas técnicos na amplementaçon dun cumpilador.

Ne l final de la década de 1950, las lenguaiges de porgramaçon andependientes de máquina fúrun perpuostas. Mais tarde, bários cumpiladores spurmentales fúrun zambolbidos. L purmeiro cumpilador fui scrito por Grace Hopper, an 1952, pa la lenguaige de porgramaçon La-0. Antes de 1957, fúrun zambolbidos sfuorços i bárias cuntribuiçones al zambolbimiento de lenguaiges d'alto nible fúrun feitas. Antre estes, l zambolbimiento de la Short Code (UNIBAC), Spedcoding ne l IBM 701, l Whirlwind, l BACAIC i l PRINT. L'eiquipe de zambolbimiento de l FORTRAN liderada por John Backus na IBM ye giralmente creditada cumo tenendo antroduzido l purmeiro cumpilador cumpleto an 1957 (ambora tenga ocorrido a la par l zambolbimiento de l *algebraic traslator* de Laning i Zierler). L COBOL ye un eisemplo dua lenguaige de la purmeira geraçon que cumpilaba an múltiplas arquiteturas, an 1960.

An muitos domínios d'aplicaçon l'eideia d'ousar ua lenguaige d'alto nible debrebe ganhou fuorça. Por causa de la funcionalidade de spanson apoiada por lenguaiges de porgramaçon recentes i la cumplexidade crecente d'arquiteturas de cumputadores, ls cumpiladores tornórun-se mais i mais cumplexos.

Ls purmeiros cumpiladores fúrun scritos an lenguaige *assembly*. L purmeiro cumpilador de *[[outo-hospedaige]] *- capaç de cumpilar sou própio código-fuonte nua lenguaige d'alto nible - fui criado pa l Lisp por Tin Hart i Lebin Mike ne l MIT an 1962.

## Caratelísticas

Normalmente, l código fuonte ye scrito nua lenguaige de porgramaçon d'alto nible, cun grande capacidade d'abstraçon, i l código oubjeto ye scrito nua lenguaige de baixo nible, cumo ua sequéncia d'anstruçones a ser eisecutada pul microprocessador.

L porcesso de cumpilaçon ye cumpuosto d'análeze i síntese. L'análeze ten cumo oubjetibo antender l código fuonte i repersentá-lo nua strutura antermediária. La síntese custrói l código oubjeto a partir desta repersentaçon antermediária.

La *análeze* puode ser subdebidida inda an análeze léxica, análeze sintática, análeze semántica i geraçon de código antermediairo. Ye tamien coincida cumo *frunt and*. La *síntese* puode tener mais bariaçones dun cumpilador a outro, podendo ser cumpuosta pulas etapas d'outimizaçon de código i geraçon de código final (ó código de máquina), sendo solamente esta radadeira etapa ye oubrigatória. Ye tamien coincida cumo *back and*.

Classicamente, un cumpilador traduç un porgrama dua lenguaige textual facilmente antendida por un ser houmano para ua lenguaige de máquina, specífica para un processador i sistema ouperacional. Atualmente, mas, son quemuns cumpiladores que gírun código para ua máquina birtual que ye, depuis, anterpretada por un anterpretador.

An lenguaiges híbridas, l cumpilador ten l papel de cumberter l código fuonte nun código chamado de *byte code*, que ye ua lenguaige de baixo nible. Un eisemplo deste cumportamiento ye l de l cumpilador de la lenguaige Java que, an beç de gerar código de la máquina hospedeira (adonde se stá eisecutando l cumpilador), gera código chamado *Java [[Bytecode]]*.

Un cumpilador ye chamado de *[[JIT|Just-in-eiquipa cumpiler]]* (JIT) quando sou porcesso de cumpilaçon acuntece solo quando l código ye chamado. Un JIT puode fazer outimizaçones a las anstruçones la medida que las cumpila.

Muitos cumpiladores ancluen un pré-processador. Un pré-processador ye un porgrama apartado, atibado pul cumpilador antes de l'ampeço de l porcesso de traduçon. Normalmente ye respunsable por mudanças ne l código fuonte çtinadas d'acuordo cun decisones tomadas an tiempo de cumpilaçon. Por eisemplo, un porgrama an C permite anstruçones cundicionales pa l pré-processador que puoden ancluir ó nun parte de l código causo ua assertiba lógica seia berdadeira ó falsa, ó simplesmente un termo steia defenido ó nó. Tecnicamente, pré-processadores son mui mais simples que cumpiladores i son bistos, puls zambolbedores, cumo porgramas a la parte, anque dessa bison nun ser necessariamente cumpartilhada pul usuairo.

Outra parte apartada de l cumpilador que muitos usuairos bénen cumo antegrada ye l linker, cuja funçon ye ounir bários porgramas yá cumpilados dua forma andependiente i unificá-los nun porgrama eisecutable. Esso anclui poner l porgrama final nun formato cumpatible culas necidades de l sistema ouperacional para carregá-lo an mimória i colocá-lo an eisecuçon.

## Fases de la cumpilaçon
### Análeze léxica

L'análeze léxica ye la purmeira fase de l cumpilador. La funçon de l'analisador léxico, tamien chamado *scanner*, ye ler l código fuonte, carater a carater, buscando la separaçon i eidantificaçon de ls eilemientos cumponentes de l porgrama fuonte, chamados simblos léxicos ó *tokenes*. Ye tamien de respunsabelidade desta fase l'eliminaçon d'eilemientos "decoratibos" de l porgrama, tales cumo spácios an branco, marcas de formataçon de testo i comentairos. Eesisten çponibles ua série de geradores outomáticos d'analisadores léxicos, cumo por eisemplo, l lex. L'oubjetibo de ls geradores outomáticos ye lemitar l sfuorço de porgramaçon dun analisador léxico specificando-se solo ls ''tokenes'' a ser reconhecidos.

### Análeze sintática

L'análeze sintática, ó análeze gramatical ye l porcesso de se detreminar se ua cadeia de simblos léxicos puode ser gerada por ua gramática. L'analisador sintático ye l cerne de l cumpilador, respunsable por berificar se ls simblos cuntidos ne l porgrama fuonte forman un porgrama bálido, ó nó. Ne l causo d'analisadores sintáticos *top-down*, tenemos l'oupçon de screbé-los a a mano ó gerá-los de forma outomática, mas ls analisadores *botton-up* solo puoden ser gerados outomaticamente. La maiorie de ls métodos d'análeze sintática, cai nua dessas dues classes chamadas *top-down* i *botton-up*. Antre ls métodos *top-down* ls mais amportantes son l'análeze sintática çcendente recursiba i l'análeze sintática preditiba nó-recursiba. Antre ls métodos d'análeze sintática *botton-up* ls mais amportantes son l'análeze sintática de precedéncia d'ouperadores, análeze sintática LR canónico, análeze sintática LALR i análeze sintática SLR. Eesisten çponibles ua série de geradores outomáticos d'analisadores sintáticos, cumo por eisemplo, l Yac, l Bison i l JavaCC.

### Análeze semántica

Las análezes léxica i sintática nun stan preacupadas cul seneficado ó semántica de ls porgramas qu'eilhas processan. L papel de l'analisador semántico ye prober métodos puls quales las struturas custruídas pul analisador sintático puodan ser abaluadas ó eisecutadas. Las gramáticas libres de cuntesto nun son suficientemente poderosas para çcrebir ua série de custruçones de las lenguaiges de porgramaçon, cumo por eisemplo regras de scopo, regras de besibelidade i cunsisténcia de tipos. Ye papel de l'analisador semántico assegurar que todas las regras sensibles al cuntesto de la lenguaige stéian analisadas i berificadas quanto a la sue balidade. Un eisemplo de tarefa própia de l'analisador semántico ye la checaige de tipos de bariables an spressones. Un de ls macanismos quemumente outelizados por amplementadores de cumpiladores ye la Gramática de Atributos, que cunsiste nua gramática libre de cuntesto acrecentada dun cunjunto fenito d'atributos i un cunjunto fenito de predicados subre estes atributos.

### Geraçon de código antermediairo

Na fase de geraçon de código antermediairo, ocorre la trasformaçon de l'arble sintática nua repersentaçon antermediária de l código fuonte. Esta lenguaige antermediária ye mais próssima de la lenguaige oubjeto de l que l código fuonte, mas inda permite ua manipulaçon mais fácele de l que se código assembly ó código de máquina fusse outelizado. Un tipo popular de lenguaige antermediária ye coincido cumo código de trés andereços. Neste tipo de código ua sentença típica ten la forma `X := L'oup B`, adonde *X*, *La* i *B* son ouperandos i *oup* ua ouparaçon qualquiera. Ua forma prática de repersentar sentenças de trés andereços ye atrabeç de l'uso de quádruplas (ouperador, argumiento 1, argumiento 2 i, resultado). Este squema de repersentaçon de código antermediairo ye preferido por dibersos cumpiladores, percipalmente aqueilhes qu'eisecutan stensibas outimizaçones de código, ua beç que l código antermediairo puode ser rearranjado dua maneira cumbeniente cun facelidade.Outras repersentaçones de código antermediairo quemumente ousadas son las triplas, (similares las quádruplas sceto pul fato de que ls resultados nun son nomeados splicitamente) las arbles, ls grafos acíclicos dirigidos(DAG) i la notaçon polonesa.

### Outimizaçon de código

La Outimizaçon de código ye la stratégia d'eisaminar l código antermediairo, porduzido durante la fase de geraçon de código cun oubjetibo de porduzir, atrabeç d'alguas técnicas, un código qu'eisecute cun bastante eficiéncia. L nome outimizador debe siempre ser ancarado cun cuidado, pus nun se puode criar un porgrama que leia un porgrama P i gere un porgrama P´ eiquibalente sendo melhor possible segundo l critério adotado. Bárias técnicas i bárias tarefas se reúnen sob l nome de Outimizaçon. Estas técnicas cunsisten an detetar padrones drento de l código porduzido i sustituí-los por códigos mais eficientes. Antre las técnicas ousadas stan la sustituiçon de spressones que puoden ser abaluadas durante l tiempo de cumpilaçon puls sous balores calculados, eliminaçon de sub-spressones redundantes, çmembramiento de laços, sustituiçon d'ouparaçones (multiplicaçon por *shifts*), antre outras. Ua de las técnicas d'outimizaçon mais eficazes i andependiente de máquina ye l'outimizaçon de laços, pus laços anternos son buns candidatos para melhories. Por eisemplo, an causo de cumputaçones fixas drento de laços, ye possible mober estas cumputaçones para fura de ls mesmos reduzindo processamiento.

### Geraçon de código final

La fase de geraçon de código final ye la radadeira fase de la cumpilaçon. La geraçon dun buono código oubjeto ye defícel debido als detalhes particulares de las máquinas pa ls quales l código ye gerado. Assi i to, ye ua fase amportante, pus ua buona geraçon de código puode ser, por eisemplo, dues bezes mais rápida qu'un algoritmo de geraçon de código ineficiente. Nin todas las técnicas d'outimizaçon son andependientes de l'arquitetura de la máquina-albo. Outimizaçones dependentes de la máquina necessitan d'anformaçones tales cumo ls lemites i ls recursos speciales de la máquina-albo la fin de porduzir un código mais cirne i eficiente. L código porduzido pul cumpilador debe se aprobeitar de ls recursos speciales de cada máquina-albo. Segundo Aho, l código oubjeto puode ser ua sequéncia d'anstruçones absolutas de máquina, ua sequéncia d'anstruçones de máquina relocables, un porgrama an lenguaige assembly ó un porgrama an outra lenguaige.

## Tratamiento d'erros

L tratamiento d'erros stá buoltado la falhas debido la muitas causas: erros ne l cumpilador, erros na eilaboraçon de l porgrama a ser cumpilado, erros ne l'ambiente (hardware, sistema ouperacional), dados ancorretos, etc. Las tarefas relacionadas al tratamiento d'erros cunsiten an detetar cada erro, reportá-lo al usuairo i possiblemente fazer algun reparo para que l processamiento puoda cuntinar.

Ls erros puoden ser classeficados an erros léxicos, erros sintáticos, erros nun andependientes de cuntesto (semánticos), erros d'eisecuçon i erros de lemite. Ls erros léxicos ocorren quando un token eidantificado nun pertence la gramática de la lenguaige fuonte. Ls erros sintáticos ocorren quando algua strutura de frase nun stá d'acuordo cula gramática, cumo por eisemplo parénteses sin correspondéncia. Ls erros nun andependientes de cuntesto an giral son associados la nó declaraçon d'oubjetos cumo bariables i erros de tipos. Ls erros d'eisecuçon ocorren passado la cumpilaçon, quando l porgrama yá stá sendo eisecutado. Un eisemplo típico ye l de la debison por zero. Ls erros de lemite, ocorren durante l'eisecuçon i stan relacionados las caratelísticas de la máquina na qual l porgrama stá sendo eisecutado, cumo por eisemplo, stouro de pilha.

Alguns cumpiladores ancerran l porcesso de traduçon lougo al ancontrar l purmeiro erro de l porgrama-fuonte. Esta ye ua política de fácele amplementaçon. Cumpiladores mais sofisticados, mas, detetan l maior númaro possible d'erros bisando diminuir l númaro de cumpilaçones.

La recuperaçon d'erros an analisadores sintáticos *top-down* ye mais fácele d'amplementar de l qu'an analisadores *botton-up*. L porblema ye que defrente dun analisador *top-down*, este radadeiro nun sabe quales simblos son sperados na antrada, solamente ls que yá fúrun processados. Puode-se ousar neste causo técnicas cumo, por eisemplo, la técnica de *panic-mode* que percura an tabelas sintáticas an busca de simblos bálidos na antrada. Nesta técnica se çcartan simblos de l'antrada até qu'un delimitador (cumo un punto i bírgula, por eisemplo) seia ancontrado. L'analisador apaga las antradas de la pilha até qu'ancontre ua antrada que permita que l porcesso d'análeze prossiga an delantre.

## Ber tamien
* Ciéncia de la cumputaçon
* Cumpilador Just in Eiquipa (JIT)
* Lenguaiges formales
* Lenguaige de porgramaçon
* Anterpretador
* Linker

## Notas


## Bibliografie
* 
* 
* 
* 
* 
* 
* 
* 

## Ligaçones sternas

* 
* 
*