En informática, las especificaciones formales son técnicas basadas en matemáticas cuyo propósito es ayudar con la implementación de sistemas y software. Se utilizan para describir un sistema, analizar su comportamiento y ayudar en su diseño mediante la verificación de propiedades clave de interés mediante herramientas de razonamiento rigurosas y eficaces. Estas especificaciones son formales en el sentido de que tienen una sintaxis, su semántica cae dentro de un dominio y pueden usarse para inferir información útil.
En cada década que pasa, los sistemas informáticos se han vuelto cada vez más poderosos y, como resultado, se han vuelto más impactantes para la sociedad. Debido a esto, se necesitan mejores técnicas para ayudar en el diseño e implementación de software confiable. Las disciplinas de ingeniería establecidas utilizan el análisis matemático como base para crear y validar el diseño de productos. Las especificaciones formales son una forma de lograr esto en la confiabilidad de la ingeniería de software, como se predijo una vez. Otros métodos, como las pruebas, se utilizan con más frecuencia para mejorar la calidad del código.
Dada tal especificación, es posible utilizar técnicas de verificación formales para demostrar que el diseño de un sistema es correcto con respecto a su especificación. Esto permite que se revisen los diseños de sistemas incorrectos antes de que se hayan realizado inversiones importantes en una implementación real. Otro enfoque es usar pasos de refinamiento probablemente correctos para transformar una especificación en un diseño, que finalmente se transforma en una implementación que es correcta por construcción.
Es importante señalar que una especificación formal no es una implementación, sino que puede usarse para desarrollar una implementación. Las especificaciones formales describen lo que debería hacer un sistema, no cómo debería hacerlo.
Una buena especificación debe tener algunos de los siguientes atributos: adecuada, internamente consistente, inequívoca, completa, satisfecha, mínima
Una buena especificación tendrá:
Una de las principales razones por las que existe interés en las especificaciones formales es que proporcionarán la capacidad de realizar pruebas en implementaciones de software. Estas pruebas pueden usarse para validar una especificación, verificar la corrección del diseño o para probar que un programa satisface una especificación.
Un diseño (o implementación) nunca puede ser declarado "correcto" por sí solo. Solo puede ser "correcto con respecto a una especificación dada". Si la especificación formal describe correctamente el problema a resolver es un tema aparte. También es un tema difícil de abordar, ya que en última instancia se refiere al problema de la construcción de representaciones formales abstractas de un dominio de problema concreto informal, y tal paso de abstracción no es susceptible de prueba formal. Sin embargo, es posible validar una especificación demostrando teoremas de "desafío" con respecto a las propiedades que se espera que muestre la especificación. Si es correcto, estos teoremas refuerzan la comprensión del especificador de la especificación y su relación con el dominio del problema subyacente. De lo contrario, la especificación probablemente deba cambiarse para reflejar mejor la comprensión del dominio de aquellos involucrados en la producción (e implementación) de la especificación.
Los métodos formales de desarrollo de software no se utilizan ampliamente en la industria. La mayoría de las empresas no consideran rentable aplicarlos en sus procesos de desarrollo de software. Esto puede deberse a una variedad de razones, algunas de las cuales son:
Otras limitaciones:
Las técnicas de especificación formal han existido en varios dominios y en varias escalas durante bastante tiempo. Las implementaciones de especificaciones formales diferirán según el tipo de sistema que intenten modelar, cómo se apliquen y en qué punto del ciclo de vida del software se hayan introducido. Estos tipos de modelos se pueden clasificar en los siguientes paradigmas de especificación:
Además de los paradigmas anteriores, hay formas de aplicar ciertas heurísticas para ayudar a mejorar la creación de estas especificaciones. El documento al que se hace referencia aquí analiza mejor la heurística que se debe utilizar al diseñar una especificación. Lo hacen aplicando un enfoque de divide y vencerás.
La notación Z es un ejemplo de un lenguaje de especificación formal líder. Otros incluyen la especificación del lenguaje (VDM-SL) del método de desarrollo de Viena y de la máquina abstracta de notación (AMN) de la B-Método. En el área de servicios web, la especificación formal se utiliza a menudo para describir propiedades no funcionales ( calidad de servicio de los servicios web).
Algunas herramientas son:
Para ver ejemplos de implementación, consulte los enlaces en la sección de herramientas de software.