Respostas:
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:
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?
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.
x
estiver no valor máximo para seus dados e 1
for adicionado a ele, isso resultará em uma saída estranha ( 0
), não é um erro semântico?
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 N
está INT_MAX
não é infinito, dependendo otimização; ver blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
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.
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 ( if
tornando- se , tornando- se si
, do
tornando- 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!faire
else
sinon
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.
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.
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.
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.
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.
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.