Якщо у вас проміжний формат, ви можете реалізувати щось, що переводить програму на мову X на цей формат, а також з цього формату на мову Y. Здійсніть ці перетворення на всіх мовах, які вас цікавлять, і ви закінчили, правда?
Ну ви знаєте що? Такий формат вже існує: збірка. Компілятор вже здійснює перетворення "Мова X у збірку", а розбиральники перетворює "Збір на мову Y".
Тепер, збірка не настільки чудова мова для зворотного перетворення, але MSIL насправді не так вже й погано. Завантажте Reflector, і ви побачите, що у нього є варіанти розібрати .NET-збірку на купу різних мов (а плагіни забезпечують ще більше). Тож цілком можливо взяти програму в C #, скласти її до DLL (тобто MSIL), а потім використовувати рефлектор, щоб розібрати її на VB, C ++ / CLI, F # та ще цілу купу інших. Звичайно, всі інші перетворення теж. Візьміть файл F #, компілюйте в DLL, використовуйте Reflector для перетворення його в C #.
Звичайно, дві великі проблеми, які ви знайдете, це:
- Код в основному нечитабельний. MSIL (навіть з інформацією про налагодження) видаляє багато інформації з початкового джерела, тому перекладена версія не має 100% вірності (теоретично виконання конверсії C # -> MSIL-> C # повинно повернути вам початковий код, але це не буде).
- Багато мов .NET мають власні власні бібліотеки (наприклад, бібліотека виконання VB, бібліотека F # тощо). Вони повинні бути включені (або перетворені), коли ви також здійснюєте конверсію.
Тут насправді нічого не можна обійти, але ви, мабуть, могли обійти №1 з додатковими примітками в MSIL (можливо, через атрибути). Це, звичайно, буде додатковою роботою.