Compilação, conceitos gerais

Frank Coelho de Alcantara -2020    

Tradução em Linguagem de Máquina

Para que uma máquina possa executar um algoritmo, o texto que escrevemos deve ser traduzido em uma linguagem que a máquina entenda. Uma linguagem de máquina.

Esta tradução pode ser realizada por compilação, interpretação ou por processos mistos. Não há relação entre uma linguagem e a forma como ela é traduzida.

Processo de Compilação

processo de compilação em módulos

Analisador Léxico

Módulo Responsável pela interpretação dos Lexemas (palavras) de uma determinada linguagem. No nosso caso, de uma linguagem formal.

Lexema é um termo mais amplo por que inclui todos os conjuntos de símbolos que são possíveis em uma linguagem.

Vamos usar preferencialmente lexema, mas palavra é um bom sinônimo para você entender o conceito.

Analisador Sintático

Responsável pela análise da estrutura da linguagem.

Cabe ao analisador sintático determinar se uma determinada declaração de uma determinada linguagem está corretamente formatada.

A análise sintática se preocupa com a forma das sentenças, não com os lexemas e não com o sentido da sentença.

Analisador Semântico

O analisador semântico é responsável pela interpretação de cada declaração da linguagem. Análise semântica é análise de sentido.

Erros de tipos, declaração de variáveis, composição de argumentos, estão entre os problemas que cabem ao analisador semântico.

A análise semântica se preocupa com o sentido da sentença.

Geração de código intermediário

Cabe ao gerador de código intermediário, otimizar o código e transformá-lo em uma linguagem mais próxima da linguagem da máquina.

Neste módulo encontramos as maiores oportunidades para desenvolvimento de tecnologia. O Java, o Chrome, o LLVM são projetos que dependem do código intermediário para o seu sucesso.

A geração de código intermediário é fundamental para o sucesso do processo de interpretação.

Otimização de código

Este módulo pode estar dentro, fora, ou tanto no gerador de código intermediário quanto após este módulo. É responsável por fazer com que o código de máquina gerado seja o mais eficiente e eficaz possível.

A otimização de código é a última ação, antes de chegarmos ao Assembly.

Sistemas de compilação como o LLVM, possuem diversos projetos diferentes competindo pelo código mais eficiênte.

Linguagens Formais

Uma linguagem formal é uma linguagem artificial criada pelo homem, para atender alguma função específica.

A música é uma linguagem formal. Existe uma linguagem artificial criada para a escrita, leitura e interpretação de músicas. O cálculo proposicional também é uma linguagem formal.

Há uma pequena diferença entre linguagens formais e regulares. Todas as regulares são formais, mas nem todas as formais são regulares.

Linguagens Naturais

As linguagens naturais são fruto da evolução da especie humana. Ocorrem de forma natural, ainda não perfeitamente entendida. A base do nosso desenvolvimento como espécie.

As linguagens naturais não possuem regras estáticas de grafia, sintaxe ou semântica. Estas definições evoluem com a linguagem.

Iremos, ao longo desta disciplina, melhorando a definição de linguagem formal até incluir todas as nuances deste conceito.

Alfabetos

Um alfabeto é um conjunto finito de símbolos que podem ser utilizados em uma determinada linguagem.

Nesta disciplina, vamos usar o caractere $\Sigma$ (Sigma) para representar um alfabeto com um índice para identificar sua linguagem.

Considerando esta norma, O $\Sigma_{bin}$ representa o alfabeto da linguagem binária. A definição deste alfabeto pode ser: $$\Sigma_{bin} = \{0,1\}$$

Alfabetos - representação

Se desconsideramos os símbolos de pontuação, e símbolos de outros idiomas como o latim ou o grego. O alfabeto do português, como falado no Brasil, pode ser representado por:
$$\Sigma_{pt_br} = \{a..z,A..Z,0..9\}$$

Este alfabeto, conjunto de símbolos, teria a cardinalidade de 62. Tal que: $$|\Sigma_{pt_br}| = |\{a..z,A..Z,0..9\}| = 62$$

Strings 1

Vamos chamar de strings a sequências finitas de símbolos de um alfabeto $\Sigma$ específico de uma linguagem determinada.

A strings podem ter qualquer comprimento, inclusive comprimento nenhum.

A esta string que existe, mas não tem comprimento daremos o nome de string vazia e representaremos pelo símbolo $\varepsilon$.

Strings 2

Dado o alfabeto $\Sigma=\{a,b\}$, o conjunto de todas as strings possíveis com este alfabeto será dado por: $$S=\{\varepsilon,a,b,ab,ba,aa,bb,aaa, ...\}$$

O conjunto das strings possíveis é infinito, como não há limites em comprimento, sempre podemos colocar outro símbolo na string.

O conjunto das strings de uma linguagem não é infinto.

Strings 3

Formalmente, representaremos strings como conjuntos. Afinal é isso que elas são. Então uma string qualquer poderia ser: $$s=\{a,b,b\}$$ informalmente representaremos como: $s=\text{"abb"}$.

A string $s$ tem cardinalidade 3.
Observe que: $|{a,b,b}|_a = 1$.

Avaliação Participativa

Clique aqui para realizar a atividade participativa referente às aulas 1 e 2.