Qual é a diferença entre sintaxe e semântica?


87

Eu sempre pensei que se referir à sintaxe de uma linguagem era o mesmo que se referir à semântica de uma linguagem. Mas fui informado de que aparentemente esse não é o caso. Qual é a diferença?



6
"Idéias verdes incolores dormem furiosamente" é sintaticamente OK, mas não faz sentido semântico. Veja en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon

+1 por fazer esta pergunta. Eu me perguntava o mesmo, estava com preguiça de procurar na internet por isso e, obviamente, nunca perguntava.
KK.

Mais ou menos, eu diria ... Semântica é o tipo de instâncias, seus relacionamentos com outras instâncias e garantias que existem entre eles. Sintaxe é a maneira de declarar essas coisas através de cadeias de caracteres. Mais ou menos.
Dehbop 19/05/19

Respostas:


106

Semântica ~ Significado

Sintaxe ~ Representação simbólica

Portanto, dois programas escritos em idiomas diferentes poderiam fazer a mesma coisa (semântica), mas os símbolos usados ​​para escrever o programa seriam diferentes (sintaxe).

Um compilador verificará sua sintaxe (erros em tempo de compilação) e derivará a semântica das regras de idioma (mapeando a sintaxe para as instruções da máquina), mas não encontrará todos os erros semânticos (erros em tempo de execução, por exemplo, cálculo o resultado errado, porque o código diz adicionar 1 em vez de adicionar 2).


2
A verificação de erros não é um critério para distinguir entre sintaxe e semântica. Um compilador pode e deve diagnosticar erros de sintaxe (como um ponto-e-vírgula ausente) e erros semânticos (como x + yonde não há um +operador apropriado para esses operandos). Adicionar 1 em vez de 2 é o que eu chamaria de erro lógico .
21411 Keith Thompson

3
@ Keith - mas a lógica (como em "erro lógico") é semântica. Algumas verificações semânticas podem ser feitas pelo compilador - particularmente a verificação de tipo -, então eu concordo que os compiladores não apenas encontram erros de sintaxe, mas Chris disse apenas " não encontrará todos os erros semânticos", o que não implica que "não possa". encontre qualquer ".
Steve314

1
@ Steve314: Concordo. Mas se você quiser fazer uma distinção nítida entre erros que um compilador deve detectar e erros que não precisam detectar, acho que "semântico" vs. "lógico" é uma boa maneira de expressar essa distinção.
21411 Keith Thompson

4
@KeithThompson Na verdade, em teoria, um compilador ou intérprete para um idioma com um sistema do tipo suficientemente forte e poderoso (ou seja, dependente ) pode verificar qualquer propriedade arbitrária do seu código (módulo o Problema de Halting, se aplicável), quebrando erros semânticos em "verificável" e "não verificável" realmente não fazem sentido em geral.
Ptharien's Flame

@ Ptharien'sFlame Vou retirar essa discussão das nuvens por um segundo, destacando a parte 'em teoria' da sua declaração. Na prática, impor semântica no código requer sintaxe adicional para fornecer aos compiladores pistas sobre a funcionalidade. A verificação semântica adicional é um custo (isto é, complexidade / legibilidade). Afirmar que uma linguagem pode ser poderosa o suficiente para verificar todos os erros semânticos é como dizer que um sistema jurídico pode ser perfeito o suficiente para impedir todos os crimes. Pessoalmente, prefiro a liberdade do que a segurança, mas é isso que faz deste um tópico 'religioso'.
precisa

35

Na verdade, não existem dois níveis, mas três:

  • nível lexical: como os caracteres são combinados para produzir elementos da linguagem ( ie fproduz if)
  • nível sintática: como elementos de linguagem são combinados para produzir expressões de linguagem ( if, (, 42, ==, answere )produz uma instrução condicional)
  • nível semântico: como as expressões de linguagem são convertidas em instruções da CPU para formar um significado (uma instrução condicional permite executar uma ramificação ou outra, dependendo do resultado da expressão booleana)

10
Uma separação entre os estágios de análise e análise é inteiramente artificial, nada mais é do que uma otimização. E existem algumas linguagens em que nenhum conjunto plano litoma finito é definido - mas ainda assim, há uma sintaxe claramente definida. Então, eu preferiria definir lexemes como parte de uma sintaxe, não é uma entidade separada.
SK-logic

@ SK-logic: Em muitos idiomas, a lista de lexemes autorizados ou proibidos que formam um nome de variável é especificada. Então a separação faz sentido.
Mouviciel 12/10

5
@mouviciel, faz sentido apenas como otimização - caso contrário, você terá apenas um ValidIdentifierterminal, que pode ser definido como algo parecido ![AnyKeyword] [Identifier](estou usando a notação do tipo PEG aqui). Você não precisa de um passe lexing separado para esse idioma. Consulte, por exemplo, analisadores C ++ baseados em GLR.
SK-logic

2
@EvanPlaice, do que você está falando? O que quero dizer é que lexing não é necessário (e na verdade limita seu idioma), não analisando .
SK-lógica

1
@ SK-logic Acho que li o seu comentário para significar o oposto do que você pretendia. Eu pensei que você estivesse falando de casos em que apenas um lexer é necessário - como em linguagens puramente 'regulares' ou 'livres de contexto'. Em idiomas de nível superior, um lexer pode não ser necessário, mas fornece uma maneira rápida de executar uma validação de sintaxe de passagem única. Concordo plenamente que há muitos casos em que seria benéfico desligar ou eliminar completamente o estágio lexer.
Evan Solha

18

Vou explicar para você com um exemplo simples no idioma ENGLISH:

The glass drank Ben

É uma declaração sintaticamente correta. Tem um substantivo, um verbo, etc.

Mas semanticamente está errado, porque esta afirmação não tem significado concebível ou correto.


15

A semântica descreve as entidades lógicas de uma linguagem de programação e suas interações. Sintaxe define como eles são expressos em caracteres.

Por exemplo, o conceito de aritmética de ponteiro faz parte da semântica de C; a maneira como os operadores +e -podem ser usados ​​para expressar operações de ponteiro faz parte de sua sintaxe.

Às vezes, dois idiomas compartilham parte de sua semântica, mas a sintaxe difere bastante (por exemplo, C # e VB.NET - ambos usam tipos de valor e tipos de referência, mas os caracteres que você digita para defini-los são diferentes); em outros casos, duas linguagens são sintaticamente semelhantes, mas a semântica não corresponde (considere Java x JavaScript, onde as semelhanças geralmente confundem os iniciantes).


Então, "Paradigmas" estão relacionados à semântica? Quero dizer, um paradigma é um conjunto de semânticas inter-relacionadas?
Gulshan #

1
@Gulshan, paradigma é um conceito muito mais amplo do que algo formalizado como semântica. O paradigma pode incluir semântica, mas é mais uma metodologia ou, ainda mais ampla, uma filosofia.
SK-logic

6

Sintaxe é como você organiza os tokens de um idioma. Semântica é o que esses tokens significam (geralmente, o que significa um arranjo específico de tokens).


5

Você não especificou se se refere apenas às linguagens de programação ou às linguagens gerais usadas na programação, portanto, minha resposta é sobre linguagens de dados (como XML, RDF, sistemas de tipos de dados etc.):

Brian L. Meek, em suas sete regras de ouro para a produção de padrões independentes de idioma (1995), escreve que "a sintaxe de um idioma pode ser a semântica de outro" . Ele se refere às palavras "sintaxe" e "semântica" usadas na descrição dos dados: portanto, se você se deparar com essas palavras em uma especificação de algum formato de dados, substitua melhor as duas palavras por "Potrzebie" para deixar claro que deve trabalhar o significado para si mesmo.

A relação entre sintaxe e semântica, pelo menos em dados exatamente especificados, pode ser melhor descrita pelo termo "codificação" . Semântica é codificada na sintaxe. Como as gravações podem ser aninhadas, a sintaxe de um idioma é a semântica de outro. Se alguém ultrapassa o domínio dos dados, esse aninhamento pode ser praticamente infinito, como descrito por Umberto Eco como "semiose ilimitada".

Para dar um exemplo:

  • A sintaxe XML (o material com todos esses colchetes) é uma sintaxe com um Infoset XML (uma árvore abstrata) como semântica.
  • Um XML Infoset como sintaxe pode expressar um registro em algum formato de dados XML como semântico, por exemplo, um documento RDF / XML que codifica um gráfico RDF.
  • Um gráfico RDF (o material com referências de URI) como sintaxe codifica um gráfico de recursos abstratos como semântico.
  • Um gráfico de recursos abstratos como sintaxe codifica um modelo conceitual como semântico.

As pessoas geralmente param em algum nível e a consideram semântica, mas no final não há semântica final, a menos que algum ser humano interprete os dados em sua mente. Assim que se tenta expressar semântica na forma de dados, ela se torna sintaxe.


4

Se pode ser descrito em BNF (Backus-Naur Form) ou algo semelhante, é sintaxe. Se não pode, não é.

Semântica, por outro lado, é sobre o significado de um programa (ou outro pedaço de código-fonte).

E às vezes a linha entre os dois pode ser embaçada.

Uma maneira de entender a distinção é examinar os tipos de erros que você obtém quando a sintaxe ou a semântica do seu programa está incorreta.

Um erro de sintaxe é uma falha do código-fonte em corresponder à gramática do idioma, por exemplo, sem um ponto-e-vírgula onde é necessário.

Um erro semântico é uma falha no atendimento de outros requisitos de idioma (o que C, por exemplo, chama de "restrições"); um exemplo pode estar escrevendo x + yonde xe ysão de tipos incompatíveis. A gramática do idioma informa que se parece com uma adição something + something, mas não é poderosa o suficiente para expressar os requisitos dos tipos de operandos esquerdo e direito.

(Erros lógicos, como usar 1 onde 2 estariam corretos, geralmente não são detectáveis ​​pelo compilador - embora em alguns casos um compilador possa avisar sobre código questionável.)


0

Sintaxe é o que dizem os símbolos (lexicais). Semântica é o que eles querem dizer.

Considerar:

C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Sintaxe diferente, mesma semântica.

C #: left_value / right_value
VB.NET: left_value / right_value
- Mesma sintaxe, semântica diferente (para números inteiros).


0

Sintaxe é um arranjo gramatical de palavras em uma frase, ou seja, ordem das palavras.

(English) ' cat dog boy ' e (programação) ' hi.5 ' não está sintaticamente correto.

' Gato abraça menino ' e (programação) '* 3,2 * 5 *' é sintaticamente válido.

Semântica Estática é se as declarações sintaticamente válidas têm algum significado.

' I are big ' (programação) (python) ' 3 +' hi ' ' está sintaticamente correto, mas possui erro semântico estático.

Semântica é o significado associado à sequência de símbolos sintaticamente correta, sem erro estático semântico, ou seja, a sentença é sintática e semanticamente correta, mas seu significado pode não ser o que se pretendia.

' Aviões voando podem ser perigosos ' podem ter dois significados, ou seja, voar de aviões pode ser perigoso ou os aviões que voam podem ser perigosos.

(Programação) 'o computador não gerará nenhuma mensagem de erro, mas não fará o que você pediu; fará outra coisa.

Fonte : MIT 6.00.1


-2
  1. Sintaxe refere-se a regras formais que governam a construção de instruções válidas em um idioma. Semântica refere-se ao conjunto de regras que dão o significado de uma declaração.

  2. Erros devido à sintaxe ocorrem em um programa quando ruels da linguagem de programação são violados ou mal utilizados. Erros devido à semântica ocorrem em um programa quando as instruções não são significativas.

  3. A ordem das palavras é o princípio básico da sintaxe. Aqueles que tentam entender o que está escrito usam as dicas sintáticas da ordem das palavras para ajudar a fornecer a estrutura e o significado da sentença. A semântica é uma interpretação do próprio indivíduo sobre o significado de uma "sentença" com base em seu conhecimento prévio. Portanto, uma sentença que aparentemente não faz sentido sintático, pode ter significado ao usar pistas semânticas.

  4. A sintaxe está preocupada apenas com o que é lingüística e gramaticalmente correto. A semântica requer conhecimento prévio de todos os que, e está muito além de qualquer coisa que seja específica da linguagem.

  5. A frase "Beber leite de bebê" não tem um significado sintático, mas, através da semântica, a maioria das pessoas o interpretaria como "Bebê bebe leite", pois nosso conhecimento prévio nos diz que um bebê bebe leite e, portanto, podemos encontrar um significado no palavras-chave.


1
Upvote para tudo, exceto última (ponto 5)
Nawfal

-2

Sintaxe e semântica são como estratégia e tática ou esquerda e direita .

Eles não são conceitos universais realmente independentes, mas um par de palavras relacionadas que, quando você está em um contexto específico, indicam direções opostas. Mas a mesma coisa que é estratégia em uma escala é tática em outra.

Portanto, se você estiver escrevendo código em um idioma, a sintaxe é o idioma que você está usando e o comportamento desejado é a semântica. Mas se você estiver implementando ou discutindo o compilador para esse idioma, a sintaxe é a gramática e talvez o sistema de tipos e a semântica que é tudo construído sobre ele. E assim por diante.


4
Que tipo de BS esotérica é essa? Como esquerda e direita? Como estratégia e tática? Talvez até como Yin e Yang, Deus e Diabo, Harry e Voldemort?
JensG

-3

Sintaxe é o que o computador entende, semântica é o que o humano entende.

Um compilador / intérprete não se importa muito com o seu design e, em qualquer código compilado no nível da máquina, é difícil deduzir o design. Os desenvolvedores se preocupam com o design, porque um bom design é reduzir a complexidade abstraindo comportamentos e interações complexos, e diferentes tipos de problemas se prestam a diferentes semânticas. A escolha do idioma é basicamente sobre a facilidade e eficiência da semântica que você deseja usar pode ser expressa em sua sintaxe.


"Sintaxe é o que o computador entende, semântica é o que o humano entende" é uma grande simplificação. Os seres humanos também entendem a sintaxe e os computadores entendem alguns tipos de semântica.
CesarGon

4
Claramente errado. Existem idiomas com sintaxe idêntica e semântica completamente diferente (por exemplo, versões ansiosas e preguiçosas de um mesmo idioma), existem idiomas com praticamente nenhuma sintaxe e semântica muito rica e variável (por exemplo, Forth e Lisp). Semântica é como o compilador interpreta seu idioma. O ser humano pode não saber nada sobre isso e ainda ser capaz de usar uma linguagem.
SK-logic

@ SK-logic, você está se contradizendo. Se diferentes semânticas podem ser expressas com a mesma sintaxe, então claramente a semântica não está contida na sintaxe, mas na maneira como é usada. No entanto, o compilador possui apenas sintaxe para trabalhar. Não interpreta semântica, interpreta sintaxe. Ele não compila a mesma sintaxe de maneira diferente, com base no que o desenvolvedor quis dizer, mas apenas no que ele digitou. A semântica é fornecida pelo desenvolvedor e é significativa apenas para ele.
kylben

3
@kylben, não estou me contradizendo, porque nunca disse que sintaxe e semântica estão conectadas. E o compilador não está fazendo nada com a sintaxe logo após o estágio de análise - o compilador está implementando a semântica . Claramente, sua interpretação da terminologia está errada. Leia isto para iniciantes: en.wikipedia.org/wiki/Denotational_semantics
SK-logic

3
Você está falando sobre o significado de um programa , que é uma "semântica", como seria definido por um linguista. Mas na ciência da computação, semântica é o significado de uma linguagem , não de um programa específico.
SK-logic

-3

Exemplo muito curto com "plain c":

void main()
{
  int a = 10;
  int x = a - 1;
  int y = - 1;

  printf("x = %i", x);
  printf("y = %i", y);
    getch();
}

Neste exemplo, a sintaxe para o token "-" é a mesma, mas possui um significado diferente ("semântica), dependendo de onde é usado.

Na atribuição "x", "-" significa a operação "subtração". Na atribuição "y", "-" significa a operação "sinal negativo".


3
Incorreta. Os dois -operadores são o mesmo token , mas são sintaticamente diferentes, porque são usados ​​em contextos diferentes. 0 - 1corresponde à regra de sintaxe additive-expression: additive-expression - multiplicative-expression, enquanto - 1corresponde à regra de sintaxe unary-expression: unary-operator cast-expression(referência: padrão C99).
Keith Thompson

@ Keith Thompson: Você perdeu o ponto. É uma questão de semântica ou sintaxe, não uma questão de padrões C. O padrão está certo, mas minha resposta foi direcionada para explicar um conceito, não seguindo literalmente um padrão. É como uma pergunta "Capitão Kirk" vs "Dr. Spock". Cheers ;-)
umlcat 12/02

Discordo. A distinção entre os dois -representantes é sintática, não apenas semântica (embora eles também tenham semântica diferente). A sintaxe é definida pela gramática do idioma e os dois operadores são especificados em diferentes seções da gramática. Consulte o rascunho do N1570 , seção 6.5.3 para operadores unários e 6.5.6 para operadores aditivos. (BTW, se você estiver indo para usar um exemplo C, deve provavelmente estar correto; void main()deve ser int main(void), e que está faltando #include <stdio.h>e tudo cabeçalho declaragetch
Keith Thompson

Para esclarecer o ponto, a sintaxe não é apenas sobre a sequência de tokens, é sobre como esses tokens constroem construções maiores. Um compilador normalmente possui um analisador lexical (tokenizer) e um analisador como componentes distintos; ambos lidam com sintaxe.
Keith Thompson
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.