  A transpiler converts code from one programming language to another. Many
practical uses of transpilers require the user to be able to guide or customize
the program produced from a given input program. This customizability is
important for satisfying many application-specific goals for the produced code
such as ensuring performance, readability, maintainability, compatibility, and
so on. Conventional transpilers are deterministic rule-driven systems often
written without offering customizability per user and per program. Recent
advances in transpilers based on neural networks offer some customizability to
users, e.g. through interactive prompts, but they are still difficult to
precisely control the production of a desired output. Both conventional and
neural transpilation also suffer from the "last mile" problem: they produce
correct code on average, i.e., on most parts of a given program, but not
necessarily for all parts of it. We propose a new transpilation approach that
offers fine-grained customizability and reusability of transpilation rules
created by others, without burdening the user to understand the global
semantics of the given source program. Our approach is mostly automatic and
incremental, i.e., constructs translation rules needed to transpile the given
program as per the user's guidance piece-by-piece. We implement the transpiler
as a tool called DuoGlot, which translates Python to Javascript programs, and
evaluate it on the popular GeeksForGeeks benchmarks. DuoGlot achieves 90%
translation accuracy and so it outperforms all existing translators, while it
produces readable code. We evaluate DuoGlot on two additional benchmarks,
containing more challenging and longer programs, and similarly observe improved
accuracy.
