Como engenheiro de software, escrevo muitos códigos para produtos industriais. Coisas relativamente complicadas com classes, threads, alguns esforços de design, mas também alguns compromissos de desempenho. Eu faço muitos testes e estou cansado de testar, então fiquei interessado em ferramentas formais de prova, como Coq, Isabelle ... Posso usar uma delas para provar formalmente que meu código está livre de erros e está pronto com isso? - mas cada vez que verifico uma dessas ferramentas, deixo de me convencer de que elas são utilizáveis na engenharia de software cotidiana. Agora, isso poderia ser apenas eu, e estou procurando dicas / opiniões / idéias sobre isso :-)
Especificamente, tenho a impressão de que fazer com que uma dessas ferramentas funcione para mim exigiria um grande investimento para definir adequadamente para o provador os objetos, métodos ... do programa em consideração. Então eu me pergunto se o provador não ficaria sem força, dado o tamanho de tudo o que teria que lidar. Ou talvez eu tivesse que me livrar dos efeitos colaterais (essas ferramentas de teste parecem se sair muito bem com linguagens declarativas) e me pergunto se isso resultaria em "código comprovado" que não poderia ser usado porque não seria rápido ou pequeno o suficiente. Além disso, não tenho o luxo de alterar a linguagem com a qual trabalho, ela precisa ser Java ou C ++: não posso dizer ao meu chefe que vou codificar no OXXXml a partir de agora, porque é a única linguagem em que posso provar a correção do código ...
Alguém com mais experiência em ferramentas formais de prova pode comentar? Mais uma vez - eu AMO usar uma ferramenta formal, provador, eu acho que eles são grandes, mas tenho a impressão de que eles estão em uma torre de marfim que eu não posso chegar da vala humilde de Java / C ++ ... (PS: I Também AMO Haskell, OCaml ... não entendi errado: sou fã de linguagens declarativas e provas formais, só estou tentando ver como eu poderia realisticamente tornar isso útil para a engenharia de software)
Atualização: Como isso é bastante amplo, vamos tentar as seguintes perguntas mais específicas: 1) existem exemplos de uso de provadores para provar a exatidão de programas industriais Java / C ++? 2) Coq seria adequado para essa tarefa? 3) Se Coq for adequado, devo escrever o programa em Coq primeiro e gerar C ++ / Java a partir de Coq? 4) Essa abordagem poderia lidar com otimizações de encadeamento e desempenho?