Если у вас есть промежуточный формат, то вы могли бы реализовать что-то, что переводит программу на языке X в этот формат, а также из этого формата в язык Y. Выполните эти преобразования для всех языков, которые вас интересуют, и все готово, верно?
Ну знаешь что? Такой формат уже существует: сборка. Компилятор уже выполняет преобразование «Язык X в сборку», а дизассемблеры - в преобразование «Сборка в язык Y».
Теперь ассемблер - не такой уж хороший язык для обратного преобразования, но MSIL на самом деле не так уж и плох. Скачать рефлектор и вы увидите, что у него есть возможность разобрать сборку .NET на несколько языков (а плагины предоставляют еще больше). Таким образом, вполне возможно взять программу на C #, скомпилировать ее в DLL (то есть, MSIL), а затем использовать рефлектор, чтобы разобрать ее на VB, C ++ / CLI, F # и целый ряд других. Конечно, все остальные конверсионные работы тоже. Возьмите файл F #, скомпилируйте в DLL, используйте Reflector, чтобы преобразовать его в C #.
Конечно, вы обнаружите две большие проблемы:
- Код в основном не читается. MSIL (даже с отладочной информацией) удаляет много информации из исходного источника, поэтому переведенная версия не имеет 100% -ной точности (теоретически выполнение преобразования C # -> MSIL-> C # должно вернуть вам исходный код, но это не будет).
- Многие языки .NET имеют свои собственные пользовательские библиотеки (например, библиотека времени выполнения VB, библиотека F # и т. Д.). Они также должны быть включены (или преобразованы), когда вы выполняете конвертацию.
Обойти # 2 действительно нечего, но вы, вероятно, могли бы обойти # 1 с некоторыми дополнительными аннотациями в MSIL (возможно, через атрибуты). Это была бы дополнительная работа, конечно.