Semantics & implementation of computational software families - software development as an inverse process
2017-03-14T05:00:26Z (GMT) by
Software development is generally thought of as a “forward problem”, where increments (revisions) of software are developed, often iteratively, to satisfy requirements. However, a dichotomy exists between “developing efficient” programs, and “efficiently developing” programs. To “develop efficiently”, programmers may tend to emphasise on program correctness over program run-time efficiency. As the complexity of the problem domain and hardware increases, managing software complexity, and consequently correctness, becomes increasingly difficult. To “efficiently develop efficient programs” requires the ability to change flow control and/or architecture whilst retaining the ability to prove its correctness. Moreover, ideally these changes are automated, without requiring a programmer to re-introduce optimisations lost by the language constructs used to manage complexity. <br> <br> To bridge this dichotomy we propose a new notion – that software development is actually an “inverse problem”. By considering increments as parameters to the inverse process, software development becomes the endeavour to answer the question “which increments best satisfy the requirements?” Software development as an inverse process has a compelling property – the engineering process is mathematically described, underpinned by inverse theory and inverse methods that are well understood. Specifically we apply a formulation of inversion to software decomposition, where the approach to software decomposition is determined by the act of parameterisation in the inversion process. Further, seemingly fine-grained, stakeholder-specified features are formally mapped to both the intended modularity (one side of the dichotomy) and for example, the intended computations (the other side of the dichotomy). We provide this mapping within the one semantic framework, which then permits us to automate changes, shifting a program written on one side of the dichotomy to the other. To achieve this, we model the development process as a Bayesian inference, seeking to discover posterior variants given application data. This is hence a contribution towards continuum rather than a logical or empirical approach to reasoning about programs. <br> <br> This work is a treatise of mathematical foundations of programming languages given a formal inverse framing to software development. A new monadic minimal machine – Variational Execution, provides the basis for the one semantic framework. A new extension to a C-based programming language – COMputational ASpectS (COMPASS) is given as both formal semantics and as a tool.