c:compiladores
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anteriorRevisão anteriorPróxima revisão | Revisão anterior | ||
c:compiladores [2022/08/29 21:35] – imagem Gabriel de Paula Brasil | c:compiladores [2023/01/22 23:05] (atual) – Gabriel Bizio | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Compiladores ====== | ||
+ | Um compilador é um programa que traduz linguagens de programação em linguagem do nível de máquina, com a finalidade de executar uma tarefa/ | ||
+ | ==== História do Compilador ==== | ||
+ | {{ https:// | ||
+ | O primeiro compilador foi criado por [[g: | ||
+ | Rapidamente a ideia de se utilizar um compilador foi se popularizando. Isso se deve ao fato da flexibilidade e eficácia que as linguagens de alto nível conseguiam entregar aos programadores. | ||
+ | |||
+ | ==== Funcionamento ==== | ||
+ | {{ https:// | ||
+ | Geralmente, quando se utliza uma linguagem de alto nível, é notável que ela contém um certo nível de abstração dos comandos com finalidade de facilitar o entendimento humano. Sendo assim, o compilador serve para ler o código escrito pelo programador e converter para uma espécie de código objeto que contém instruções para a execução no microprocessador da máquina. Resumindo, o compilador consegue entender o código da sua linguagem escolhida e converte para uma linguagem que o computador consegue executar, ou seja, códigos binários. | ||
+ | === Fases da Compilação === | ||
+ | Um compilador pode ser dividido em três fases: front end, middle end e back end. | ||
+ | == Front End == | ||
+ | É no front end que ocorrem as análises lexicais, gramaticais e semânticas. Essa fase é responsável por verificar se o código está escrito da forma correta e condiz com a gramática da linguagem. Após as análises o front end produz uma IR( Intermediate Representation) que serve de entrada para o middle end. Essa também é a fase na qual é feita a checagem de tipos em linguagens tipadas como Typescript, Java, etc. | ||
+ | |||
+ | * **Analisador Léxico** | ||
+ | Nessa primeira fase, ocorre a separação dos textos em pequenos trechos chamados tokens léxicos. Isso é feito por meio de um analisador chamado scanner. Toda a leitura é feita caractere por caractere tendo como objetivo a separação e identificação de cada componente do programa. Também é de responsabilidade dessa etapa a eliminação de espaços vazios, formatações e comentários do código, afim de refinar o código e deixar somente o essencial. | ||
+ | |||
+ | * **Analisador de Sintaxe** | ||
+ | Logo após a análise léxica, é feita a verificação sintática das cadeias dos tokens para que seja confirmado se as regras e a estrutura seguem a [[c: | ||
+ | |||
+ | * **Analisador Semântico** | ||
+ | Na análise semântica, ocorre a verificação de algumas outras regras, como o tipo de cada variável. Nesse passo é feita a validação da lógica do código da linguagem de programação em que se está programando, | ||
+ | |||
+ | * **Gerador de código intermediário** | ||
+ | Tem o propósito de criar um código de objeto que ainda não foi concluído, porém, o qual já é possível ser executado através de máquinas virtuais. Existem diversos tipos de códigos intermediários, | ||
+ | Um código intermediário, | ||
+ | |||
+ | Segue uma lista de linguagens que podem ser consideradas como código intermediário, | ||
+ | |||
+ | Java – Bytecode; | ||
+ | TIMI – Usado em compiladores da plataforma IBM i; | ||
+ | Matlab; | ||
+ | O-code – Feito pelo BCPL (Linguagem de Programação Básica Combinada). | ||
+ | |||
+ | == Middle End == | ||
+ | Um middle end não é necessário para que um compilador funcione, porém ele é de extrema importância, | ||
+ | |||
+ | * **Otimizador de código** | ||
+ | Nessa etapa, ocorre a examinação do código intermediário com o propósito de otimizá-lo. É importante destacar que mesmo o mais moderno dos compiladores não consegue otimizar totalmente o código. Isso porque não é possível agradar todos os diferentes casos de design. Mesmo assim, essa parte é fundamental para a geração do código binário. Entre as técnicas de substituição de códigos padrões, temos a eliminação de subexpressões excessivas, substituição das operações matemáticas e a repartição de laços, já que eles são estruturas que cabem uma certa otimização. | ||
+ | |||
+ | == Back End == | ||
+ | O back end é responsável por transformar o código intermediário otimizado, ou a própria árvore sintática caso o compilador não tenha IR, em um código de máquina específico. | ||
+ | |||
+ | * **Gerador de código final** | ||
+ | Na última fase do compilador é feita a geração do código para que a máquina consiga executá-lo. É uma das partes mais importantes, | ||
+ | |||
+ | ==== Gramáticas | ||
+ | |||
+ | A gramática de uma linguagem é o conjunto de regras que define como um compilador deve realizar as análises léxicas, sintáticas e semânticas. Existem diversos tipos de gramáticas, | ||
+ | |||
+ | === Gramática livre de contexto === | ||
+ | |||
+ | Ela é um conjunto de regras que ditam como devem ser formadas e se relacionam o conjunto de caracteres que formam a linguagem. Funciona com base na atribuição de nomes e em que esses nomes significam. Exemplo: | ||
+ | * Em língua portuguesa uma **Oração Simples** deve ser formada por um **Sujeito** e um **Predicado**, | ||
+ | |||
+ | Para podermos representar a gramática de uma melhor forma usamos uma seta para indicar do que devem ser compostos cada identificador. | ||
+ | {{ : | ||
+ | |||
+ | |||
+ | Esse formato é chamado de ABNF( Augmented Backus-Naur Form) e ele utiliza aspas duplas em volta do caracteres para representar que são palavras ou caracteres e não identificadores. O caractere **|** é utilizado para dizer ou um ou outro, pode ser de qualquer um dos identificadores. | ||
+ | |||
+ | Dessa forma podemos definir como será escrita e entendida a linguagem, pois partindo da gramática podemos dizer como cada expressão se relaciona com outra e o que elas significam em questões lógicas. | ||
+ | |||
+ | |||
+ | ===== Referências ===== | ||
+ | * MARTINS, VINICIUS. Compilador: o que é e diferenças do interpretador! **Be Trybe**, 2021 [[https:// | ||
+ | * COMPILADOR. //In:// Wikipedia: A enciclopédia livre. Disponível em: [[https:// | ||
+ | * L. M. RICARTE, IVAN. **Compiladores**. Campinas: Unicamp, 2003. Disponível em: [[https:// | ||
+ | * COMPILER. //In:// Wikipedia: The free enciclopedia. Disponível em: [[https:// | ||
+ | * MIGHT, Matthew. Grammar: The Language of Languages. **Matt Might' | ||
+ | * CONTEXT-FREE GRAMMAR. //In:// Wikipedia: The free enciclopedia. Disponível em: [[https:// |