Você está na página 1de 18
IVAN RICARTE INTRODUCAO ~ A COMPILACAO 0 -CAMPUS Capitulo O compilador na visao do usuario As aplicagdes computacionais esto cada vez mais presentes no cotidiano mo- demo, ndo apenas nos jé tradicionais computadores de mesa mas também na forma de software embarcado nos mais diversos equipamentos, de avides a eletrodomésticos. Afora as diferengas de capacidade ¢ velocidade de proces- samento, os processadores presentes em todas essas aplicagdes tém essencial- mente a mesma estrutura. O que traz essa possibilidade de diversificar 0 universo de aplicagdes é o desenvolvimento de software que é executado no processador, Este capitulo apresenta a visdo que um usuério tem do programa que é es- sencial para obter esse grau de flexibilidade no desenvolvimento de software — © compilador. O restante do livro apresenta a estrutura e a forma de operaco interna desse programa em detalhes. 1.1 Compiladores na programagao A grande motivacdo que catalisou o desenvolvimento de compiladores foi a de- manda por uma maior eficiéncia de programagao. O surgimento de computa- dores com diferentes arquiteturas e instrugGes distintas logo mostrou como era ineficiente o esforgo de desenvolver aplicagdes para cada plataforma. Cada mé- quina era Unica, ndo apenas no seu conjunto ou jogo de instrugdes mas também na forma como os dados eram representados. Cada comando que fosse desejado na especificagao do problema demandava que a implementago fosse desenvol- vida de modo particular para cada méquina. 2+ Introdugao a Compilagao ELSEVIER A situagdo de entdo € ilustrada na Figura 1.1, para o caso de uma tinica instrugao de soma. De maneira muito simplificada, essa figura mostra bem qual era a situagdo real em meados da década de 1950, uma época em que ainda havia poucos computadores e nada que se aproximasse do conceito de uma familia de processadores. Passar uma aplicago de uma maquina para outra demandava que uma nova implementagio fosse realizada, em geral por um outro programador, Figura 1-1 A programacao antes dos compiladores VY Programador ‘Computador X 000 Load A / x Add B ‘ pragfamador [208 8 Compuaaary SS! ) (\ 0 L095. eo 200.5 / °02 SUMABLC ? Programador La Computador Z 7 A situacao ilustrada para uma Gnica instruggo nessa figura tinha sua com- plexidade muito aumentada quando se consideram que aplicagSes inteiras pas- savam por esse process. Na auséncia de linguagens comuns que permitissem expressar a especificago de forma independente da implementago na maquina, cada realizagdo do cédigo dependia da intervenco do humano que fosse espe- cialista naquela plataforma. Claramente, uma situagdo pouco eficiente e de alto custo para as empresas A soluc&o passava por buscar mecanismos que permitissem a “programacio automética”, ou seja, que traduzissem especificagses genéricas, independentes de maquina, para cédigo que pudéSe ser efetivamente executado nos diferentes processadores. Essa proposta ¢ ilustrada na Figura 1.2. Pelo que sevé na figura, POSE TEEURaT RICANS ONS SEE e ecor © prog de ma inter, mais r He volvin grande ow not da pro 1.4.1 Os prc jogod dor po 08 pas O proc execug Ca esto z simbél ELSEVIER Q compilador na visio do usuario i {Tradutor | Programador zi genérico L | SUM A,B,C © economia na producio. A @HSiSHprOdutividadelSeH® decorrente do fato de © programador trabalhar com comandos de nivel mais alto que a linguagem de maquina, sem ter de se preocupar com detalhes de instrugdes e operacdes ftermediatia®. A economia na produgao decorreria do fato de que nao seria mais necessério manter programadores para cada tipo de maquina. Hoje, mais de cingtienta anos depois dessa concepeo que originou o desen- volvimento de compiladores, a situacao ainda esté longe de ser ideal. H4 uma grande diversidade de linguagens de programagao e ainda ha especialistas numa ou noutra linguagem. Mas, certamente, sem compiladores 0 desenvolvimento da programacio estaria num estdgio muito mais primitivo do que o atual 1.1.1 A linguagem dos processadores Os processadores executam seqiiéncias de comandos que fazem parte de um jogo de instrugées definido pelos seus projetistas. Um programa de computa- dor pode ser comparado a uma receita culinéria, quc indica os ingredientes € josypassosyclementares @ue devem ser seguidos) para desempenhar uma tarefa 0 ‘processaddt, componente principal de um computador, € o (@SpOnSAvEl Bele execucdo dessas instrugées. Cada processador tem seu jozo de (HSMUgOENERpEEIRED? A essas instrugies estao associadas duas representagdes: a linguagem de maquina ¢ a linguagem SiiiBblica) A dinguagem de imaquinalde um processador é Tepresentada pela 4+ Introdugdo & Compilagao ELSEVIER SEAUCCIATAETDIES (ETON CUMS) ue representa CadaliMstIGAD, com sua operacao e seus dados. Otbit, um neologismo criado na lingua inglesa para um @ipit@ bindrio, ou seja, de apenas dois valores, ¢ a unidade de informacao utilizada (PelSS|COMPULAUSTES digitais. Efetivamente, pela manipulagao de bits que o} computador processa toda informagao, por meio de sinais elétricos que assumem, apenas dois niveis distintoS. Em dltima anélise, todo e qualquer programa que executa em um computador € representado por uma seqiiéncia de instrucées em linguagem de méquina, ou seja, uma seqiiéncia de bits. E essalgequencia de bits que, passada ao processador, determina a ativagao dos sinais que comandarko ‘a execugao da operacdo. No nivel dos circuitos eletrOnicos,/a operacao de um computador € a tradugdo (ou decodificacdo) dessas seqtiéncias de bits em agdes que devem ser desempenhadas pela CPU (a unidade central de processamento dos computadores) e circuitos adjacentes para a execugao de cada instrucao. mai A titulo de ilustragao, considere um processador hipotético representado de forma muito simplificada na Figura 1.3. Esse processador tem quatro registra- dores de dados, usados como rea de armazenamento tempordrio para os dados envolvidos na execuco das operagbes. Outros registradores que so essenciais para a operacdo do processador, como o registrador de instrugdes (que armazena a instrugio que é executada), 0 contador de programas (que armazena o ende- rego da préxima instrugdo que deve ser executada) e 0 registrador de controle (que armazena 0 estado associado ao resultado da iltima execugo), nao so apresentados nessa figura. Esse processador é provavelmente um processador de 8 bits, pois essa é a dimensao do seu barramento de dados (bits DO a D7). Sua capacidade de enderecamento de meméria € de 16 posigdes, pois tem qua- to linhas de enderego (bits AO a A3); com quatro bits é possivel representar 2* = 16 valores diferentes. igura 1.3 Arquitetura de um processador hipotético pprocessador Le SI Al dey val ope par des Par ed 10 ope ope inst sim ee ao zito ada eo rem que em bits wo, um oes 2nto ELSEVIER © compilador na viséo do usuério + 5 Considere que os projetistas desse processador tenham incorporado os cir- cuitos para realizar quatro operagées: LOAD pura transferir 0 contetido de uma posi¢ao de meméria para um regis HBGED Por exemplo, a instrucio LOAD 10,1 é usada para carregar 0 contetido da posigao 10 de memoria para o registrador R1; STORE para transferir o contetido de um registrador para uma posigao de me- GGA Por exemplo, a instrugio STORE R2, 5 € usada para transferir 0 contetido do registrador R2 para a posigéo 5 de meméria: ADD para adicionar o contetido de dois registradores ¢ armazenar 0 resultado EMPGUADEEISATED Por exemplo, a instrugio ADD Ri, R2,R3 somao contetido de R1 a R2 ¢ coloca o resultado em R3; BZERO para mudar o contetido do contador de programas para a posi¢éio de mem6ria especificada se 0 contetido do registrador indicado for igual a ZO) Por exemplo, a instrugdo BZERO R3, 7 define que 0 contador de programas seré alterado para o valor 7 somente se 0 contetido de R3 for igual a zero. Cada instrucdo desse processador precisa registrar qual € a operagao que deve ser realizada. Como so quatro operagdes e cada bit pode assumir dois valores, s0 necessdrios dois bits (pois 2” = 4) para representar cada c6digo de operagao. Neste exemplo, imagine que os projetistas designaram os cédigos 00 para LOAD, 01 para STORE, 10 para ADD ¢ 11 para BZERO. Além do cédi de operacdo, é preciso registrar na instrugo quais so os operandos envolvidos. Para tal fim, so usados quatro bits para representar uma posi¢ao de meméria e dois bits para identificar o registrador (por exemplo, 00 para RO, 01 para R1, 10 para R2 e 11 para R3). Como os operandos sio trés registradores para a operacio ADD ou um registrador e uma posigdo de meméria para as demais operagdes, seis bits so necessérios para representar os operandos. Assim, uma instrugdo pode ser completamente representada por uma seqtiéncia de oito bits Considere o seguinte programa, representado inicialmente em linguagem simbélica, que soma 0 contetido da posicao 10 com o contetido da posigao 11 € armazena 0 resultado na posicao 12: 10, RL 11, R2 RL 6 - Introdugio & Compilacao __ ELSEVIER ELs Por exemplo, para a instrugao LOAD 10, R1, 0 cédigo em linguagem de ma- quina comeca com a seqiiéncia de bits que identifica a operacdo, 00; € seguido pelo endereco de meméria, valor 10 em decimal, cuja representagao bindria é 1010; ¢ termina com a identificacdo do registrador, R1, identificado pelo valor bindrio 01. Assim, o cédigo completo da instrugao € 00101001. Da mesma forma, pode-se obter 0 cédigo para as demais instrugdes. Desse modo, o programa tem a seguinte representagao equivalente em cédigo de mé- quina: 00101001 00101110 10011000 01001100 Claramente, seria muito desconfortavel e pouco produtivo se os programa- dores tivessem de desenvolver cada uma de suas aplicagdes escrevendo 0 cédigo em linguagem de maquina. Os programadores nao trabalham diretamente com a representaciio binéria das instrugdes de um processador, mas sim com represen- tacdes simbélicas mais abstratas, (QS ugeHSimiSea Seca mime “nivel de abstragdo ao representar as mesmas instrugGes por meio de textos. | muito mais facil para um ser humano escrever e entender um programa com instrugGes na forma textual, como MOVE 11, R2, do que com 0 cédigo bindrio equivalente, como 01101110. Jd para o processador, o formato bindrio ¢ 0 formato natural. Embora seja possivel que (GRORPaimacores GESenvGlvanilsofeware utilizando EPCHAS TH inGABEANTSMUOLICR WE Ui processAdOH esse nao ¢ o procedimento usual, Dois so os principais olives para que issOMHAG[COHA. O primeiro é 0 Geo lnivelGebStragaOldessa linguagem) Apesar de ter um(MIVEIMETADSHACAD) maior que a linguagem de méquina, a linguagem simbélica ainda representa as ‘operagoes e caracteristicas de cada processador de forma diferente, Por ainda estar to proxima do nivel dos circuitos, qualquer operaco um pouco mais com- plexa demandaria um grande esfétco de programago, com grande possibilidade de introdugio de defeitos no cédigo. O segundo motivo é@faliaae/portabilidad® — passar uma aplicagao j4 desenvolvida para um processador para um outro processador exige que todo 0 programa seja codificado novamente, na nova lin guagem. Por outro lado, por permitir que o programador trabalhe diretamente com as instrugdes do processador, @liniguageni|simbolicayequswalmenteyatili- zad uma 1.4 Aal ‘guag alto bolic tradt dese se pr exec E texte port usad sado com F daq Por ¢ nome alten Vv tintas emu oper vime para com mitag deser E ser de 8031 em cc génci buido srama- 26digo coma resen- imeiro tos. E a.com sindrio jo 60 izando mento iro é0 strago onta as > ainda scom- ilidade ilidade 1 outro wva lin- amente e utili- ELSEVIER © compilador na visio do usuario - 7 zada para a programacio de fragmentos de cédigo nos quais € essencial obter uma alta velocidade de execucio. 1.1.2 Linguagens de alto nivel .\ alternativa para solucionar os problemas associados A programagao em lin- guagem simbélica € criar as descrigdes dos programas com uma linguagem de alto nivel, Fssas linguagens tem nivel de abstracao maior que as linguagens sim- Bolicas + maior nivel de abstracdo significlM@HOSUSEINES e, nesse caso, isso ‘raduz-se)@mn independencia ein relagao 40 processado Quando o programador desenvolve uma aplicag3o com uma linguagem como Pascal, C ou Java, ele no se preocupa de antemiio em saber qual é 0 processador no qual o programa sera executado. Em linguagens de alto nfvel, @i)imistnugoes Sao expieseas nalfonnaldeluin TEKUOYGUENINGEPEHAETUCIPOCESSAUGR Esse texto, o cOdigo-fonte, é COPOSD por uma combinacao de palavras e expressGes que se aproximam mais daquelas usadas na linguagem humana do que daquelas usadas para comandar 0 proces- Sado? OGbjetivo €facilita® para os programadores, iS\tarSPASyeSIEXpTESSAGS comandos de um novo programa e de compreender os programas existentes. Por razies histéricas. a lingua inglesa foi adotada como a linguagem humana da qual os comandos das linguagens de computador deveriam se aproximar. Por esse motivo, usualmente os comandos de uma linguagem de alto nivel tém nomes como if ou while, termos em inglés para denotar, respectivamente alternativa (se) e repeticZo (enquanto). Varias linguagens de alto nivel esto dispontveis em diversas méquinas dis- tintas. Por exemplo, a linguagem de programagao C foi criada para execugao em um minicomputador da Digital Corporation, modelo PDP-8, com o sistema operacional Unix. Essa mesma linguagem € utilizada atualmente no desenvol- vimento de aplicagdes para computadores pessoais, para dispositivos portateis, para computadores de grande porte e para sistemas de processamento paralelo, com uma grande diversidade de sistemas operacionais. Afora os recursos ou li- mitag6es inerentes a cada plataforma, a mesma linguagem C é¢ utilizada para 0 desenvolvimento em todas essas plataformas. Em geral, cada linguagem de alto nivel teve uma motivagio diferente para er desenvolvida. Basic foi desenvolvida para ensinar principios de programa- io; Pascal, para o ensino de programacdo estruturada; Fortran, para aplicagoes em computacao numérica e cientifica; lisp e Prolog, para aplicagdes em inteli- géncia artificial; Java, para o desenvolvimento de software embarcado ¢ distri- buido; Ce C+, para a programacdo de sistemas, 8 - Introdugao a Compil ELSEVIER No entanto, 0s (GROCESSAGORESNEOIEMENGER cssas (iiBUABENS We /aO MAE Varios esforcos foram feitos para criar processadores que pudessem interpretar diretamente instrucées de uma linguagem de alto nivel, mas a conclusiio sempre foi que os processadores so muito mais eficientes na execugdo de c6digo em linguagem de maquina. Assim, € preciso que a descri¢do de um programa numa linguagem de alto nivel seja traduzida para o cédigo em linguagem de maquina do processador que ir exechtar o programa: O importante é que essa traducao seja bem feita, para que 0 cédigo gerado seja eficiente. Esse processo de tra- dugao de um cédigo de computador de um formato para outro ocorre muitas € muitas vezes, em alguns casos até mesmo de forma transparente para o usuario. Assim acontece quando um programa em C, por exemplo, é transformado em um c6digo executivel expresso em linguagem de maquina. O compilador ¢ o programa de sistema que traduz um programa descrito em uma linguagem de alto nivel para um programa equivalente em outra lingua- gem, como o c6digo de méquina para um processador. Programas de sistema so aqueles quo\fazem eom que os outros programas funicionem) (Esses outro’ programas (GOdehi) Ser OULOS|PORaMASTUETSISEEMG, como iStERTES|OPERACIOD nais, montadores, carregadores, ligadores, ou podem ser programas de aplica- <0, como editores, planilhas ¢ bancos de‘dadloS)Enquanto programas de apli- ‘cacao tém como dados textos ou niémeros, programas Ue sistema manipulam ‘outros programas como seus dados. © primeiro compilador completo para uma linguagem de programacio foi criado em meados da década de 1950 para a linguagem Fortran [Backus. 1948]. No entanto, muitas das ferramentas ainda hoje em uso para a construgao de compiladores ¢ de tradutores de linguagens de uma forma geral foram criadas no escopo do desenvolvimento do sistema operacional Unix e da linguagem de programagao C, no inicio da década de 1970. Desde entio, essas ferramentas ganharam implementagdes mais eficientes ¢ foram disponibilizadas para outras linguagens de programacio. Para ilustrar como um prograié'de alto nfvel isola os detalhes do processa- ‘mento envolvido na execucdo, as quatro instrugdes do programa em linguagem simbélica da seco anterior seriam provavelmente o resultado de uma linha de sain [programa em linguagem de laltoinivell=- por exemplo,€m C? ELSEY Co © prog linha c O que traduga de prog traduzin guager naturez tages ¢ transfor ha simi 1.24 Uma ap princip: formagi format de infor a dispor utilizads para rep ELSEVIER 9 nivel. pretar empre soem numa quina dugdo le tra- titas € uério, Jo em toem ngua- stema outros racio- plica- > apli- pulam 40 foi 1998} fo de riadas em de nentas outras cessa- uagem tha de O compilador na visio do usudrio Como GfAlG ikea las Waniaveis lusadasldeveMmiserdeclaradas) na verdade © programa deveria conter também uma linha com essas declaragdes antes da linha com a soma: t a, b,c O que ocorre na (GHGuGaOdessas linhas GRBO SMNeUAseIC NARS cédigo em linguagem simbélica é um processamento que envolve a leitura do programa em linguagem de alto nivel (0 c6digo-fonte) ¢ a escrita de um pro- ‘@rama equivalente em linguagem simboliea, Entre ler um programa e escrever 0 ‘outro. 0 compilador ter de desempenhar muitas tarefas: criar uma representa- ‘¢do interna a partir do programa de entrada, verificar a corre¢ao dos comandos, verificar a aderéncia as regras da linguagem e transformar a representagao in- tena num formato adequado a safda desejada. 1.2 Compiladores no processamento da informacao que esta envolvido na atividade de um compilador é, de maneira ampla, a traducdo de uma especificagao em outra. Apesar da origem no desenvolvimento de programas executéveis, as mesmas tarefas que um compilador realiza para traduzir um programa em linguagem de alto nivel para um programa na lin- guagem de maquina séo também realizadas para processar informacao de outra natureza. Um exemplo cada vez mais presente € a transformagao de represen- tages de informagao de um formato para outro. Mesmo que nem sempre essas transformagées recebam o nome de “compilagao”, nao € dificil perceber como ha similaridades entre elas. 1.2.1 Processamento de arquivos XML Uma aplicagao cada vez mais presente no cotidiano de quem usa computadores, principalmente na navegacao pela World Wide Web, € 0 processamento de in- formagGes em arquivos na linguagem XML (Extensible Markup Language). De forma transparente para 0 usuério final, arquivos XML sAo utilizados para troca de informagées entre clientes e servidores e constituem a base tecnolégica para a disponibilizacao de servigos por meio da Web. Em outros contextos so muito utilizados para armazenar informagSes de configuragdo de aplicagdes ¢ também para representar textos estruturados. 10 + _Introdugao & Compilagao ELSEVIER A informagao em um arquivo XML, embora possa ser lida por seres hu- manos, est4 14 para ser processada e traduzida para outro formato — para a execuco de uma tarefa num servidor, para definir a interface de uma aplica- ¢40 ou para produzir um texto que possa ser impresso, por exemplo. Em todas essas siluagdes, a traduco de uma especificacio genérica para um formato que possa ser utilizado pelo computador esté presente e remete as mesmas atividades presentes na compilagao de um programa Essencialmente, 0 contetido de um arquivo XML esté organizado em uma hierarquia de elementos, com cada elemento delimitado por marcagdes. Mar- cagdes em XML sio reconhecidas por estarem entre colchetes angulados, <> Por exemplo, o seguinte fragmento de informacdo poderia ser encontrado num arquivo XML contendo dados sobre livros: titulo>Dom Casmurr e>Machado de Assis 1900 Nesse fragmento hé um elemento Livro, que tem em seu contetido trés outros elementos. Esses elementos, por sua vez, tém texto como contetido. Ele- mentos podem conter outros elementos, texto, ambos ou ainda ser vazios. Esse é um exemplo de informacZo estruturada. Apesar de ser evidente para um ser humano qual é a informacdo que esté ld presente, a informacio esta 14 para ser processada por uma maquina. Um dos atrativos de XML, que € respon- sdvel por boa parte da sua popularidade entre muitas aplicagées, esté exatamente no fato de que a estrutura é genérica o suficiente para servir para qualquer aplica- 40. Ela pode ser utilizada para alimentar a informacdo em um banco de dados, pode também ser utilizada para criar um indice impresso ou ainda para gerar uma pagina a ser exibida na Web. Todo arquivo XML deve obedecer a algumas regras sintéticas fundamentais, independentemente de qual seja a aplicagao ou a interpretacdo que serd feita do arquivo. Sao as chamadas-retas de boa formacao de XML: 1. Todo documento XML deve ter um tnico elemento que sirva como raiz para todos os demais elementos do documento; 2. Todo elemento deve ter a marcacdo de infcio e a marcagio de final; ele- mentos vazios podem ser representados com uma tinica marcacdo na forma < ELSEVIER u 1a visdo do usuério 3. Dois elementos ndo podem estar entrelagados no documento; 4, Elementos podem ter atributos, representados entre aspas na marcagao de inicio do elemento; Nomes de elementos devem comegar com letras ou 0 caractere de subli- nhado podem conter, além deles, ntimeros, hifens e pontos. ‘Um analisador de contetidos XML, o equivalente a um compilador para esse tipo de arquivo, analisa pelo menos se 0 contetido do arquivo obedece a essas regras Além dessas regras basicas € genéricas para qualquer arquivo em formato XML, é possivel ter uma descri¢o de como os elementos de um arquivo es- pecifico para um tipo de aplicagdo devem estar organizados. Isso é necessério quando 0 computador precisar realizar alguma aco a partir do contexido do ar- quivo XML — é preciso garantir que toda a informacdo necesséria para essa realizaco esteja corretamente especificada. Nesse caso, 0 analisador pode rea- lizar, além da verificagao sintatica basica, uma verificacio de que o documento estd de acordo com esse modelo. Nesse aspecto, 0 processamento de um arquivo XML aproxima-se muito da compilagao. Ha uma fonte tnica para os dados — naquele caso, um programa em linguagem de alto nivel; aqui, informagdes no formato XML. O proces: mento que € realizado com esse arquivo envolve a anélise do contetido, para verificar sua aderéncia &s regras da linguagem, e pode gerar safdas diferencia- das — na compilagao de programas, arquivos com cédigos em linguagem de maquina que podem ser executados em diferentes processadores; no processa- mento XML, transformagdes ou aces de acordo com a aplicagao. Para que isso seja possivel, € preciso que a aplicagdo leia o arquivo XML, verifique que ele est correto, crie uma representaco interna da informaco que ele contém € possa gerar a saida no formato desejado. Nao muito diferente do que faz um compilador para uma linguagem de programacio. 1.2.2 Paginas dinamicas na World Wide Web Paginas na World Wide Web sao disponibilizadas a partir de um servidor, que atende a solicitagdes de clientes — tipicamente, um programa navegador Web no qual o usuario selecionou uma pagina para exibicdo, seja pela especificacao de um enderego, seja pela selegao de uma ligacdo (um link) numa pagina jé exibida. Quando o servidor tem a pagina com seu contetido jé definido, seu 12 + Introdugao a Compilagio linico trabalho é ler 0 arquivo correspondente do seu disco e transferi-lo para 0 cliente que fez a solicitagao. Paginas dinamicas, por outro lado, nao tém esse contetido pronto. O servi- dor deve criar esse contetido a partir de um gabarito, ou seja, de uma pagina com lacunas que devem ser preenchidas no momento em que o usuario solicita a pagina. Embora inicialmente no fosse assim, atualmente 0 processamento de paginas dinamicas na Web pode ser visto como um caso particular do pro- cessamento XML. Em vez de comandos genéricos definidos para cada imple- mentacao de servidor, 0 usual atualmente é utilizar uma linguagem de marcacao baseada em XML para definir agdes que devem ser executadas para preencher as lacunas, Um exemplo de uma linguagem desse tipo 6 JSP (Java Server Pages), que trabalha em um servidor que permite a execugo de comandos na Tinguagem Java. No momento da execugdo, no atendimento a uma solicitagao do cliente, 0 processamento do elemento XML que corresponde a um elemento JSP dé inicio um processamento, cujo resultado € agregado & pagina que esté sendo gerada, O resultado final € uma pagina em HTML (Hypertext Markup Language), a linguagem apropriada para exibigao de contetidos em um navegador Web. Considere, por exemplo, como seria a criagdo de uma pagina dinamica espe- cificada em uma linguagem hipotética, a CSP (de C Server Pages). A estrutura de um arquivo desse tipo é tipicamente: <@ finclude ... %> <& // cédigo C ... Contetdo em HTML com <$= cédigo C 4> Como um documento XML, essa especificaco obedece a todas as regras de boa formagdo. A pagina CSP contém diretivas que sdo usadas para criar um programa em C+ que gera'a Fésposta, em HTML, para a solicitacao a ela enca- minhada, Essas diretivas podem ser instrugdes para o pré-processador C, entre <@ e &>, que so incluidas no inicio do arquivo-fonte gerado; cédigo-fonte em Ca ser inserido no arquivo-fonte, entre <% e %>; texto a ser repassado literal- mente para a pagina HTML a ser gerada, exceto por fragmentos de cddigo que podem ser utilizados para obter valores de varidveis, entre <= e &> earo i q o liv si ta er 'zl ter cor est pel ser EVIER para o » servi- pagina solicita amento do pro- imple- arcagdo eencher 2s), que guagem liente, 0 ld inicio gerada. uage), a 2b. ca espe- ostratura, as regras eriar um) ela enc: rC, entre -fonte em do literal- 6digo que a visio do usuario - 13 ELSEVIER © compilador Como se pode observar, também nesse caso hé uma tradugdo de uma espe- cificagdo com um alto nivel de abstracdo (as diretivas da linguagem) para uma representacao equivalente, de nivel de abstiagao mais baixo (0 cédigo em C++) e que pode ser interpretada pela maquina — nesse caso, compilada e depois executada para gerar a resposta em HTML. 1.3 Atividades de um compilador Independentemente de qual seja a linguagem de alto nivel que © compilador rd traduzir © de qual seja 0 processadon que € o alvo dessa traducao, {0d0s 8S: compiladores executam algumas tarefas comuns. Nas aplicacdes de programacao, o ¢ompiladom Fese6s ]comi0 entrada uma quivo com uma especificagao em linguagem de alto nfvel, o c6digo-fonte, e gera como safda um outro arquivo com o programa equivalente em linguagem simbo- Jicajdo processador da plataformade destino, Nesse caso, um outro programa, ‘9 montador (ou assembler), € ulilizado para traduzir 0 cédigo em linguagem simbélica para 0 c6digo de maquina. Nos outros tipos de aplicagées apresentados, também hé a necessidade de tarefas similares — a leitura e o reconhecimento de formato de um arquivo de entrada e a geracdo de uma informagio equivalente num outro formato. 'A Figura 1.4 expande essa visto um pouco mais, ao apresentar algumas caracteristicas internas da operac4o de um compilador. Figura 1.4 Estratura interna de um compilador aaa [ Arquivo de corigem snares |A entrada para o compilador é um arquivo de texto, que serd lido carac- tere a caractere para compor a estrutura do programa, uma descri¢ao interna do compilador que permitiré a geracdo de um c6digo equivalente. A criacao dessa estrutura ¢ Festiltado da etapa da andlise do cédigo de origem. Durante a andlise, pelo menos duas tarefas basicas sdo realizadas e, em geral, tratadas de forma separada. 14 - Introdugao a Compilagio ELSEVIER A primeira tarefa na andlise é a identificacdo, a partir dos caracteres indi- Giduaisy/dos|simbolos|basicosjvalidosjparayaylinguagemaEm uma linguagem de programacio, $80 0s nomes de comandos, nomes de varidveis, nomes de FangSESyICORStAtesydelimitadores> Em um arquivo XML, séo os elementos contetidos textuais, Essa etapa é denominada andlise léxica, e é apresentada em detalhes no Capitulo 3. Com o resultado da anilise 1éxica, o compilador tenta compor, a partir da estrutura de cada um dos blocos bésicos, a estrutura geral do arquivo de en- trada; Em uma linguagem de programacao, 0 objetivo é reconhecer a estrutura do programa a partir de declaracées, definigdes de funcées e suas seqiiéncias de ‘comandos simples ou compostos. Em um arquivo XML, o objetivo é reconhecer ahierarquia de elementos que compéem a informagao completa. Analogamente a0 que se faz na interpretagdo de um texto em linguagem natural, nessa etapa 0 objetivo é entender a estrutura das frases a partir da combinacao das palavras individuais. Por tal analogia, essa etapa, apresentada no Capitulo 4, € conhecida como andlise sintética A etapa de anélise € concluida com a realizagao da anélise semantica, 2s- sunto do Capitulo 5. Como ser4 visto, essa atividade de um compilador tem objetivos bem mais modestos que a correspondente atividade em linguagens naturais e busca verificar a coeréncia entre os fragmentos de c6digos sintatica- mente corretos. ‘A analogia de um programa com um texto em linguagem natural nao se en- cerra nos nomes dessas etapas da andlise. Para que essas duas etapas possam ser realizadas, é preciso que o compilador conheca as regras da linguagem.(Como) saber se um simbolo ou nome de elemento é valido ou néo? Como saber se a ‘ordem dos elementos em um comando ou elemento est correta?’ Para tal fim, © compilador utiliza descrigdes da linguagem organizadas de acordo com uma ‘gramética, com as regras que descrevem 0 que € yalido, 1 gramaticas apro- priadas para a andlise léxica e gramticas apropriadas para a anélise sintética. Gramaticas so descritas em detalhes no Capitulo 2. A partir do momento em que uma estrutura correta € reconhecida, € possfvel gerar a traduedo dessa estrutura na linguagem de destino. I:ssa tradugio nao € feita diretamente a partir da expresso original, mas sim a partir da representagao Galestratura da /expressao (que Toilconstmuidainarandlise. O que seré feito a partir do reconhecimento dessa estrutura claramente depende da aplicacao. ‘Bin unital aplicaga Ge PLORRAEGED) essa atividade de GEARESETISTRR UVES sida. que pode ser tanto na forma de um outro arquivo texto ou um arquivo in4fiG) preparado para ser combinado com outros, éngloba normalmente duas ete na po ba gu sac ent de str seg for po de ent tin av cor no: jar, cla ten TER ELSEVIER O compilador na visao do usuario «15 ndi- gem 3 de ose vem rda en- tura sde ecer ente tapa vras. cida omo sea fim, uma pro- fica. sivel Bo é ago vartir ode {uivo duas etapas. primeira é a gerago de cédigo a partir da estrutura que foi criada na anélise. Como esse cédigo 6 criado a partir das estruturas elementares, € possivel que haja no cédigo gerado, na combinagdo dos segmentos de cédigo basico) muitas possibilidades de melhoria. Tais melhorias s40 buscadas na se- gunda etapa da sintese, que a otimizag sdo apresentadas no Capitulo 6. de cédigo. Essas etapas da sintese 1.3.1. Leitura de arquivo de origem Antes de realizar qualquer tarefa de interpretacdo dos elementos do arquivo de entrada, 0 compilador precisa ler os caracteres de entrada que esto num arquivo de texto, armazenado no disco. Esta seco apresenta os mecanismos oferecidos pela linguagem C++ para realizar essa tarefa bdsica. A manipulagio de arquivos de texto em Ct+ 6 suportada pelo conceito de streams de dados. O termo stream denota um fluxo seqiencial, como aquele seguido pelas 4guas de um riacho. Na computagdo, um stream pode ser uma fonte de dados, a partir da qual o programa recebe um elemento de cada vez, ou pode ser um receptor de dados, para o qual o programa pode enviar um elemento de cada vez. No processamento de dados bindrios, o elemento de transferéncia entre programa ¢ streams é um byte; para arquivos de texto, é um caractere. Para permitir a entrada ou safda de dados a partir de um arquivo no disco, a linguagem C++ especifica um conjunto de classes no arquivo de cabecalho fstream. Os recursos para a leitura de dados a partir de um arquivo sio pro dos pela classe i fst ream. Assim, o cédigo de um programa C++ que manipula dados em arquivos deve conter a diretiva: include arquivo a partir do qual os dados sero obtidos estard associado no cédigo aum objeto da classe i fst ream — um objeto pode ser visto, grosso modo, como uma yaridvel cujo tipo é uma classe. H4 duas formas de especificar 0 nome desse arquivo de forma a associé-lo ao objeto ist ream correspondente. A primeira é por meio de um argumento na propria declaracao do objeto; no jargdio de C+, pela utilizagao do construtor com argumentos para objetos dessa classe. Nesse caso, a linha de cédigo que define o objeto (ara, neste exemplo) tem também o nome do arquivo (por exemplo, learq. cpp): ifsteam arq("earg. cpp") aw f Capitulo Produgao do cédigo executavel O resultado do processo de compilagao é um arquivo contendo um programa em linguagem simb6lica equivalente a0 programa originalmente escrito ein lingu:- gem de IESE) Esse programa em linguagem simbélica COMeMIMEquEhE® de instrucdes mneménicas que representam as operagdes que sdo especificas de (um processador, No entanto, para que esse programa) possa Ser executads ha sinda algumas tansformagSes adicionais pelas quais deve passar. A primeira delas € a ¢HGRLEBEmiipROCESSO pels lg ullo jproeramalemliniguae gem simbélica € transformado em formato bindrio, em cédigo de méquina. O programa fesponsavel por essa transformacdo € © montador. Entretanto, esse processamento ainda nao transforma o programa em cédigo executavel. Fm ge- tal. 0 programa do usudrio utiliza recursos fornecidos por outras rotinas, desen- volvidos por outros — por exemplo., as rotinas para apresentar valores formata- dos na tela desenvolvidas pelos projetistas da linguagem de alto nivel. Assim, ¢ preciso realizar um outro proceso que Gobi 6ssas FOURS adicionalsComIO codigo compilado— ¢ o(processo de ligagho. Finalmente, € preciso que 0 e6- digo seja transferido do disco para a meméria principal para que sua execucdo OSsAliniciar)O médulowesponsavel por essa tarefa 6 (GHREGAORDA Figura 7.1 resume a seqiiéncia de transformagées pelas quais passa 0 programa de sua con- cepedo a sua execugio. A execugao de cada programa se da sob o controle do sistema operacional; cada programa em execugio é denominado um proceso do sistema. Além do cédigo gerado pelo compilador, um proceso necessita de informagdes adicio- nais para o controle de sua execugao. O conjunto dos valores dessas informa associadas a cada programa em execuco constitui o estado do processo. @isis3 214 - Introdugao & Compilagao ‘Figura 7.1 Etapas para a criaglo e a execugao de programa || arquivo tines \ _ Programa | |/ weawo fF [ Méauo ce | | [mew tngsimo A | || esieo f [caregameno| [eeoenals TS V/ eens a Proceso) J at Ld tema operacional é o responsével por gerenciar cada processo no computador. estabelecendo como serd realizada sua execugfo. Ele também atua como un Programa supervisor que estabelece uma camada de controle entre 0 hardware G0 computador © as aplicagdes de usuarios) Uma de suas sfifi@SESIS ESEBEECER uma interface de software uniforme entre 0 computador. outros programas do sistema @ programas de aplicagao de usudrios. Outra fungao fundamental de um sistema operacional éygerenciatsosirecursos\de\ tim Comiplladorue ronal (PromOVEr|SUalEHCieNLE|Utilizagao, Exemplos de sistemas operacionais sio MS- DOS, Windows, OS/2, Linux, FreeBSD e Solaris — estes trés implementagées do sistema operacional Unix. Nas proximas segGes, os demais programas que complementam a tarefa do compilador ¢ realizam as transformagdes necessérias em um cédigo para que ele ossa ser executado sob o controle do sistema operacional sao apresentados de forma breve. 7.1 Interagao do compilador com outros aplicativos Antes de apresentar cada programa individualmente, deve estar claro que a in- vocago desses aplicativos ocorre de forma quase transparente para o usuério do compilador. Na verdads, oque ocorre é que os aplicativos que invocam 0 com- pilador atuam como um gerente que jé invoca, conforme necessario, os demais aplicativos até a produgio do programa executavel. Como exemplo, considere como 0 compilador g++ realiza, além da compilagao propriamente dita, a inte- grago com outros aplicativos do sistema

Você também pode gostar