Fases Da Compilação
Fases Da Compilação
Fases Da Compilação
.[21] A funo do analisador lxico, tambm denominado scanner, ler o cdigo fonte, caracter a caracter, buscando a separao e identificao dos elementos componentes do programa fonte, denominados smbolos lxicos ou tokens.[22] tambm de responsabilidade desta fase a eliminao de elementos "decorativos" do programa, tais como espaos em branco, marcas de formatao de texto e comentrios.[23] Existem disponveis uma srie de geradores automticos de analisadores lxicos, como por exemplo, o lex. O objetivo dos geradores automticos limitar o esforo de programao de um analisador lxico especificando-se apenas os tokens a ser reconhecidos.[24]
Anlise lxica - A fase de anlise lxica (varredora) tem por objetivo ler o programa fonte e transformar seqncias de caracteres em uma representao interna, denominada itens lxicos. A sada um fluxo do smbolo. As expresses regulares so usadas para definir o smbolo reconhecido por um varredor (ou pelo analisador lexical). Por exemplo, suponha a expresso abaixo, descrita em Pascal: Exp := (A + B) * 1.5; Os itens lxicos contidos nesta expresso, so: Exp, :=, (, A, +, B, ), *, 1.5 e ;. Os itens lxicos a serem reconhecidos pelo analisador lxico so determinados pela gramtica da linguagem-fonte. Deste modo, caso um item lxico no seja definido por esta gramtica, um erro lxico gerado. Por exemplo, suponhamos que uma linguagem s suporte valores inteiros. Ento o valor 1.5 iria ocasionar um erro, o qual dever ser tratado.
Anlise sinttica
Ver artigo principal: Anlise sinttica (computao) A anlise sinttica, ou anlise gramatical o processo de se determinar se uma cadeia de smbolos lxicos pode ser gerada por uma gramtica.[25] O analisador sinttico o cerne do compilador, responsvel por verificar se os smbolos contidos no programa fonte formam um programa vlido, ou no.[26] No caso de analisadores sintticos top-down, temos a opo de escrev-los mo ou ger-los de forma automtica, mas os analisadores bottom-up s podem ser gerados automaticamente.[27] A maioria dos mtodos de anlise sinttica, cai em uma dessas duas classes denominadas top-down e bottom-up.[28] Entre os mtodos top-down os
mais importantes so a anlise sinttica descendente recursiva e a anlise sinttica preditiva no-recursiva. Entre os mtodos de anlise sinttica bottom-up os mais importantes so a anlise sinttica de precedncia de operadores, anlise sinttica LR cannico, anlise sinttica LALR e anlise sinttica SLR.[25] Existem disponveis uma srie de geradores automticos de analisadores sintticos,[29] como por exemplo, o Yacc, o Bison e o JavaCC. Anlise Sinttica - responsabiliza-se por traduzir os Tokens, e descobrir a relao de uns com os outros. Se voc escreve writeln, um espao, e um identificador, seu programa passar pela anlise lxica (writeln e identificador existem), mas no passar pela anlise sinttica, que informa a necessidade de um abre-parnteses logo aps esta procedure.
Anlise semntica Ver artigo principal: Anlise semntica As anlises lxica e sinttica no esto preocupadas com o significado ou semntica dos programas que elas processam. O papel do analisador semntico prover mtodos pelos quais as estruturas construdas pelo analisador sinttico possam ser avaliadas ou executadas.[30] As gramticas livres de contexto no so suficientemente poderosas para descrever uma srie de construes das linguagens de programao, como por exemplo regras de escopo, regras de visibilidade e consistncia de tipos.[31] papel do analisador semntico assegurar que todas as regras sensveis ao contexto da linguagem estejam analisadas e verificadas quanto sua validade. Um exemplo de tarefa prpria do analisador semntico a checagem de tipos de variveis em expresses.[32] Um dos mecanismos comumente utilizados por implementadores de compiladores a Gramtica de Atributos, que consiste em uma gramtica livre de contexto acrescentada de um conjunto finito de atributos e um conjunto finito de predicados sobre estes atributos.[33] A anlise semntica - analisa a rvore sinttica para a informao context-sensitive, gerada pelo analisador sinttico em busca de inconsistncias semnticas. Uma das tarefas mais importantes a verificao de tipos, ou anlise de contexto. nesta fase que so detectadas, por exemplo, os conflitos entre tipos, a ausncia de declaraes de variveis, funes e procedimentos.
Exemplo de cdigo de trs endereos e um DAG correspondente para uma expresso aritimtica Ver artigo principal: Gerao de cdigo
Na fase de gerao de cdigo intermedirio, ocorre a transformao da rvore sinttica em uma representao intermediria do cdigo fonte. Esta linguagem intermediria mais prxima da linguagem objeto do que o cdigo fonte, mas ainda permite uma manipulao mais fcil do que se cdigo assembly ou cdigo de mquina fosse utilizado.[34] Um tipo popular de linguagem intermediria conhecido como cdigo de trs endereos.[35] Neste tipo de cdigo uma sentena tpica tem a forma X := A op B, onde X, A e B so operandos e op uma operao qualquer. Uma forma prtica de representar sentenas de trs endereos atravs do uso de qudruplas (operador, argumento 1, argumento 2 e, resultado). Este esquema de representao de cdigo intermedirio preferido por diversos compiladores, principalmente aqueles que executam extensivas otimizaes de cdigo, uma vez que o cdigo intermedirio pode ser rearranjado de uma maneira conveniente com facilidade.[36]Outras representaes de cdigo intermedirio comumente usadas so as triplas, (similares as qudruplas exceto pelo fato de que os resultados no so nomeados explicitamente) as rvores, os grafos acclicos dirigidos(DAG) e a notao polonesa.[37]
A fase de gerao de cdigo intermedirio - permite a gerao de instrues para uma mquina abstrata, normalmente em cdigo de trs endereos, mais adequadas a fase de otimizao. Esta forma intermediria no executada diretamente pela mquina alvo.
Optimizao de cdigo A Otimizao de cdigo a estratgia de examinar o cdigo intermedirio, produzido durante a fase de gerao de cdigo com objetivo de produzir, atravs de algumas tcnicas, um cdigo que execute com bastante eficincia.[32] O nome optimizador deve sempre ser encarado com cuidado, pois no se pode criar um programa que leia um programa P e gere um programa P equivalente sendo melhor possvel segundo o critrio adotado.[23] Vrias tcnicas e vrias tarefas se renem sob o nome de Optimizao. Estas tcnicas consistem em detectar padres dentro do cdigo produzido e substitu-los por cdigos mais eficientes.[36] Entre as tcnicas usadas esto a substituio de expresses que podem ser avaliadas durante o tempo de compilao pelos seus valores calculados, eliminao de sub-expresses redundantes, desmembramento de laos, substituio de operaes (multiplicao por shifts), entre outras.[32] Uma das tcnicas de optimizao mais eficazes e independente de mquina a otimizao de laos, pois laos internos so bons candidatos para melhorias. Por exemplo, em caso de computaes fixas dentro de laos, possvel mover estas computaes para fora dos mesmos reduzindo processamento.[38]
A fase de otimizao - analisa o cdigo no formato intermedirio e tenta melhor-lo de tal forma que venha a resultar um cdigo de mquina mais rpido em tempo de execuo, usando as rguas que denotam a semntica da linguagem-fonte. Uma das tarefas executadas pelo otimizador a deteco e a eliminao de movimento de dados redundantes e a repetio de operaes dentro de um mesmo bloco de programa.
Gerao de cdigo final Ver artigo principal: Gerao de cdigo A fase de gerao de cdigo final a ltima fase da compilao. A gerao de um bom cdigo objeto difcil devido aos detalhes particulares das mquinas para os quais o cdigo gerado. Contudo uma fase importante, pois uma boa gerao de cdigo pode ser, por exemplo, duas vezes mais rpida que um algoritmo de gerao de cdigo ineficiente.[36] Nem todas as tcnicas de optimizao so independentes da arquitetura da mquina-alvo. Optimizaes dependentes da mquina necessitam de informaes tais como os limites e os recursos especiais da mquina-alvo a fim de produzir um cdigo mais compacto e eficiente. O cdigo produzido pelo compilador deve se aproveitar dos recursos especiais de cada mquinaalvo.[32] Segundo Aho, o cdigo objeto pode ser uma sequncia de instrues absolutas de mquina, uma sequncia de instrues de mquina relocveis, um programa em linguagem assembly ou um programa em outra linguagem.[39] A fase de gerao de cdigo - tem como objetivo analisar o cdigo j otimizado a gerar o um cdigo objeto definitivo para uma mquina alvo. Normalmente este cdigo objeto um cdigo de mquina relocvel ou um cdigo de montagem. Nesta etapa as localizaes de memria so selecionadas para cada uma das variveis usadas pelo programa. Ento, as instrues intermedirias so, cada uma, traduzidas numa seqncia de instrues de mquina que realizam a mesma tarefa.
Tratamento de erros
Tratamento de erro de execuo em uma aplicao Java no Elipse O tratamento de erros est voltado a falhas devido a muitas causas: erros no compilador, erros na elaborao do programa a ser compilado, erros no ambiente (hardware, sistema operacional), dados incorretos, etc. As tarefas relacionadas ao tratamento de erros consitem em detectar cada erro, report-lo ao usurio e possivelmente fazer algum reparo para que o processamento possa continuar.[40] Os erros podem ser classificados em erros lxicos, erros sintticos, erros no independentes de contexto (semnticos), erros de execuo e erros de limite.[41] Os erros lxicos ocorrem quando um token identificado no pertence a gramtica da linguagem fonte. Os erros sintticos ocorrem quando alguma estrutura de frase no est de acordo com a gramtica, como por exemplo parnteses sem correspondncia. Os erros no indepenentes de contexto em geral so associados a no declarao de objetos como variveis e erros de tipos. Os erros de execuo ocorrem aps a compilao, quando o programa j est sendo executado. Um exemplo tpico o da diviso por zero. Os erros de limite, ocorrem durante a execuo e esto
relacionados as caractersticas da mquina na qual o programa est sendo executado, como por exemplo, estouro de pilha.[41] Alguns compiladores encerram o processo de traduo logo ao encontrar o primeiro erro do programa-fonte. Esta uma poltica de fcil implementao. Compiladores mais sofisticados, porm, detectam o maior nmero possvel de erros visando diminuir o nmero de compilaes.[42] A recuperao de erros em analisadores sintticos top-down mais fcil de implementar do que em analisadores bottom-up.[43] O problema que diferente de um analisador top-down, este ltimo no sabe quais smbolos so esperados na entrada, somente os que j foram processados. Pode-se usar neste caso tcnicas como, por exemplo, a tcnica de panic-mode que procura em tabelas sintticas em busca de smbolos vlidos na entrada.[43] Nesta tcnica se descartam smbolos da entrada at que um delimitador (como um ponto e vrgula, por exemplo) seja encontrado. O analisador apaga as entradas da pilha at que encontre uma entrada que permita que o processo de anlise prossiga em diante.[44]