sexta-feira, 20 de março de 2009

Sintaxe e Semântica de Linguagens de Programação

(Postado por: Miriãn Pereira, Priscilla Camila e Suzy Santiago)

Linguagem é um conjunto de regras sintáticas e semânticas usadas para definir uma forma de comunicação. Na computação, também surgiu a necessidade de se criar um método padronizado para expressar instruções sobre as quais um computador vai atuar, como elas serão armazenadas ou transmitidas e quais ações devem ser tomadas sob várias circunstâncias.
Como toda linguagem é utilizada por várias pessoas, ela deve ser inteligível por todos. Desta forma, uma linguagem de programação também tem estudo semelhante às demais, ou seja, deve-se analisar sua sintaxe e semântica.
Uma definição informal é escrita usando-se alguma linguagem natural. Quando bem escrita ela pode ser prontamente entendida pelo implementador da linguagem, no entanto, devido à natureza ambígua da linguagem natural, a definição pode ser imprecisa e incompleta. Assim, é bem possível que dois implementadores interpretem distintamente certas características da linguagem, o que levará a implementações inconsistentes para a mesma linguagem.
Numa definição formal, uma linguagem de programação é definida precisamente (matematicamente); para isto faz-se uso de alguma linguagem ou método formal (isto é, com base matemática) para escrever a definição da linguagem. A especificação formal de linguagens de programação evita ambigüidades e falhas de entendimento por parte dos projetistas, implementadores e usuários da linguagem.
Sintaxe é a forma como as instruções de uma linguagem são escritas, mas sem atender ao seu significado. Enquanto no C++ os blocos de comando que serão executados são limitados por “{ }”, em Pascal são limitados por “begin” e “end”. Veja a seguir:


Pascal
var nome: string; (*variável do tipo string*)
begin
clrscr;
writeln('Digite o primeiro nome:');
readln(nome);
writeln(nome);
readkey;
end

C++
char nome[40] //variável do tipo string com no máximo 40 caracteres
int main(){
clrscr;
cout<<"Digite o primeiro nome: ";
cin>>nome;
cout<<"Nome: ";
return 0; }

Na sintaxe de uma linguagem de programação existem descrições formais, que são chamadas de lexemas. Os lexemas de uma LP incluem seus identificadores, palavras reservadas, literais e operadores. Um símbolo de uma linguagem é uma categoria de lexemas e é denominado token.

Exemplo de uma instrução em linguagem C:
- index = 2 * cont + 17;



Para descrever a sintaxe das linguagens de programação são criadas gramáticas. Entre as gramáticas livres de contexto, a mais utilizada é a BNF– Forma de Backus- Naur, que foi definida por Peter Naur e melhorada por John Backus, dai o seu nome: Backus-Naur Form (BNF). É uma metalinguagem (linguagem utilizada para explicar outra linguagem), composta por um conjunto de regras para descrever como os processos computacionais são realizados.

A BNF usa abstrações para representar estruturas sintáticas.

Exemplo:
- soma = valor1 + valor2

A instrução à esquerda da seta é a abstração que está sendo definido. Esta instrução é chamada de “não-terminal” (precisa ser definida). O texto à direita da seta é a definição do que está do lado esquerdo. Esta instrução é chamada de “terminal” (não precisa ser definida, que são os lexemas e os tokens). A definição é chamada de regra.

A BNF é suficientemente poderosa para descrever a grande maioria das sintaxes das linguagens de programação.
As sentenças da linguagem são geradas por uma seqüência de aplicações das regras. Uma geração da sentença é chamada derivação (esclarecer, explicar o programa).


As gramáticas descrevem naturalmente a estrutura sintática hierárquica das linguagens que definem. Essas estruturas são chamadas de árvores de análise.

Exemplo:
- A = B * (A + C)

onde:
- O nível mais baixo será executado primeiro
- As folhas são elementos terminais
- Os nós (vértices) são elementos não-terminais
- Toda subárvore de uma árvore de análise descreve uma instância de uma abstração na instrução.


Para solucionar alguns problemas encontrados na BNF, o standard ISO 14977 definiu uma extensão ao BNF designado EBNF e no qual existem quatro novos operadores:
-( ... ...... ) escolha múltipla
- [ ] símbolos opcionais (zero ou uma vez)
-{ } símbolos opcionais com repetição (zero ou mais vezes)
-{ }+ símbolos com repetição (uma ou mais vezes)

O EBNF não é mais poderoso que o BNF;apenas é mais facilitador, mais prático.
Exemplo:


As informações das gramáticas BNF e EBNF podem ser representadas através de gráficos de sintaxe. Esses gráficos possuem diferentes tipos de vertices para representar os simbolos terminas e não-terminais. Os vértices retangulares contém os nomes das unidades sintáticas (não-teminais) e círculos ou elipses contém símbolos terminais. Com a análise dos graficos aumenta a legibilidade, pois permite visualizar em duas dimessões.

Exemplo:
=> if then {}[else ] end if
=> else_if then

Representação Gráfica: A Gramática de atributos, projetada por Knuth, é um dispositivo usado para descrever mais detalhes da estrutura das linguagens de programação do que é possível com uma gramática livre de contexto (BNF).Ela permite que certas regras de linguagem sejam descritas, com a incompatibilidade de tipos. Consegue descrever tanto a sintaxe como a semântica estática do programa.


A Semântica é complementar a sintaxe. Ela corresponde à descrição do significado das instruções válidas de uma linguagem. Por exemplo, a sintaxe da instrução if da linguagem C++ é: if () {} e sua semântica é: “se o valor da expressão for verdadeiro, as instruções incorporadas serão executadas pelo programa”. É através da semântica que conseguimos utilizar melhor e validar uma linguagem.

Semântica estática se relaciona indiretamente com o significado do programa durante a execução, ele se refere as formar legais do programa. Geralmente as regras de semântica estática declarama as restriçoes de tipos. Ela é assim chamado por que a análise necessária para verificar essas especificações durante a compilação.

Semântica dinâmica representa o significado das expressões, das instruções e das unidades de programas. É dividida em Operacional, Denotacional e Axiomática.

Semântica operacional: descreve o significado de um programa através da execução de suas instruções numa máquina (real ou simulada, virtual). Alterações no estado da máquina ao executar determinada instrução definem o significado desta, ou seja, preocupa-se com o resultado, em como será executado pelo computador.

Exemplo:

Semântica denotacional dentre os métodos mais empregados, é o de maior rigor matemático. Baseia-se solidamente na teoria das funções recursivas, ou seja, explica o significado das instruções das linguagens, através de instruções matemáticas.

Semântica axiomática baseia-se na lógica matemática associada a um método para provar, ou seja, preocupa-se em provar a exatidão de um programa. As expressões lógicas são chamadas de predicado. Eles precedem uma instrução, seguido da instrução temos a pós-condição.

Exemplo:



Referências Bibliográficas:

Sebesta, Robert W.; trad. Santos, José Carlos Barbosa dos. Conceitos de Linguagens de Programação – 4ª Edição – Porto Alegre: Bookman, 2000
http://pt.wikipedia.org/wiki/Gramáticas_livres_de_contexto
http://www.dcc.ufrj.br/~fabiop/CAP3.ppt#17
http://www.cefetrn.br/~robinson/LPCPCap3.pdf
http://www.din.uem.br/~vfeltrim/linguagens2008/Sintaxe.pdf

16 comentários:

  1. Parabéns Pri, vocês foram muito claras, objetivas e criativas.
    Continuem brilhando.....

    ResponderExcluir
  2. Gostei da postagem...achei interessante entender que a BNF é uma linguagem para esplicar a linguagem...doidera =p, mas o lance da semântica não entendi muito bem...muito difícil pensar como que a linguagem interpreta as instruções.
    Ficou jóia a postagem vlw meninas =D
    Sem falar que o Peter Naur parece com o Sylvio Santos..hehe ^^

    ResponderExcluir
  3. Pois é Henrique, muito legal entender que existem linguagens para explicar outras(as metalinguagens), parece até contraditório,não é?Muito interessante mesmo.Quanto a semântica, fica claro para entendê-la quando pensamos de forma geral em seu conceito, que ela nada mais é do que uma verificadora de "código".Ela é a responsável por garantir que um programa está ou não correto.Que cada uma de suas instruções estão exatas.
    E o Peter Naur.....sem comentários....Quem é a cópia de quem?...hehehe

    ResponderExcluir
  4. valeu ter parado pra ler esta postagem a explicação ficou bem clara e o conceito de sintaxe e semântica bem "enxuto" ajudando muito no entendimento.

    ResponderExcluir
  5. Legal a postagm de vcs, explicou bem tudo o que o Tiago falou em sala, ficou bel claro!!!

    ResponderExcluir
  6. Gostei muito... O artigo ficou diferenciado o que ajudou muito no entendimento.... Parabéns ao grupo!

    ResponderExcluir
  7. Achei essa postagem de suma importância.
    Deu uma 'introdução' ao conteúdo da disciplina de LP com muita ênfase e objetividade, sem rodeios.
    Muito bom!

    ResponderExcluir
  8. gostei o que foi postado
    deu uma reforçada no que
    o professor explicou nas aulas
    muito bom.

    ResponderExcluir
  9. Falou tudo !!! Entender mais BNF e EBNF ajudou bastante na materia.

    ResponderExcluir
  10. Aew... Belo post...

    Ajudou demais no decorrer do curso. Detalhado com figuras e tudo mais... Objetivo também... Parabéns.

    ResponderExcluir
  11. Excelente!!! Seu post ajudou-me muito.
    Obrigada
    Blan

    ResponderExcluir
  12. Adorei, sinto_me grata porque esclareceu a minha dúvida,

    ResponderExcluir
  13. Parabéns e obrigado ajudou-me a compreender um pouco mais sobre o assunto!

    ResponderExcluir
  14. Muito bom o conteúdo, ajudou bastante.

    ResponderExcluir