stringtranslate.com

Especificación del lenguaje de programación

En programación informática , una especificación de lenguaje de programación (o estándar o definición ) es un artefacto de documentación que define un lenguaje de programación para que los usuarios e implementadores puedan ponerse de acuerdo sobre lo que significan los programas en ese lenguaje. Las especificaciones suelen ser detalladas y formales, y las utilizan principalmente los implementadores, y los usuarios se refieren a ellas en caso de ambigüedad; por ejemplo, los usuarios citan con frecuencia la especificación de C++ debido a su complejidad. La documentación relacionada incluye una referencia del lenguaje de programación , que está destinada expresamente a los usuarios, y una justificación del lenguaje de programación, que explica por qué la especificación está escrita como está; estas suelen ser más informales que una especificación.

Normalización

No todos los lenguajes de programación importantes tienen especificaciones, y los lenguajes pueden existir y ser populares durante décadas sin una especificación. Un lenguaje puede tener una o más implementaciones, cuyo comportamiento actúa como un estándar de facto , sin que este comportamiento esté documentado en una especificación. Perl (hasta Perl 5 ) es un ejemplo notable de un lenguaje sin una especificación, mientras que PHP recién se especificó en 2014, después de estar en uso durante 20 años. [1] Un lenguaje puede implementarse y luego especificarse, o especificarse y luego implementarse, o pueden desarrollarse juntos, lo que es una práctica habitual en la actualidad. Esto se debe a que las implementaciones y las especificaciones se controlan entre sí: escribir una especificación requiere indicar con precisión el comportamiento de una implementación, y la implementación verifica que una especificación sea posible, práctica y consistente. Escribir una especificación antes de una implementación se ha evitado en gran medida desde ALGOL 68 (1968), debido a dificultades inesperadas en la implementación cuando se pospone la implementación. Sin embargo, todavía en ocasiones los lenguajes se implementan y ganan popularidad sin una especificación formal: una implementación es esencial para su uso, mientras que una especificación es deseable pero no esencial (informalmente, "el código habla").

ALGOL 68 fue el primer (y posiblemente uno de los últimos) lenguaje importante para el que se realizó una definición formal completa antes de su implementación.

—  CHA Koster , [2]

Formularios

Una especificación de lenguaje de programación puede adoptar varias formas, incluidas las siguientes:

Sintaxis

La sintaxis de un lenguaje de programación representa la definición de palabras aceptables, es decir, parámetros formales y reglas con base en las cuales se decide si un código dado es válido con respecto al lenguaje. En ese sentido, la sintaxis del lenguaje generalmente consiste en una combinación de los tres componentes de construcción siguientes:

La especificación de sintaxis generalmente supone una descripción en lenguaje natural para proporcionar una comprensión moderada. Sin embargo, la representación formal de los componentes antes descritos suele ser parte de la sección, ya que favorece la implementación y aprobación del lenguaje y sus conceptos.

Semántica

Formular una semántica rigurosa de un lenguaje de programación grande, complejo y práctico es una tarea abrumadora incluso para especialistas experimentados, y la especificación resultante puede ser difícil de entender para cualquiera que no sea un experto. Las siguientes son algunas de las formas en que se puede describir la semántica de un lenguaje de programación; todos los lenguajes utilizan al menos uno de estos métodos de descripción, y algunos lenguajes combinan más de uno [5].

Lenguaje natural

La mayoría de los lenguajes más utilizados se especifican mediante descripciones en lenguaje natural de su semántica. Esta descripción suele adoptar la forma de un manual de referencia para el lenguaje. Estos manuales pueden tener cientos de páginas; por ejemplo, la versión impresa de The Java Language Specification, 3rd Ed. tiene 596 páginas.

La imprecisión del lenguaje natural como vehículo para describir la semántica de un lenguaje de programación puede generar problemas a la hora de interpretar la especificación. Por ejemplo, la semántica de los subprocesos de Java se especificó en inglés y más tarde se descubrió que la especificación no proporcionaba una orientación adecuada para los implementadores. [6]

Semántica formal

La semántica formal se basa en las matemáticas. Como resultado, puede ser más precisa y menos ambigua que la semántica dada en lenguaje natural. Sin embargo, a menudo se incluyen descripciones complementarias de la semántica en lenguaje natural para ayudar a comprender las definiciones formales. Por ejemplo, la norma ISO para Modula-2 contiene una definición formal y una definición en lenguaje natural en páginas opuestas.

Los lenguajes de programación cuya semántica se describe formalmente pueden ofrecer muchas ventajas. Por ejemplo:

El soporte automático de herramientas puede ayudar a obtener algunos de estos beneficios. Por ejemplo, un demostrador de teoremas automatizado o un verificador de teoremas puede aumentar la confianza de un programador (o diseñador de lenguajes) en la corrección de las pruebas sobre los programas (o el lenguaje en sí). La potencia y la escalabilidad de estas herramientas varían ampliamente: la verificación formal completa es computacionalmente intensiva, rara vez se escala más allá de programas que contienen unos pocos cientos de líneas [ cita requerida ] y puede requerir una asistencia manual considerable de un programador; las herramientas más livianas, como los verificadores de modelos , requieren menos recursos y se han utilizado en programas que contienen decenas de miles de líneas; muchos compiladores aplican verificaciones de tipos estáticos a cualquier programa que compilan.

Implementación de referencia

Una implementación de referencia es una implementación única de un lenguaje de programación que se designa como autoritaria. El comportamiento de esta implementación se considera que define 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 disputas sobre el significado de un programa se pueden resolver simplemente ejecutando el programa en la implementación de referencia (siempre que la implementación se comporte de manera determinista para ese programa).

Por otra parte, definir 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 confunde las limitaciones de la implementación de referencia con las propiedades del lenguaje. Por ejemplo, si la implementación de referencia tiene un error, entonces ese error debe considerarse un comportamiento autoritario. Otro inconveniente es que los programas escritos en este lenguaje pueden depender de peculiaridades en la implementación de referencia, lo que dificulta la portabilidad entre diferentes implementaciones.

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

Conjunto de pruebas

Para definir la semántica de un lenguaje de programación en términos de un conjunto de pruebas , es necesario escribir una serie de programas de ejemplo en el lenguaje y luego describir cómo deberían comportarse esos programas (quizás escribiendo sus resultados correctos). Los programas, más sus resultados, se denominan "conjunto de pruebas" del lenguaje. Cualquier implementación correcta del lenguaje debe producir exactamente los resultados correctos en los programas del conjunto de pruebas.

La principal ventaja de este enfoque de descripción semántica es que es fácil determinar si una implementación de lenguaje pasa una serie de pruebas. El usuario puede simplemente ejecutar todos los programas de la serie de pruebas y comparar los resultados con los deseados. Sin embargo, cuando se utiliza por sí solo, el enfoque de la serie de pruebas también tiene importantes desventajas. Por ejemplo, los usuarios quieren ejecutar sus propios programas, que no son parte de la serie de pruebas; de hecho, una implementación de lenguaje que solo pudiera ejecutar los programas de su serie de pruebas sería en gran medida inútil. Pero una serie de pruebas no describe, por sí sola, cómo debería comportarse la implementación de lenguaje en cualquier programa que no esté en la serie de pruebas; determinar ese comportamiento requiere cierta extrapolación por parte del implementador, y diferentes implementadores pueden estar en desacuerdo. Además, es difícil utilizar una serie de pruebas para probar un comportamiento que se pretende o se permite que sea no determinista .

Por lo tanto, en la práctica común, los conjuntos de pruebas se utilizan solo en combinación con una de las otras técnicas de especificación del lenguaje, como una descripción en lenguaje natural o una implementación de referencia.

Véase también

Enlaces externos

Especificaciones del idioma

Algunos ejemplos de especificaciones lingüísticas oficiales o borradores:

Notas

  1. ^ Anuncio de una especificación para PHP, 30 de julio de 2014, Joel Marcey
  2. ^ "Una breve historia de Algol68". Archivado desde el original el 10 de agosto de 2006. Consultado el 15 de septiembre de 2006 .
  3. ^ Milner, R. ; M. Tofte ; R. Harper ; D. MacQueen (1997). La definición de ML estándar (revisada) . MIT Press. ISBN 0-262-63181-4.
  4. ^ Kelsey, Richard; William Clinger; Jonathan Rees (febrero de 1998). "Sección 7.2 Semántica formal". Informe revisado 5 sobre el esquema de lenguaje algorítmico . Consultado el 9 de junio de 2006 .
  5. ^ Jones, D. (2008). Formas de especificación del lenguaje (PDF) . Consultado el 23 de junio de 2012 .
  6. ^ William Pugh. El modelo de memoria de Java tiene fallas fatales. Concurrency: Practice and Experience 12(6):445-455, agosto de 2000