Siempre he pensado que referirse a la sintaxis de un idioma era lo mismo que referirse a la semántica de un idioma. Pero me han informado que aparentemente ese no es el caso. ¿Cual es la diferencia?
Siempre he pensado que referirse a la sintaxis de un idioma era lo mismo que referirse a la semántica de un idioma. Pero me han informado que aparentemente ese no es el caso. ¿Cual es la diferencia?
Respuestas:
Semántica ~ Significado
Sintaxis ~ Representación simbólica
Por lo tanto, dos programas escritos en diferentes idiomas podrían hacer lo mismo (semántica), pero los símbolos utilizados para escribir el programa serían diferentes (sintaxis).
Un compilador verificará su sintaxis por usted (errores de tiempo de compilación) y derivará la semántica de las reglas del lenguaje (asignando la sintaxis a las instrucciones de la máquina, por ejemplo), pero no encontrará todos los errores semánticos (errores de tiempo de ejecución, por ejemplo, calcular el resultado incorrecto porque el código dice agregar 1 en lugar de agregar 2).
x + y
cuando no hay un +
operador apropiado para esos operandos). Agregar 1 en lugar de 2 es lo que llamaría un error lógico .
En realidad no hay dos niveles sino tres:
i
y f
produce if
)if
, (
, 42
, ==
, answer
y )
produce una sentencia condicional)ValidIdentifier
terminal, que podría definirse como algo así ![AnyKeyword] [Identifier]
(estoy usando notación similar a PEG aquí). No necesita un pase de lexing por separado para dicho idioma. Ver, por ejemplo, analizadores C ++ basados en GLR.
La semántica describe las entidades lógicas de un lenguaje de programación y sus interacciones. La sintaxis define cómo se expresan en caracteres.
Por ejemplo, el concepto de aritmética de puntero es parte de la semántica de C; La forma en que los operadores +
y -
se pueden utilizar para expresar operaciones de puntero son parte de su sintaxis.
A veces, dos lenguajes comparten parte de su semántica, pero la sintaxis difiere enormemente (por ejemplo, C # y VB.NET: ambos usan tipos de valores y tipos de referencia, pero los caracteres que escribe para definirlos son diferentes); en otros casos, dos lenguajes son sintácticamente similares, pero la semántica no coincide (considere Java vs. JavaScript, donde las similitudes a menudo confunden a los principiantes).
La sintaxis es cómo organizar las fichas de un idioma. La semántica es lo que significan esos tokens (generalmente, lo que significa un arreglo particular de tokens).
No especificó si solo se refiere a los lenguajes de programación o a los lenguajes generales utilizados en la programación, por lo que mi respuesta es sobre lenguajes de datos (como XML, RDF, sistemas de tipo de datos, etc.):
Brian L. Meek en sus siete reglas de oro para producir estándares independientes del idioma (1995) escribe que "la sintaxis de un idioma puede ser la semántica de otro" . Se refiere a las palabras "sintaxis" y "semántica" utilizadas en la descripción de los datos: por lo tanto, si se topa con estas palabras en una especificación de algún formato de datos, debería reemplazar ambas palabras con "Potrzebie" para dejar en claro que debe resolver el significado para ti
La relación entre sintaxis y semántica, al menos en datos exactamente especificados, se puede describir mejor con el término "codificación" . La semántica está codificada en sintaxis. Como las grabaciones se pueden anidar, la sintaxis de un idioma es la semántica de otro. Si uno va más allá del ámbito de los datos, este anidamiento puede ser prácticamente infinito, como lo describe Umberto Eco como "semiosis ilimitada".
Para dar un ejemplo:
La gente generalmente se detiene en algún nivel y lo toma como semántico, pero al final no hay semántica final a menos que algún ser humano interprete los datos en su mente. Tan pronto como uno intenta expresar semántica en forma de datos, se convierte en sintaxis.
Si se puede describir en BNF (Backus-Naur Form) o algo similar, es la sintaxis. Si no puede, no lo es.
La semántica, por otro lado, trata sobre el significado de un programa (u otro fragmento de código fuente).
Y a veces la línea entre los dos puede ser borrosa.
Una forma de entender la distinción es observar los tipos de errores que se obtienen cuando la sintaxis o semántica de su programa es incorrecta.
Un error de sintaxis es una falla del código fuente para que coincida con la gramática del lenguaje, por ejemplo, no tener un punto y coma donde se requiere uno.
Un error semántico es una falla para satisfacer otros requisitos de lenguaje (lo que C, por ejemplo, llama "restricciones"); Un ejemplo podría ser escribir x + y
dónde x
y y
son de tipos incompatibles. La gramática del lenguaje le dice que parece una adición something + something
, pero no es lo suficientemente potente como para expresar los requisitos sobre los tipos de operandos izquierdo y derecho.
(Los errores lógicos, como el uso de 1 donde 2 sería correcto, generalmente no son detectables por el compilador, aunque en algunos casos un compilador puede advertir sobre código cuestionable).
La sintaxis es lo que dicen los símbolos (léxicos). La semántica es lo que significan.
Considerar:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Sintaxis diferente, misma semántica.
C #: left_value / right_value
VB.NET: left_value / right_value
- Misma sintaxis, semántica diferente (para enteros).
La sintaxis es la disposición gramatical de las palabras en una oración, es decir, el orden de las palabras.
(Inglés) ' cat dog boy ' y (programación) ' hi.5 ' no es sintácticamente correcto.
(Inglés) ' cat hugs boy ' y (programación) '* 3.2 * 5 *' es sintácticamente válido.
La semántica estática es si las declaraciones sintácticamente válidas tienen algún significado.
(Inglés) ' I are big ' (programación) (python) ' 3 +' hi ' ' es sintácticamente correcto pero tiene un error semántico estático.
Semántica es el significado asociado con una cadena de símbolos sintácticamente correcta sin error semántico estático, es decir, la oración es sintácticamente y semánticamente correcta, pero su significado puede no ser el que se pretendía.
(Inglés) " Los aviones voladores pueden ser peligrosos " pueden tener dos significados, es decir, volar aviones puede ser peligroso o los aviones que vuelan pueden ser peligrosos.
(Programación) 'la computadora no generará ningún mensaje de error, pero no hará lo que usted le dijo que hiciera; hará algo más.
Fuente : MIT 6.00.1
La sintaxis se refiere a las reglas formales que rigen la construcción de declaraciones válidas en un idioma. La semántica se refiere al conjunto de reglas que dan el significado de una declaración.
Los errores debidos a la sintaxis se producen en un programa cuando se violan o utilizan incorrectamente los ruelles del lenguaje de programación. Los errores debidos a la semántica ocurren en un programa cuando las declaraciones no son significativas.
El orden de las palabras es el principio básico de la sintaxis, quienes intentan comprender lo que está escrito usan las claves sintácticas del orden de las palabras para ayudar a dar estructura y significado a la oración. La semántica es una interpretación individual del significado de una "oración" basada en su conocimiento previo. Por lo tanto, una oración que aparentemente no tiene sentido sintáctico, puede tener significado cuando se utilizan señales semánticas.
La sintaxis solo se refiere a lo que es lingüísticamente y gramaticalmente correcto. La semántica requiere todos los conocimientos previos que, y está mucho más allá de cualquier cosa que sea específica del idioma.
La frase "Bebidas de leche para bebés" no tiene un significado sintáctico, pero a través de la semántica la mayoría de las personas lo interpretaría como "Bebidas de leche para bebés" ya que nuestro conocimiento previo nos dice que un bebé bebe leche y, por lo tanto, podemos encontrar un significado a partir de palabras clave
La sintaxis y la semántica es como estrategia y táctica o izquierda y derecha .
No son conceptos universales realmente independientes, sino un par de palabras relacionadas que, cuando estás en un contexto particular, indican direcciones opuestas. Pero lo mismo que es la estrategia en una escala son las tácticas en otra.
Entonces, si está escribiendo código en un idioma, la sintaxis es el idioma que está utilizando y el comportamiento deseado es la semántica. Pero si está implementando, o discutiendo, el compilador para ese lenguaje, entonces la sintaxis es la gramática y quizás el sistema de tipos y la semántica todo lo que se construye sobre eso. Y así.
La sintaxis es lo que la computadora entiende, la semántica es lo que el humano entiende.
Un compilador / intérprete no se preocupa en absoluto por su diseño, y en cualquier código compilado a nivel de máquina le costará mucho deducir el diseño. Los desarrolladores se preocupan por el diseño porque un buen diseño consiste en reducir la complejidad al abstraer comportamientos e interacciones complejas, y diferentes tipos de problemas se prestan a diferentes semánticas. La elección del lenguaje depende en gran medida de cuán fácil y eficientemente se pueda expresar la semántica que desea utilizar en su sintaxis.
Muy breve ejemplo con "plain c":
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
En este ejemplo, la sintaxis para el token "-" es la misma, pero tiene un significado diferente ("semántico"), dependiendo de dónde se use.
En la asignación "x", "-" significa la operación "resta", en la asignación "y", "-" significa la operación "signo negativo".
-
operadores son el mismo token , pero son sintácticamente diferentes, porque se usan en diferentes contextos. 0 - 1
coincide con la regla de sintaxis additive-expression: additive-expression - multiplicative-expression
, mientras que - 1
coincide con la regla de sintaxis unary-expression: unary-operator cast-expression
(referencia: estándar C99).
-
operadores es sintáctica, no solo semántica (aunque también tienen una semántica diferente). La sintaxis está definida por la gramática del lenguaje, y los dos operadores se especifican en diferentes secciones de la gramática. Consulte el borrador N1570 , sección 6.5.3 para operadores unarios y 6.5.6 para operadores aditivos. (Por cierto, si vas a usar un ejemplo de C, probablemente debería ser correcto; void main()
debería serlo int main(void)
, y te estás perdiendo #include <stdio.h>
y cualquier encabezado que declaregetch