  While many mainstream languages such as Java, Python, and C# increasingly
incorporate functional APIs to simplify programming and improve
parallelization/performance, there are no effective techniques that can be used
to automatically translate existing imperative code to functional variants
using these APIs. Motivated by this problem, this paper presents a
transpilation approach based on inductive program synthesis for modernizing
existing code. Our method is based on the observation that the overwhelming
majority of source/target programs in this setting satisfy an assumption that
we call trace-compatibility: not only do the programs share syntactically
identical low-level expressions, but these expressions also take the same
values in corresponding execution traces. Our method leverages this observation
to design a new neural-guided synthesis algorithm that (1) uses a novel neural
architecture called cognate grammar network (CGN) and (2) leverages a form of
concolic execution to prune partial programs based on intermediate values that
arise during a computation. We have implemented our approach in a tool called
NGST2 and use it to translate imperative Java and Python code to functional
variants that use the Stream and functools APIs respectively. Our experiments
show that NGST2 significantly outperforms several baselines and that our
proposed neural architecture and pruning techniques are vital for achieving
good results.
