2010-07-02 7 views
15

Muchos idiomas (quizás todos ellos) están diseñados para facilitar la escritura de programas. Todos ellos tienen dominios diferentes y pretenden simplificar el desarrollo de programas en estos dominios (C facilita el desarrollo de programas de bajo nivel, Java facilita el desarrollo de la lógica empresarial compleja, etc.). Quizás se sacrifiquen otros propósitos en aras de escribir y mantener programas de una manera más fácil, más natural, menos propensa a errores.Idiomas específicamente diseñados para facilitar la verificación estática

¿Hay algún idioma específicamente diseñado para verificar el código fuente, es decir. análisis estático - ¿más fácil? Por supuesto, la capacidad para escribir programas comunes para máquinas modernas también debería persistir.

+0

¿Se refiere a un lenguaje diseñado para hacer análisis estático o para ser más fácil de analizar a través de una herramienta? Mi respuesta parece diferir de lo que otras personas quieren decir, quizás estoy equivocado, pero volviendo a leer la pregunta, hay lugar para esta ambigüedad. – jdehaan

+0

@jdehaan, para hacerlo más fácil a través de una herramienta. En otras palabras, para facilitar el análisis de los programas * implementados en ese idioma *. No es "un lenguaje para implementar herramientas de verificación estáticas". –

+0

Ok gracias por precisar, luego ignore mi respuesta, no es útil para usted, y además los idiomas que cité son altamente experimentales y no son útiles para otras cosas que no sean el trabajo teórico. Lo dejo tal vez alguien lo encuentre interesante :-) – jdehaan

Respuesta

4

Uno de los objetivos de diseño de Ada era respaldar una cantidad determinada de verificación formal. Fue moderadamente exitoso, pero la verificación no despegó exactamente como lo estaban esperando. Por suerte, Ada es buena para mucho más que eso. Lamentablemente, eso tampoco lo ha ayudado mucho ...

Hay un subconjunto de Ada llamado Spark que lo mantiene vivo hoy. Praxis vende una suite de desarrollo construida a su alrededor.

1

Hay SAIL, el lenguaje estático Análisis Intermedio o Flexibo

+0

El propósito de " Los "idiomas intermedios" suelen mediar entre diferentes "lenguajes de producción" y herramientas de verificación. Esto no mejora la verificación, ya que no restringe los programas originales de ninguna manera. –

1

No he utilizado yo mismo, así que no puede hablar con cualquier autoridad, pero entiendo que el lenguaje de programación Eiffel fue diseñado para utilizar Código por Contracts, lo que facilitaría el análisis estático. No sé si eso cuenta o no.

+0

La especificación de contratos está relacionada (y, tal vez, es necesaria), pero no es suficiente para los idiomas que solicito. –

2

¿Hay algún idioma específicamente diseñado para facilitar la verificación del código fuente?

Este fue un objetivo vago de los lenguajes CLU y ML, pero el único diseño de lenguaje que conozco que toma muy en serio la verificación estática es Spark Ada.

El lenguaje de comandos guardados de Dijkstra (como se describe en Disciplina de programación) se diseñó para admitir la verificación estática, pero se suponía que explícitamente no debía implementarse.

El lenguaje Promela de Gerard Holzmann también fue diseñado para el análisis estático por el verificador de modelos SPIN, pero nuevamente no es ejecutable.

1

Uno tiene dos problemas para "facilitar la verificación del código fuente". Uno es los idiomas en los que no se hacen cosas groseras, como casos arbitrarios (como C). Otro es que especifica lo que quiere verificar, para eso necesita un buen lenguaje de aserciones.

Si bien muchos idiomas han propuesto tales aserciones en los idiomas, creo que la comunidad EDA ha estado aplicando el límite de manera más efectiva con las especificaciones temporales. El "Lenguaje de especificación de propiedad" es un estándar; Puede obtener más información en P1850 Standard for PSL: Property Specification Language (IEEE-1850). Una idea detrás de PSL es que puede agregarlo a los idiomas EDA existentes; Creo que la comunidad de EDA se ha ido incorporando a los lenguajes de EDA a medida que pasa el tiempo.

A menudo he deseado algo como PSL para incrustar en el software de computadora convencional.

2

Auditors en el lenguaje E proporcionan un medio integrado de escritura de análisis de código dentro del lenguaje mismo y requieren que alguna sección de código pase alguna comprobación estática.También podría estar interesado en la parte del trabajo relacionada con el trabajo.

0

La verificación estática es un mal comienzo para esta tarea. Se basa en la suposición de que es posible verificar la corrección del programa automáticamente. No es factible en el mundo real, y esperar que el programa verifique código arbitrariamente complejo sin ningún indicio es simplemente tonto. Por lo general, el software para la verificación estática termina requiriendo sugerencias en todo el código fuente, y al final genera muchos falsos positivos y falsos negativos. Tiene algún nicho, pero eso es todo. (Véase la introducción a "Types and programming languages" de Pierce)

Si bien este tipo de herramientas fueron desarrolladas por ingenieros para sus propios propósitos simples, una verdadera solución se ha estado cocinando en una academia. Se descubrió que los tipos de lenguajes de programación tipados de forma estática son equivalentes a los enunciados lógicos dado que todo transcurre sin problemas y el lenguaje no tiene ningún tipo de mal comportamiento. Esto se llama "Curry-Howard correspondence", y la incrustación de lógica en tipos es "Brouwer-Heyting-Kolmogorov logic". Las pruebas más potentes solo son posibles en los idiomas con tipos potentes: dependent types. Si olvidamos toda esta terminología por un tiempo, esto significa que podemos escribir programs that carry proofs de su propia corrección, y estas pruebas se verifican mientras el programa se compila, sin ningún archivo ejecutable dado en caso de falla.

El lado positivo de este enfoque es que nunca obtienes ningún false negatives, es decir, se garantiza que el programa compilado funciona correctamente de acuerdo con las especificaciones. Incluso sin pruebas adicionales sobre la especificación, los programas en idiomas de tipo dependiente son menos propensos a errores, porque las divisiones por cero, las excepciones no controladas y los desbordamientos simplemente nunca terminan en un programa ejecutable.

Escribir estas pruebas a mano siempre es tedioso. Para eso hay "tactics", es decir, programas que generan pruebas de corrección. Estos son casi equivalentes a los programas de verificación estática, pero, a diferencia de ellos, son necesarios para generar pruebas formales.

Hay una variedad de lenguajes de tipo dependientemente-para diferentes propósitos: Coq, Agda, Idris, Epigram, etc. Cayenne

tácticas se implementan en Coq, y probablemente varios otros idiomas. También Coq es el más maduro de todos, con infraestructura que incluye bibliotecas como Bedrock.

En el caso de la extracción de código C a partir Coq no es suficiente para sus necesidades, puede utilizar ATS, el cual está a la par en el rendimiento con C.

Haskell emplea forma débil de Curry-Howard correspondencia: funciona bien, a menos que comiences a escribir programas fallidos o en bucle continuo. En caso de que sus requisitos no sean tan difíciles de escribir pruebas formales, considere usar Haskell.

Cuestiones relacionadas