Especificación del lenguaje de programación, Sintaxis, Semántica



En informática, una especificación de lenguaje de programación es un artefacto que define un lenguaje de programación para que los usuarios y los implementadores pueden ponerse de acuerdo sobre cuáles son los programas en ese idioma significa.

Una especificación del lenguaje de programación puede tomar varias formas, incluyendo las siguientes:

  • Una definición explícita de la sintaxis y la semántica del lenguaje. Mientras que la sintaxis se especifica comúnmente usando una gramática formal, definiciones semánticas pueden ser escritos en un lenguaje natural, o una semántica formal.
  • Una descripción del comportamiento de un traductor para el idioma. La sintaxis y la semántica de la lengua tiene que ser inferido a partir de esta descripción, que puede estar escrito en un lenguaje natural o formal.
  • Un modelo de aplicación, a veces escrito en el idioma que se especifica. La sintaxis y la semántica de la lengua son explícitas en el comportamiento de la aplicación del modelo.

Sintaxis

La sintaxis de un lenguaje de programación se describe generalmente usando una combinación de los dos componentes siguientes:

  • una expresión regular describiendo sus lexemas y
  • una gramática libre de contexto que describe cómo lexemas pueden combinarse para formar un programa sintácticamente correcta.

Semántica

La formulación de un riguroso semántica de un lenguaje de programación grande y compleja, práctica es una tarea de enormes proporciones, incluso para especialistas experimentados, y la especificación resultante puede ser difícil para cualquier persona, pero los expertos a entender. Las siguientes son algunas de las formas en que la semántica del lenguaje de programación se pueden describir; todos los idiomas utilizan al menos uno de estos métodos de descripción, y algunos idiomas se combinan más de una

  • Lenguaje natural: Descripción de lenguaje natural humano.
  • Semántica formal: Descripción de la matemática.
  • Implementaciones de referencia: Descripción de programa informático
  • Suites de prueba: Descripción de ejemplos de programas y sus comportamientos esperados. Aunque pocas especificaciones del lenguaje parten de esta forma, la evolución de algunas especificaciones del lenguaje ha sido influenciada por la semántica de una serie de pruebas.

El lenguaje natural

Idiomas más utilizados se especifican mediante descripciones en lenguaje natural de su semántica. Esta descripción general toma la forma de un manual de referencia para el idioma. Estos manuales se pueden ejecutar a cientos de páginas, por ejemplo, la versión impresa de la especificación del lenguaje Java, 3 ª ed. es 596 páginas de largo.

La imprecisión del lenguaje natural como un vehículo para la descripción de la semántica del lenguaje de programación puede conducir a problemas con la interpretación de la especificación. Por ejemplo, la semántica de hebras Java se especificaron en Inglés, y más tarde se descubrió que la especificación no proporciona una orientación adecuada para los implementadores.

Semántica formal

Semánticas formales se basan en las matemáticas. Como resultado de ello, pueden ser más preciso y menos ambiguo que la semántica dadas en lenguaje natural. Sin embargo, las descripciones en lenguaje natural suplementarios de la semántica se incluyen a menudo para ayudar a la comprensión de las definiciones formales. Por ejemplo, el estándar ISO para Modula-2 contiene una definición formal y un lenguaje natural en las páginas opuestas.

Lenguajes de programación cuya semántica se describen formalmente pueden obtener muchos beneficios. Por ejemplo:

  • Semántica formal permiten pruebas matemáticas de la corrección del programa;
  • Semántica formal de facilitar el diseño de sistemas de tipo y pruebas acerca de la solidez de los sistemas de tipo;
  • Semánticas formales pueden establecer normas inequívocas y uniforme para las implementaciones de una lengua.

Apoyo automático herramienta puede ayudarle a darse cuenta de algunos de estos beneficios. Por ejemplo, un demostrador de teoremas o teorema corrector automatizado puede aumentar la confianza de un programador en la corrección de las pruebas sobre los programas. El poder y la escalabilidad de estas herramientas varía ampliamente: verificación formal completa es computacionalmente intensivas, raramente escalas más allá de los programas que contienen unos pocos cientos de líneas y puede requerir asistencia manual considerable de un programador; herramientas más ligeras tales como comprobadores de modelos requieren menos recursos y se han utilizado en los programas que contienen decenas de miles de líneas, muchos compiladores aplican controles de tipo estático a cualquier programa que recopile.

Implementación de referencia

Una implementación de referencia es una implementación de un lenguaje de programación que se designa como autoridad. El comportamiento de esta aplicación se lleva a cabo para definir el comportamiento adecuado de un programa escrito en el lenguaje. Este enfoque tiene varias propiedades atractivas. En primer lugar, es preciso, y no requiere interpretación humana: las controversias sobre el significado de un programa pueden resolverse simplemente mediante la ejecución del programa en la implementación de referencia.

Por otra parte, la definición de la semántica del lenguaje a través de una implementación de referencia también tiene varios inconvenientes potenciales. El principal de ellos es que se confunde limitaciones de la implementación de referencia con las propiedades de la lengua. Por ejemplo, si la implementación de referencia tiene un error, a continuación, que el fallo debe ser considerado como un comportamiento autorizada. Otro inconveniente es que los programas escritos en este idioma pueden depender de caprichos en la implementación de referencia, lo que dificulta la portabilidad entre diferentes implementaciones.

Sin embargo, varios idiomas han utilizado con éxito el enfoque de implementación de referencia. Por ejemplo, el intérprete de Perl se considera para definir el comportamiento autorizada de programas en Perl. En el caso de Perl, el modelo de código abierto de distribución de software ha contribuido al hecho de que nadie ha producido otra implementación de la lengua, por lo que los temas relacionados con el uso de una implementación de referencia para definir la semántica del lenguaje son discutibles.

Test Suite

Definir la semántica de un lenguaje de programación en función de un conjunto de pruebas consiste en escribir una serie de programas de ejemplo en el idioma, y luego describe cómo esos programas deben comportarse - quizás por escribir sus salidas correctas. Los programas, además de sus productos, se denominan "banco de pruebas" de la lengua. Cualquier implementación del lenguaje correcto, entonces debe producir exactamente los resultados correctos en los programas de la suite de prueba.

La principal ventaja de este enfoque a la descripción semántica es que es fácil de determinar si una implementación del lenguaje pasa a una serie de pruebas. El usuario sólo puede ejecutar todos los programas de la suite de prueba, y comparar los resultados con los resultados deseados. Sin embargo, cuando se utiliza por sí mismo, el enfoque conjunto de pruebas tiene importantes desventajas también. Por ejemplo, los usuarios quieren ejecutar sus propios programas, que no son parte del conjunto de pruebas y, de hecho, una implementación del lenguaje que sólo puede ejecutar los programas en su conjunto de pruebas sería en gran medida inútil. Sin embargo, un conjunto de pruebas no significa, por sí mismo, describa cómo la implementación del lenguaje debe comportarse en cualquier programa no está en el banco de pruebas, para determinar que la conducta requiere un poco de extrapolación por parte del implementador, y los diferentes ejecutores puede estar en desacuerdo. Además, es difícil de usar un banco de pruebas para probar el comportamiento que se pretende o se deja que ser no determinista.

Por lo tanto, en la práctica común, conjuntos de pruebas sólo se utilizan en combinación con cualquiera de las otras técnicas de especificación del lenguaje, como un lenguaje de descripción física o una implementación de referencia.