¿Cuál es la diferencia entre sintaxis y semántica en los lenguajes de programación?

120

¿Cuál es la diferencia entre la sintaxis y la semántica en los lenguajes de programación (como C, C ++)?

hacks
fuente
2
Me gustaría votar a favor, pero no hay ningún esfuerzo de investigación evidente.
nulo

Respuestas:

201

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:

  • declaraciones separadas con punto y coma
  • encierre la expresión condicional de una declaración IF entre paréntesis
  • agrupe varias declaraciones en una sola declaración encerrándolas entre llaves
  • los tipos de datos y las variables deben declararse antes de la primera declaración ejecutable (esta característica se eliminó en C99. C99 y la última permite declaraciones de tipos mixtos).

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?

  • Si x es un tipo de datos flotante, esta declaración no tiene significado (de acuerdo con las reglas del lenguaje C) y, por lo tanto, es un error aunque la declaración sea sintácticamente correcta.
  • Si x es un puntero a algún tipo de datos , el significado de la declaración es "agregar tamaño de ( algún tipo de datos ) al valor en la dirección x y almacenar el resultado en la ubicación en la dirección x".
  • Si x es un escalar, el significado de la declaración es "agregue uno al valor en la dirección x y almacene el resultado en la ubicación en la dirección x".

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.

Jeff N
fuente
OKAY. Si xestá en el valor máximo para sus datos y 1se le agrega, entonces da como resultado una salida extraña ( 0), ¿no es un error semántico?
haccks
Considere un odómetro en un vehículo: tiene una serie de ruedas interrelacionadas con los dígitos del 0 al 9 impresos en cada una. La rueda más a la derecha gira más rápido; cuando vuelve de 9 a cero, la rueda de su izquierda inmediata avanza en uno. Cuando esta rueda avanza de 9 a 0, la de su izquierda avanza, y así sucesivamente.
Jeff N
Un tipo de datos es como la rueda de un odómetro: solo puede contener hasta un cierto valor. Cuando se alcanza el valor máximo, el siguiente avance hace que la rueda vuelva a cero. Si se trata de un error semántico o no, depende de las reglas del lenguaje. En este caso, debe consultar el estándar de lenguaje C. No sé exactamente qué dice el estándar del lenguaje C, pero estas son algunas de las opciones. El desbordamiento es: -no es un error; el resultado es cero. -un error; el compilador DEBE generar una excepción de desbordamiento. -INFINIDO; el compilador es libre de hacer lo que quiera.
Jeff N
2
En caso de que a alguien le interese el ejemplo específico, el desbordamiento sin firmar se define como aritmética modular (entonces 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 Nse INT_MAXno es infinita en función de optimización; ver blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H
"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". Me gusta cómo esto tiene un paralelo con los lenguajes naturales. No se puede conocer el significado de algunas frases sin contexto. Por ejemplo, en la frase "Le gustan los plátanos", el significado de "él" depende del contexto.
ymln
21

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.

doctor amor
fuente
@Talespin_Kit significado en lugar de estructura: la lógica es más una abstracción, por ejemplo, P => Q, etc. o !! P = P, pero cuando agregas semántica, las cosas pueden tener sutileza, si P es "feliz", entonces !! P es "I 'm not un-happy "! =" I'm happy "
doctorlove
5
+1 para "Un compilador o intérprete podría quejarse de errores de sintaxis. Sus compañeros de trabajo se quejarán de la semántica".
GeekyJ
11

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í ifconvertirse si, doconvirtiéndose faire, elseconvirtié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!

Basile Starynkevitch
fuente
8

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.

ladrón de chinchetas
fuente
¿Es una conversación entre diferentes personas? ¿O es solo una publicación? No lo entiendo. Por ejemplo, "No tengo idea de lo que se supone que significa lo siguiente. No podría estar más equivocado".
doubleOrt
5

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.

Kobina Ebo
fuente
5
  • Necesita una sintaxis correcta para compilar.
  • Necesita una semántica correcta para que funcione.
el significado importa
fuente
1

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.

BoraKurucu
fuente
1

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.

Hafiz Shehbaz Ali
fuente
1

Entender cómo el compilador ve el código

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.

Entendiéndolo de una manera menos técnica

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.

Vedant Panchal
fuente
Compiladores Este enlace puede ser útil para obtener más información
Vedant Panchal