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?
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?
Respostas:
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).
x + y
onde não há um +
operador apropriado para esses operandos). Adicionar 1 em vez de 2 é o que eu chamaria de erro lógico .
Na verdade, não existem dois níveis, mas três:
i
e f
produz if
)if
, (
, 42
, ==
, answer
e )
produz uma instrução condicional)ValidIdentifier
terminal, 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.
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).
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).
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:
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.
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 + y
onde x
e y
sã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.)
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).
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
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.
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.
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.
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.
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.
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.
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.
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".
-
operadores são o mesmo token , mas são sintaticamente diferentes, porque são usados em contextos diferentes. 0 - 1
corresponde à regra de sintaxe additive-expression: additive-expression - multiplicative-expression
, enquanto - 1
corresponde à regra de sintaxe unary-expression: unary-operator cast-expression
(referência: padrão C99).
-
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