Qual é a diferença entre sintaxe e semântica em linguagens de programação?


120

Qual é a diferença entre sintaxe e semântica em linguagens de programação (como C, C ++)?


2
Eu gostaria de votar, mas nenhum esforço de pesquisa é evidente.
nulo

Respostas:


201

A sintaxe diz respeito à estrutura ou gramática da linguagem. Ele responde à pergunta: como faço para construir uma frase válida? Todas as línguas, até mesmo o inglês e outras línguas humanas (também conhecidas como "naturais"), possuem gramáticas, ou seja, regras que definem se a frase foi construída corretamente ou não.

Aqui estão algumas regras de sintaxe da linguagem C:

  • declarações separadas com ponto e vírgula
  • coloque a expressão condicional de uma instrução IF entre parênteses
  • agrupe várias instruções em uma única instrução, colocando-as entre chaves
  • tipos de dados e variáveis ​​devem ser declarados antes da primeira instrução executável (este recurso foi eliminado em C99. C99 e posteriores permitem declarações de tipos mistos).

A semântica trata do significado da frase. Ele responde às perguntas: esta frase é válida? Se sim, o que significa a frase? Por exemplo:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

são instruções C sintaticamente válidas. Mas o que eles significam? É mesmo válido tentar transformar essas instruções em uma sequência executável de instruções? Essas questões estão no cerne da semântica.

Considere o operador ++ na primeira instrução. Em primeiro lugar, é mesmo válido tentar isso?

  • Se x for um tipo de dados flutuante, esta declaração não terá significado (de acordo com as regras da linguagem C) e, portanto, é um erro , embora a declaração esteja sintaticamente correta.
  • Se x for um ponteiro para algum tipo de dados , o significado da instrução é "adicionar sizeof ( algum tipo de dados ) ao valor no endereço x e armazenar o resultado no local no endereço x".
  • Se x for um escalar, o significado da declaração é "adicione um ao valor no endereço x e armazene o resultado no local no endereço x".

Finalmente, observe que algumas semânticas não podem ser determinadas em tempo de compilação e, portanto, devem ser avaliadas em tempo de execução. No exemplo do operador ++, se x já está no valor máximo para seu tipo de dados, o que acontece quando você tenta adicionar 1 a ele? Outro exemplo: o que acontece se seu programa tentar cancelar a referência de um ponteiro cujo valor é NULL?

Em suma, sintaxe é o conceito que se preocupa apenas se a frase é válida ou não para a gramática da língua. A semântica é sobre se a frase tem um significado válido ou não.


ESTÁ BEM. Se xestiver no valor máximo para seus dados e 1for adicionado a ele, isso resultará em uma saída estranha ( 0), não é um erro semântico?
haccks

Considere um hodômetro em um veículo - ele tem uma série de rodas inter-relacionadas com os dígitos de 0 a 9 impressos em cada uma. A roda mais à direita gira mais rápido; quando volta do 9 para o zero, a roda imediatamente à esquerda avança um. Quando esta roda avança de 9 para 0, aquela à sua esquerda avança e assim por diante.
Jeff N

Um tipo de dados é como a roda de um hodômetro: só pode conter até um determinado valor. Quando o valor máximo é alcançado, o próximo avanço faz com que a roda volte a zero. Se isso é ou não um erro semântico depende das regras de idioma. Nesse caso, você precisa consultar o padrão da linguagem C. Não sei exatamente o que o padrão da linguagem C diz, mas aqui estão algumas das opções. O estouro é: -não é um erro; o resultado é zero. -um erro; o compilador DEVE gerar uma exceção de estouro. -UNDEFINED; o compilador é livre para fazer o que quiser.
Jeff N

2
No caso de alguém se importar com o exemplo específico, estouro sem sinal é definido como aritmética modular (então UINT_MAX + 1 == 0). O estouro assinado é indefinido. Compiladores modernos geralmente têm INT_MAX + 1 == INT_MIN, mas há casos em que você não pode contar com isso (por exemplo for (i = 0; i <= N; ++i) { ... }, onde Nestá INT_MAXnão é infinito, dependendo otimização; ver blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

"note que algumas semânticas não podem ser determinadas em tempo de compilação e devem, portanto, ser avaliadas em tempo de execução" - eu gosto de como isso tem um paralelo com linguagens naturais. Você não pode saber o significado de algumas frases sem contexto. Por exemplo, na frase "Ele gosta de bananas", o significado de "ele" depende do contexto.
ymln

21

A sintaxe se refere à estrutura de uma linguagem, traçando sua etimologia de como as coisas são colocadas juntas.
Por exemplo, você pode exigir que o código seja montado declarando um tipo, um nome e um ponto-e-vírgula, para estar sintaticamente correto.

Type token;

Por outro lado, a semântica é sobre significado. Um compilador ou interpretador pode reclamar de erros de sintaxe. Seus colegas de trabalho reclamarão da semântica.


@Talespin_Kit significa mais do que estrutura: lógica é mais uma abstração, por exemplo, P => Q, etc ou !! P = P, mas quando você adiciona semântica as coisas podem ter sutileza, se P é "feliz", então !! P é "I não estou
infeliz

5
+1 para "Um compilador ou intérprete pode reclamar de erros de sintaxe. Seus colegas de trabalho reclamarão de semântica."
GeekyJ

11

A Wikipedia tem a resposta. Leia wikipages de sintaxe (linguagens de programação) e semântica (ciência da computação) .

Ou pense no trabalho de qualquer compilador ou interpretador . A primeira etapa é a análise lexical onde os tokens são gerados dividindo a string em lexemas e depois analisando , o que constrói uma árvore de sintaxe abstrata (que é uma representação da sintaxe). As próximas etapas envolvem transformar ou avaliar essas AST (semântica).

Além disso, observe que se você definiu uma variante de C onde cada palavra-chave foi transformada em seu equivalente em francês ( iftornando- se , tornando- se si, dotornando- se etc etc ...) você definitivamente mudaria a sintaxe de sua linguagem, mas você não mudará muito a semântica: programar nesse French-C não será mais fácil!faireelsesinon


8

Semântica é o que seu código significa - o que você pode descrever em pseudo-código. A sintaxe é a estrutura real - tudo, desde nomes de variáveis ​​a ponto-e-vírgulas.


É uma conversa entre pessoas diferentes? Ou é apenas uma postagem? Eu não entendo. Por exemplo, "Não tenho ideia do que o seguinte significa. Não poderia estar mais errado".
doubleOrt de

5

Sintaxe é a estrutura ou forma de expressões, declarações e unidades de programa, mas Semântica é o significado dessas expressões, declarações e unidades de programa. A semântica segue diretamente da sintaxe . A sintaxe se refere à estrutura / forma do código que uma linguagem de programação específica especifica, mas a semântica trata do significado atribuído aos símbolos, caracteres e palavras.


5
  • Você precisa da sintaxe correta para compilar.
  • Você precisa de uma semântica correta para fazer isso funcionar.

1

A sintaxe de uma linguagem de programação é a forma de suas expressões, instruções e unidades de programa. Sua semântica é o significado dessas expressões, instruções e unidades de programa. Por exemplo, a sintaxe de uma instrução Java while é

while (boolean_expr) statement

A semântica desta forma de instrução é que, quando o valor atual da expressão booleana for verdadeiro, a instrução embutida é executada. Em seguida, o controle retorna implicitamente à expressão booleana para repetir o processo. Se a expressão booleana for falsa, o controle será transferido para a instrução após a construção while.


1

Sintaxe: Refere-se à estrutura gramatical do idioma .. Se você está escrevendo o idioma c. Você deve ter muito cuidado ao usar tipos de dados, tokens [pode ser literal ou símbolo como "printf ()". Tem 3 tokes, "printf, (,)"]. Da mesma forma, você deve ter muito cuidado, como usar a função, sintaxe da função, declaração da função, definição, inicialização e chamada dela.

Enquanto semântica, diz respeito à lógica ou conceito de frase ou enunciados. Se você está dizendo ou escrevendo algo fora do conceito ou da lógica, então você está semanticamente errado.


1

Compreender como o compilador vê o código

Normalmente, a análise de sintaxe e semântica do código é feita na parte 'frontend' do compilador.

  • Sintaxe: o compilador gera tokens para cada palavra-chave e símbolos: o token contém o tipo de informação da palavra-chave e sua localização no código. Usando esses tokens, um AST (abreviação de Abstract Syntax Tree) é criado e analisado. O que o compilador realmente verifica aqui é se o código é lexicamente significativo, ou seja, a 'sequência de palavras-chave' está de acordo com as regras de linguagem? Como sugerido nas respostas anteriores, você pode vê-lo como a gramática do idioma (não o sentido / significado do código). Nota lateral: os erros de sintaxe são relatados nesta fase. (Retorna tokens com o tipo de erro para o sistema)

  • Semântica: Agora, o compilador verificará se as operações do seu código 'fazem sentido'. Por exemplo, se o idioma suportar inferência de tipo, um erro semático será relatado se você tentar atribuir uma string a um float. OU declarando a mesma variável duas vezes. Esses são erros que são 'gramaticalmente' / sintaxialmente corretos, mas não fazem sentido durante a operação. Nota lateral: para verificar se a mesma variável é declarada duas vezes, o compilador gerencia uma tabela de símbolos

Portanto, a saída dessas 2 fases de frontend é um AST anotado (com tipos de dados) e uma tabela de símbolos.

Compreendendo de uma forma menos técnica

Considerando a linguagem normal que usamos; aqui, inglês:

por exemplo, ele vai para a escola. - Gramática / sintaxe incorreta, embora ele quisesse transmitir um sentido / semântica correto.

por exemplo, ele vai para o frio. - frio é um adjetivo. Em inglês, podemos dizer que isso não está de acordo com a gramática, mas na verdade é o exemplo mais próximo de uma semântica incorreta com sintaxe correta que eu poderia imaginar.


Compiladores Este link pode ser útil para aprender mais
Vedant Panchal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.