NOTE: To use the advanced features of this site you need javascript turned on.

Home Knowledge Base Software Migrators

Software Migrators

The need to migrate a software application to a new programming language appears in several cases. One of these cases is that the codebase of the application has outgrown the possibilities of the source language and its tools, maintenance and development of new features becoming problematic. Another scenario is that vendor support is no longer satisfying or that the specialists for the source language have become/are about to become scarce. Usually all these aspects are interlinked and tend to occur simultaneously, due to the inherent life-cycle of programming languages.

The following figure illustrates vendor support and specialists' availability over time for a typical programming language.



The concept of software migrator derives from the one of language migration, which refers to a language transformation without altering semantics. A software migrator is a tool that translates sentences written in a source language into the semantically equivalent sentences in a target language. It also emulates the semantic dependencies generated by the libraries of the application system.

The theoretical background of software migrators is a generalization of the compilers theory. A compiler becomes a particular case of software migrator that produces sentences in a low-level language (assembly or machine code).

Many issues that a software migrator must solve depend on the characteristics of the source and target languages. These characteristics include:

  • generations: for example, migrating from a structured language to an object-oriented one must provide mechanisms for fully make use of encapsulation, abstraction, polymorphism and inheritance

  • type systems: migrating from a weakly/dynamically typed language to a strongly/statically typed one requires type inference algorithms

  • execution model: migrating from an interpreted language to a compiled one means that the migrator must handle dynamic constructs (variables, procedures, dependencies), error reporting paradigms etc.