transpiler

Build Status

Universal-transpiler

Universal-transpiler is a source-to-source compiler that translates a small subset of several programming languages into several others. It is also able to translate several metasyntax notations, such as EBNF and ABNF.

Universal-transpiler was written as an experimental “proof-of-concept,” so it can only translate relatively simple programs. The translation is not always 100% accurate, but I hope it will still be useful.

The online version of this translator is written in JavaScript, but an experimental version is also being written in Prolog.

A major goal of this project is to translate TypeScript and JavaScript to other languages that compile to C or native code. For example, it’s possible to translate a subset of TypeScript to Zig:

var a = {a1:1,b:2};

var b = function(a1:number,b:number):number{
return a + b;
}; This is the compiler's output:

var a=.{.a1=1,.b=2};
var b=struct{fn function(a1:f64,b:f64)f64{
    return a+b;}}.function;

How to use the online translator

Some supported features

Similarly, it can translate constraint handing rules from Prolog into CLIPS and vice-versa.

Ontology languages

Universal-transpiler can also translate programming languages into the KIF ontology language.

Generating parsers with universal-transpiler

Universal-transpiler can also translate various grammar notations, such as jison, marpa, peg.js, and nearley.

How to use the Prolog translator

The Prolog translator is still unfinished and experimental. You can install the package by typing pack_install(transpiler) in the SWI-Prolog console. Now, you can use the translator to convert JavaScript source code into Lua:

:- use_module(library(transpiler)).
:- set_prolog_flag(double_quotes,chars).
:- initialization(main).

main :- 
	translate("function add(a,b){return a + b;}",javascript,lua,X),
	atom_chars(Y,X),
	writeln(Y).

How to extend the Prolog translator

A limited number of translation rules are provided here, but you can easily add your own rules to transpiler.pl. This is a simplified version of one of its translation rules, implementing the sine function:

%The type of this expression is double.
parentheses_expr(Data,double,sin(Var1_)) -->
    {
		%The parameter of the sine function can be an integer or double.
		Var1 = expr(Data,double,Var1_)
	},
    langs_to_output(Data,sin,[
    ['java','javascript']:
            ("Math",ws,".",ws,"sin",ws,"(",ws,Var1,ws,")"),
    ['lua','python']:
            ("math",python_ws,".",python_ws,"sin",python_ws,"(",python_ws,Var1,python_ws,")"),
    ]).

Other planned features:

Similar projects

There are several other source-to-source compilers and code generators that are similar to this one.

JTransc compiles Java, Kotlin, and Scala into several other programming languages. Pandoc is a universal document converter

This universal code generator is one example.