• Nenhum resultado encontrado

O uso de uma linguagem de programação torna possível a comunicação entre os seres humanos e as máquinas. O dicionário Aurélio [Dicionário Aurélio 2013] define-a como:

"Conjunto de instruções e regras de composição e encadeamento, por meio do qual se expressam ações executáveis por um computador, seja direta- mente, seja por meio de processos de compilação, interpretação ou mon- tagem."

A linguagem de programação permite ao programador especificar precisamente sobre quais dados um computador vai atuar, como estes dados serão armazenados ou transmiti- dos e quais ações devem ser tomadas ao se deparar com determinadas circunstâncias. O conjunto de palavras chamadas de tokens, compostas de acordo com um conjunto de re- gras de formação, constitui o código fonte de um algoritmo. O código fonte é, em última instância, a linguagem entendível pelas pessoas que deve ser traduzido para gerar o código de máquina a fim de que possa ser entendido e executado pelo processador (máquina).

Conceitos relativos à linguagens de programação são estudados pela área de Teoria das Linguagens Formais e dos Autômatos (LFA). Essa teoria tem por objetivo estudar e definir os modelos matemáticos que possibilitam a especificação e o reconhecimento de linguagens, suas classificações, estruturas, propriedades, características e relaciona- mentos. Podemos dizer que as linguagens formais são uma abstração das características gerais de uma linguagem de programação, baseadas na área de Teoria da Computação e possuem um conjunto de símbolos, regras de formação de sentenças, entre outros [Acióly et al. 2002].

Uma linguagem formal nos diz todas as regras que são explicitamente declaradas em termos das cadeias de símbolos que podem ocorrer nela. Uma linguagem formal L sobre um alfabeto ∑ é um subconjunto de ∑∗, isto é, o conjunto de todas as cadeias (finitas) obtidas concatenando-se zero ou mais símbolos de ∑. O alfabeto ∑ é um conjunto não- vazio e finito de símbolos.

As representações são feitas por reconhecedores e geradores [Hopcroft et al. 2015]. Os reconhecedores são dispositivos formais que servem para verificar se uma sentença pertence ou não à determinada linguagem. Ou seja, se a sentença pode ou não ser for-

2.2. LINGUAGENS DE PROGRAMAÇÃO 17 mada a partir das regras de formação especificadas. Já os sistemas geradores são disposi- tivos formais que permitem a geração sistemática de todas as sentenças possíveis de uma linguagem. Os principais sistemas geradores disponíveis são as gramáticas, destacando- se as de Chomsky [Chomsky 1965, Acióly et al. 2002]. Linguagens formais podem ser representadas de maneira finita e precisa através de sistemas com fundamentação mate- mática.

2.2.1

Desenvolvimento de Programas

O computador deve conter mecanismos capazes de converter os comandos dados em linguagem de alto nível (linguagens de programação em geral) para a linguagem de má- quina (códigos binários). Esta tarefa de conversão é feita através de um programa que recebe as instruções em linguagem de alto nível e retorna como saída outro programa constituído de instruções em código de máquina. Ao programa original, em linguagem de alto nível, dá-se o nome de programa fonte e ao resultado, em linguagem de máquina, de programa objeto [Gomes 2012]. Apresentamos nesta seção as principais etapas de geração de um programa.

A primeira etapa para geração de um programa é a codificação, está é dada pela escrita utilizando uma determinada linguagem de programação das instruções que a máquina deve realizar para alcançar o resultado almejado. Para realização desta tarefa é preciso utilizar ambientes integrados de desenvolvimento ou editores. É possível nesta etapa utilizar qualquer editor para gerar o programa fonte. Porém, alguns ambientes oferecem ferramentas de edição mais poderosas, com reconhecedores e realçadores das palavras chaves de uma linguagem, geração do código fonte, possibilidade de projeto de interfaces gráficas, etc.

A segunda etapa é a tradução do programa fonte em programa alvo. Sabemos que, independente da linguagem de programação utilizada e da arquitetura do sistema compu- tacional em uso, o programa fonte não é executável diretamente pela unidade de proces- samento. A linguagem é uma ferramenta que permite apenas que o programa seja legível a olhos humanos. Para que o programa fonte seja executável, é necessário que ele seja traduzido para o código de máquina do processador que faz parte da arquitetura do sis- tema. Esta tarefa é realizada de forma automática pelos montadores e compiladores. O programa alvo gerado por estas ferramentas é apresentado de acordo com o sistema de numeração binária.

Compiladores

O programa alvo é o código de máquina produzido pelo compilador e, para que ele seja gerado, o compilador passa por um conjunto de fases [Aho et al. 2008] como mos- trado na Figura 2.1. Cada uma das fases transforma o programa fonte de uma represen- tação para outra. Algumas dessas fases podem, no entanto, serem agrupada e a repre- sentação entre elas não necessita ser, de fato, implementada. Nesta seção, descreveremos as três fases principais: análise léxica, análise sintática e gerador de código [Barbosa et al. 2009].

Figura 2.1: Fases de um compilador

A análise léxica é a etapa do processo onde são reconhecidas quais cadeias de símbo- los do programa fonte representam entidades indivisíveis. Por exemplo, palavras não são tratadas letra a letra, mas sim como uma unidade composta por várias letras. O analisador léxico também identifica os conjuntos de símbolos que representam valores numéricos, operadores aritméticos, palavras, símbolos reservados e outros, gerando assim um padrão de bits conhecidos como símbolos ou tokens [Aho et al. 2008]. Cada símbolo ou token representará um dado de entrada do analisador sintático. Além disso, o analisador léxico realiza também outras tarefas como remover comentários e marcas de edição, bem como relacionar o número da linha com possíveis mensagens de erro.

2.3. QUALIDADE DE SOFTWARE 19

Documentos relacionados