Kilka razy zdarzało mi się, że tworzę program w jakimś języku czy jakiejś technologii, a jakiś czas później chcę mieć taki sam program w innej technologii. Czasami zdarza się, że już od początku chciałbym mieć dwa takie same programy, gdzie jeden jest na przykład w Java, a drugi w C#, a oba programy robią dokładnie to samo.
W biznesie to też się zdarza, np. jest portal webowy, a potem apka instalowana na telefonie (i nie jest to PWA, ani apka będąca pełnoekranową przeglądarką webową). Abo choćby przeglądarki internetowe, taka sama przeglądarka jest na PC, ale też jest na iOS (inny GUI, ale funkcjonalność podobna).
Moim zdaniem, w większości przypadków źródła programu można podzielić na dwie części, pierwsza to cześć "obliczeniowa", czyli cała logika, która jest taka sama, niezależnie od tego, w czym program jest zrobiony i to tak szacuję, jest 90% całego projektu. Dopiero pozostałe 10% to część "interfejsowa", czyli wytwarzanie GUI, odczytywanie zdarzeń z GUI, z bazy danych, połączenia sieciowe itp.
Taki przykład z życia wzięty: https://github.com/andrzejlisek/TextPaint
To są tak naprawdę dwa takie same programy w C#, jeden dostosowany do .NET Framework, drugi dostosowany do .NET Core. Część "interfejsowa" to tylko kilka plików (malowanie GUI, zdarzenia GUI, schowek systemowy, odczyt i zapis bitmap), a cała reszta to część "obliczeniowa", w której kody są identyczne w obu programach (ponieważ w tym przypadku, język jest ten sam). Ale załóżmy, że wymyślę sobie, że chciałbym mieć w C++ i Qt, to musiałbym napisać od nowa obie części programu. A potem, jak w części obliczeniowej coś zmienię, to zmiany musiałbym nanosić dwa razy osobno.
Pytanie jest takie: Czy istnieje "język programowania", w którym mogę napisać jakiś fragment programu, a najlepiej klasę obiektu, i ten kod byłby podstawą części obliczeniowej programu? To byłby taki uniwersalny transpilator (konwerter kodu źródłowego na kod źródłowy w innym języku). Jak chce mieć w C#, to robię transpilację do C#, Jak zapragnę mieć w Java, to nie muszę pisać ręcznie, tylko robię transpilację z tego uniwersalnego języka do Java i już mam 80% programu. Jak zapragnę mieć w JavaScript, to transpilacja i już jest.
Oczywiście nie oczekuję konwersji i transpilacji części interfejsowej, bo w każdej technologi obsługa GUI jest tak różna, że nie ma możliwości tego zautomatyzować. Np. chcąc mieć apkę desktopową i webową robiącą to samo, to sposób tworzenia okienka w powiedzmy Qt i sposób tworzenia GUI w HTML+CSS jest zupełnie odmienny i to bym ogarną ręcznie. A częśc obliczeniową to bym napisać w tym "uniwersalnym języku" i automatycznie konwertował do C++ i JavaScript. Potem i tak, większość zmian i ulepszeń jest w części obliczeniowej i wykonywałoby się jednokrotnie.
Ale konwersję klas obliczeniowych to chyba da się zautomatyzować, tym bardziej, że ręcznie da się przerobić niemalże 1:1. Konwerter Java -> C#, czy c#-> Java lub Java->JavaScript to chyba nie jest taka prosta rzecz, ale mając jakiś język uniwersalny, to chyba mógłby istnieć konwerter tego języka na co się chce. Coś na podobnej zasadzie, jak kompilatory GCC, który działa dwuetapowo, że w pierwszym etapie kompiluje program do LLVM, a w drugim etapie konwertuje z LLVM na postać docelową. JRE do Java i CLI do C# robi to samo, czyli konwersja do postaci pośredniej i ostateczna kompilacja w chwili uruchomienia. Jednak konwersja CLI->JRE i JRE->CLI nie jest możliwa.