Frontend vs. Backend Language? What's the difference?
AProVE is able to analyze termination and complexity of different programming languages. Here, we clearly distinguish between two types of languages: frontend languages and backend languages.
Frontend Language
Frontend languages are the programming languages that users write their software in. AProVE can handle programs written in C, Haskell, Prolog and Java by symbolically representing a given program P in a finite graph, called the symbolic execution graph. This graph overapproximates all possible runs of the program P. It builds this graph while taking into account language-specific features of these frontend languages, such as memory handling in C, heap usage in Java, or lazy evaluation in Haskell. Afterwards, AProVE transforms this symbolic execution graph into a backend language that is then analysed for termination and runtime complexity.
Backend Language
Backend languages are analysis-oriented representations designed specifically for automated reasoning. They capture only the essential behavior needed for formal analysis without any syntactic sugar. Examples include term rewrite systems or integer transition systems. These backend languages are not meant for programming by humans, but for enabling powerful, reusable algorithms that prove properties such as termination and complexity.
Advantages
By separating analysis of programs into the analysis of frontend languages and backend languages, we have multiple advantages:
If you are interested in further information regarding the different parts of AProVE or the generation of the symbolic execution graph for each frontend language, then have a look at the reference section.
— The AProVE Team