Respuestas:
La sintaxis se refiere a la estructura o gramática del idioma. Responde a la pregunta: ¿cómo construyo una oración válida? Todos los idiomas, incluso el inglés y otros idiomas humanos (también conocidos como "naturales") tienen gramáticas, es decir, reglas que definen si la oración se construye correctamente o no.
A continuación se muestran algunas reglas de sintaxis del lenguaje C:
La semántica se trata del significado de la oración. Responde a las preguntas: ¿es válida esta oración? Si es así, ¿qué significa la oración? Por ejemplo:
x++; // increment
foo(xyz, --b, &qrs); // call foo
son sentencias C sintácticamente válidas. ¿Pero, qué quieren decir? ¿Es incluso válido intentar transformar estas declaraciones en una secuencia ejecutable de instrucciones? Estas preguntas están en el corazón de la semántica.
Considere el operador ++ en la primera declaración. En primer lugar, ¿es incluso válido intentar esto?
Por último, tenga en cuenta que algunas semánticas no se pueden determinar en tiempo de compilación y, por lo tanto, deben evaluarse en tiempo de ejecución. En el ejemplo del operador ++, si x ya está en el valor máximo para su tipo de datos, ¿qué sucede cuando intenta agregarle 1? Otro ejemplo: ¿qué sucede si su programa intenta eliminar la referencia a un puntero cuyo valor es NULL?
En resumen, la sintaxis es el concepto que se preocupa solo por si la oración es válida o no para la gramática del idioma. La semántica trata sobre si la oración tiene un significado válido o no.
x
está en el valor máximo para sus datos y 1
se le agrega, entonces da como resultado una salida extraña ( 0
), ¿no es un error semántico?
UINT_MAX + 1 == 0
). El desbordamiento firmado no está definido. Compiladores modernos normalmente tienen INT_MAX + 1 == INT_MIN
, pero hay casos en que no se puede contar con este (por ejemplo for (i = 0; i <= N; ++i) { ... }
, donde N
se INT_MAX
no es infinita en función de optimización; ver blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
La sintaxis se refiere a la estructura de un lenguaje, rastreando su etimología hasta cómo se juntan las cosas.
Por ejemplo, puede requerir que el código se junte declarando un tipo, luego un nombre y luego un punto y coma, para que sea sintácticamente correcto.
Type token;
Por otro lado, la semántica se trata de significado. Un compilador o intérprete podría quejarse de errores de sintaxis. Tus compañeros de trabajo se quejarán de la semántica.
Wikipedia tiene la respuesta. Leer wikipages de sintaxis (lenguajes de programación) y semántica (informática) .
O piense en el trabajo de cualquier compilador o intérprete . El primer paso es el análisis léxico donde los tokens se generan dividiendo la cadena en lexemas y luego analizando , lo que crea un árbol de sintaxis abstracto (que es una representación de la sintaxis). Los siguientes pasos implican transformar o evaluar estos AST (semántica).
Además, observa que si ha definido una variante de C, donde cada palabra clave se transforma en su equivalente francés (así if
convertirse si
, do
convirtiéndose faire
, else
convirtiéndose sinon
, etc, etc ...) que sin duda cambiar la sintaxis de la lengua, pero no va a cambiar mucho la semántica: ¡programar en ese francés-C no será más fácil!
La semántica es lo que significa su código, lo que podría describir en pseudocódigo. La sintaxis es la estructura real: todo, desde nombres de variables hasta punto y coma.
La sintaxis es la estructura o forma de expresiones, declaraciones y unidades de programa, pero Semántica es el significado de esas expresiones, declaraciones y unidades de programa. La semántica se deriva directamente de la sintaxis . La sintaxis se refiere a la estructura / forma del código que especifica un lenguaje de programación específico, pero la semántica se ocupa del significado asignado a los símbolos, caracteres y palabras.
La sintaxis de un lenguaje de programación es la forma de sus expresiones, declaraciones y unidades de programa. Su semántica es el significado de esas expresiones, declaraciones y unidades de programa. Por ejemplo, la sintaxis de una instrucción while de Java es
while (boolean_expr) statement
La semántica de esta forma de declaración es que cuando el valor actual de la expresión booleana es verdadero, se ejecuta la declaración incorporada. Luego, el control regresa implícitamente a la expresión booleana para repetir el proceso. Si la expresión booleana es falsa, el control se transfiere a la instrucción que sigue a la construcción while.
Sintaxis: Se refiere a la estructura gramatical del lenguaje. Si está escribiendo el lenguaje c. Tienes que tener mucho cuidado con el uso de tipos de datos, tokens [puede ser literal o símbolo como "printf ()". Tiene 3 toques, "printf, (,)"]. De la misma manera, debe tener mucho cuidado en cómo usa la función, la sintaxis de la función, la declaración de la función, la definición, la inicialización y la llamada.
Mientras que la semántica, se refiere a la lógica o concepto de oración o enunciados. Si dices o escribes algo fuera del concepto o la lógica, estás semánticamente equivocado.
Por lo general, el análisis de sintaxis y semántica del código se realiza en la parte 'frontend' del compilador.
Sintaxis: El compilador genera tokens para cada palabra clave y símbolo: el token contiene el tipo de información de la palabra clave y su ubicación en el código. Usando estos tokens, se crea y analiza un AST (abreviatura de Abstract Syntax Tree). Lo que el compilador comprueba realmente aquí es si el código tiene significado léxico, es decir, ¿cumple la "secuencia de palabras clave" las reglas del lenguaje? Como se sugirió en las respuestas anteriores, puede verlo como la gramática del idioma (no el sentido / significado del código). Nota al margen: los errores de sintaxis se informan en esta fase (devuelve tokens con el tipo de error al sistema)
Semántica: Ahora, el compilador verificará si sus operaciones de código 'tienen sentido'. Por ejemplo, si el lenguaje admite la inferencia de tipos, se informará de un error semántico si está intentando asignar una cadena a un flotante. O declarar la misma variable dos veces. Estos son errores que son 'gramaticalmente' / sintácticamente correctos, pero no tienen sentido durante la operación. Nota al margen: para verificar si la misma variable se declara dos veces, el compilador administra una tabla de símbolos
Entonces, la salida de estas 2 fases de la interfaz es un AST anotado (con tipos de datos) y una tabla de símbolos.
Considerando el lenguaje normal que usamos; aquí, inglés:
por ejemplo, va a la escuela. - Gramática / sintaxis incorrecta, aunque quería transmitir un sentido / semántico correcto.
por ejemplo, va al frío. - frío es un adjetivo. En inglés, podríamos decir que esto no cumple con la gramática, pero en realidad es el ejemplo más cercano a una semántica incorrecta con la sintaxis correcta que se me ocurre.