Si estás aprendiendo un idioma, probablemente hayas escuchado la palabra "sintaxis" y hayas tenido que lidiar con ella todo el tiempo. (Maldito error de sintaxis).
Fue hace unas noches que estaba pensando para mis adentros, nunca seguí en serio los paradigmas y técnicas de programación, y hoy comencé a aprender de los temas más pequeños que siempre escucho (aunque ya los recuerde). Creé este repositorio. El camino de aprendizaje que tomé es característico (en el archivo LEARNING_LIST.md). pasemos, A diferencia de los lenguajes naturales, con los que comunicamos nuestros pensamientos y sentimientos, los lenguajes de programación pueden verse como lenguajes artificiales definidos por hombres y mujeres inicialmente con el propósito de comunicarse con computadoras pero, igualmente importante, para comunicar algoritmos entre personas. .
Por ejemplo, las definiciones del lenguaje constan de tres componentes:
Sintaxis: la sintaxis de un lenguaje de programación es el conjunto de reglas que definen las combinaciones de símbolos que se consideran programas correctamente estructurados en ese lenguaje. La sintaxis de un idioma define su forma superficial. Los lenguajes de programación basados en texto se basan en secuencias de caracteres. La gramática léxica de un lenguaje textual especifica cómo se deben dividir los caracteres en tokens. La sintaxis se refiere a las formas en que se pueden combinar los símbolos para crear oraciones (o programas) bien formados en el lenguaje. La sintaxis define las relaciones formales entre los constituyentes de una lengua, proporcionando así una descripción estructural de las diversas expresiones que componen las cadenas legales en la lengua. La sintaxis se ocupa únicamente de la forma y estructura de los símbolos en un idioma sin tener en cuenta su significado, la sintaxis es el concepto que se refiere únicamente a si la oración es válida o no para la gramática del idioma
Semántica: La semántica trata sobre si la oración tiene o no un significado válido. La semántica revela el significado de cadenas sintácticamente válidas en un idioma. Para los lenguajes naturales, esto significa correlacionar oraciones y frases con los objetos, pensamientos y sentimientos de nuestras experiencias. Para los lenguajes de programación, la semántica describe el comportamiento que sigue una computadora al ejecutar un programa en el lenguaje. Podríamos revelar este comportamiento describiendo la relación entre la entrada y la salida de un programa o mediante una explicación paso a paso de cómo se ejecutará un programa en una máquina real o abstracta. La semántica es el término general para el estudio del significado. En informática, la asignatura de semántica de lenguajes de programación busca dar un significado matemático preciso a los programas.
En los lenguajes naturales, una oración puede ser gramaticalmente correcta pero semánticamente sin sentido. Por ejemplo, la oración:
"El hombre compró el infinito en la tienda."
Esto es gramaticalmente correcto pero no tiene sentido en el mundo real. De manera similar, en los lenguajes de programación, una declaración puede ser sintácticamente correcta pero semánticamente incorrecta porque viola las reglas del lenguaje o su significado previsto.
En la semántica de bajo nivel de la programación, nos preocupa si una declaración que tiene la sintaxis correcta también tiene sentido según el sistema de tipos del lenguaje u otras reglas. Aunque la sintaxis pueda ser válida, el significado semántico de la operación podría no ser válido. El sistema de tipos en lenguajes de tipo estático, como Java, ayuda a aplicar estas reglas antes del tiempo de ejecución, pero los lenguajes de tipo dinámico como JavaScript no siempre aplican estas reglas hasta el tiempo de ejecución.
En JavaScript, que se escribe libremente, es posible que no tengas la protección que viene con un sistema de tipos más estricto, y el lenguaje permitirá ciertas operaciones que no tienen sentido semánticamente. Considere el siguiente código JavaScript:
let name = "Alice"; name = 42; // No error, but semantically this doesn't make sense.
Aquí, la sintaxis es perfectamente válida y JavaScript permite la asignación, pero semánticamente es extraño. Está intentando asignar un número (42) a una variable que presumiblemente está destinada a contener una cadena (nombre). No existe ninguna verificación de tipo en JavaScript que le impida cometer este error, pero es un error semántico de bajo nivel porque es inconsistente con la intención del desarrollador.
Si lo implementamos. Está ejecutado. ¡sin ningún error!
En lenguajes más estrictos, como TypeScript o Java, esto desencadenaría un error de tipo inmediatamente durante la compilación.
TypeScript, un superconjunto de JavaScript, introduce la verificación de tipos para evitar estos problemas semánticos de bajo nivel:
let name: string = "Alice"; name = 42; // Error: Type 'number' is not assignable to type 'string'.
En TypeScript, el compilador detecta el error semántico porque 42 es un número y no se puede asignar a una variable declarada como una cadena. Esta aplicación de tipos protege al desarrollador de errores no deseados.
En JavaScript, para evitar estos problemas semánticos de bajo nivel, los desarrolladores suelen utilizar comprobaciones de tiempo de ejecución:
let name = "Alice"; if (typeof name !== "string") { throw new Error("Expected a string!"); }
Aunque JavaScript no aplica tipos, agregar comprobaciones manuales puede ayudar a evitar errores en los que tipos incorrectos provocan problemas en el programa.
En un nivel superior, la semántica se ocupa de lo que se supone que debe lograr su programa. No se trata solo de si el programa tiene una sintaxis válida o si los tipos se alinean correctamente; se trata de si el programa se comporta de la forma prevista por el desarrollador o resuelve el problema para el que fue diseñado.
Por ejemplo, supongamos que está creando un sistema de negociación de acciones simple. La semántica de alto nivel de su código trata de garantizar que el sistema negocie acciones de la manera correcta, con la lógica empresarial correcta. Incluso si el código no produce errores tipográficos o de sintaxis, aún así podría no cumplir con la funcionalidad prevista.
Veamos un ejemplo de JavaScript de semántica de alto nivel utilizando un escenario de negociación de acciones simplificado:
let openTrade = { symbol: "EURUSD", direction: "buy", profit: 100 }; function closeTrade(trade) { if (trade.profit >= 50) { console.log(`Closing trade for ${trade.symbol} with profit of ${trade.profit}`); } else { console.log(`Trade for ${trade.symbol} is not ready to close.`); } } // Check if a trade is open for EURUSD and close it if the profit target is reached. closeTrade(openTrade);
La sintaxis es correcta y el programa se ejecuta sin errores. Sin embargo, imagine que ahora introducimos un error en un nivel superior, como ingresar accidentalmente dos operaciones para el mismo símbolo, lo que viola las reglas comerciales del sistema.
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 }, { symbol: "EURUSD", direction: "sell", profit: 20 } ]; // Check all trades and close any that hit their profit target. openTrades.forEach(trade => closeTrade(trade));
Aquí, ambas operaciones se procesan de forma independiente, pero el sistema termina con dos operaciones en el mismo símbolo, una en la dirección de compra y otra en la dirección de venta. Esto rompe la regla comercial de alto nivel de que solo debemos tener una operación abierta por símbolo en un momento dado.
Aunque el código se ejecuta sin errores de sintaxis o tipo, es semánticamente incorrecto en un alto nivel. La lógica del sistema debería haber garantizado que solo pudiera estar activa una operación por símbolo a la vez. Este error probablemente tendría consecuencias no deseadas en un sistema comercial del mundo real, como pérdidas financieras.
Para solucionar este problema semántico de alto nivel, deberá ajustar la lógica para garantizar que solo haya una operación abierta para un símbolo en particular:
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 } ]; function openNewTrade(newTrade) { // Ensure no other trades are open for the same symbol. const existingTrade = openTrades.find(trade => trade.symbol === newTrade.symbol); if (!existingTrade) { openTrades.push(newTrade); console.log(`Opened new trade for ${newTrade.symbol}`); } else { console.log(`Cannot open a new trade for ${newTrade.symbol}, trade already exists.`); } } openNewTrade({ symbol: "EURUSD", direction: "sell", profit: 0 });
Aquí, la lógica garantiza que no se pueda abrir una nueva operación si ya hay una operación activa para el mismo símbolo. Esta es una solución semántica de alto nivel porque aborda la lógica empresarial central que debe seguir el programa, en lugar de un problema de sintaxis o tipo.
Esta fue solo información básica sobre cada uno. Para obtener más información, puede leer estos artículos:
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3