Frank Coelho de Alcantara -2020
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.
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.
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.
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.
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.
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.
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.
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.
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\}$$
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$$
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$.
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.
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$.
Clique aqui para realizar a atividade participativa referente às aulas 1 e 2.